2017-10-24 3 views
5

Ich versuche, die Summe dieser Sequenz in R. zu berechnenFunktion der Summe der Sequenz zu berechnen

Die Sequenz zwei Eingänge haben wird (1 und 11) in dem unten stehenden Fall

1 + (1 * 2/3) + (1 * 2/3 * 4/5) + (1 * 2/3 * 4/5 * 6/7) + ....................(1 *......10/11) 

Ich denke, mein eigenes zu definieren ist der Weg dorthin.

+0

diese Sequenz eines beliebigen mathematischen Namen Hat? – amrrs

+1

Fehlt dieser Ausdruck '(1 * 2/3)? – Jimbou

+0

@Jimbou Ja Entschuldigung, habe gerade die Frage aktualisiert. Danke – Sid29

Antwort

5

könnten Sie versuchen, nur mit altmodischen Schleifen hier:

sum <- 0 
num_terms <- 6 
for (i in 1:num_terms) { 
    y <- 1 
    if (i > 1) { 
     for (j in 1:(i-1)) { 
      y <- y * (j*2/(j*2 + 1)) 
     } 
    } 
    sum <- sum + y 
} 

Sie num_terms auf einen beliebigen Wert einstellen können Sie wollen, von 1 auf einen höheren Wert. In diesem Fall verwende ich 6 Begriffe, weil dies die angeforderte Anzahl von Begriffen in Ihrer Frage ist.

Es wird wahrscheinlich jemand kommen und das gesamte Code-Snippet auf eine Zeile reduzieren, aber in meinen Augen ist hier eine explizite Schleife gerechtfertigt.

Hier ist ein Link zu einer Demo, die die Werte druckt in jedem der Begriffe verwendet werden, für die Zwecke der Überprüfung:

Demo

+0

Großartig. Vielen Dank :) – Sid29

3

Mein Ansatz:

# input 
start <- 1 
n <- 5 # number of terms 

end <- start + n*2 

result <- start 
to_add <- start 

for (i in (start + 1):(end-1)) { 
    to_add <- to_add * (i/(i + 1)) 
    result <- result + to_add 
} 

die gibt:

> result 
[1] 4.039755 
+0

Dies kann nicht die gewünschten Ergebnisse geben. Wenn zum Beispiel "start = 1" und "end = 2" sind, wären die Grenzen Ihrer for-Schleife "für (i in 2: 1)". –

+0

Hmm wahr. Ich habe den Code geändert, so dass die Eingabe die Startnummer und die Anzahl der folgenden Begriffe ist – brettljausn

1

Eine andere Basis R Alternative mit cumprod die inneren Bedingungen zu erzeugen, ist

sum(cumprod(c(1, seq(2, 10, 2))/c(1, seq(3, 11, 2)))) 
[1] 3.4329 

Hier c(1, seq(2, 10, 2))/c(1, seq(3, 11, 2)) erzeugt die Folge 1, 2/3, 4/5, 6/7, 8/9, 10/11 und cumprod das kumulative Produkt führen. Dieses Ergebnis wird mit sum summiert. Das zurückgegebene Ergebnis ist identisch mit dem in der angenommenen Antwort.

+0

Das ist ziemlich ähnlich zu meinem Kommentar 'a <- seq (1, 11, 2); Summe (c (1, cumprod ((a-1) [- 1]))/cumprod (a)) ' – Jimbou

+0

@ Jimbou Ja. Ich habe diesen Kommentar gesehen, nachdem ich diese Antwort ausgearbeitet und gepostet habe. Wenn Sie es zu Ihrer Antwort hinzufügen möchten, lassen Sie es mich wissen und ich werde es löschen. – lmo

1

können Sie versuchen:

library(tidyverse) 
Result <- tibble(a=seq(1, 11, 2)) %>% 
    mutate(b=lag(a, default = 0)+1) %>% 
    mutate(Prod=cumprod(b)/cumprod(a)) %>% 
    mutate(Sum=cumsum(Prod)) 
Result 
    # A tibble: 6 x 4 
     a  b  Prod  Sum 
    <dbl> <dbl>  <dbl> <dbl> 
1  1  1 1.0000000 1.000000 
2  3  2 0.6666667 1.666667 
3  5  4 0.5333333 2.200000 
4  7  6 0.4571429 2.657143 
5  9  8 0.4063492 3.063492 
6 11 10 0.3694084 3.432900 

# and some graphical analysis 
Result %>% 
    ggplot(aes(as.factor(a), Prod, group=1)) + 
    geom_col(aes(as.factor(a), Sum), alpha=0.4)+ 
    geom_point() + 
    geom_line() 

enter image description here

Verwandte Themen