Schneller und eleganter, um eine rekursive Folge von rationalen Zahlen zu erzeugen [geschlossen]
Ich studiere eine Rekursion unten:
$$B_{N,0}=1$$
$$B_{N,k}=-\binom{N+k}{k}^{-1}\sum_{j=0}^{k-1}\binom{N+k}{j}B_{N,j}$$
Jetzt kann ich nicht gut in Mathematica schreiben. Es ist schon eine Weile her, seit ich es benutzt habe. Also habe ich einige alte Arbeiten nachgeschlagen und bin in Mathematica auf diese Methode gestoßen; Es ist eine "Speicher" -Eigenschaft im Code, oder so erinnere ich mich, dass sie mir beschrieben wurde. Also habe ich es getan und den folgenden Code geschrieben.
B[0]=1
B[k]=B[k_]:=Simplify[-1/(Binomial[N+k,k])*Sum[Binomial[N+k,j]*B[j]],{j,0,k-1}]
Und es funktioniert! Einfach nicht so toll. Also bekomme ich die ersten vier oder fünf ziemlich gut. Dies sind rationale Funktionen in der Variablen$N$. Die ersten 5 sind unten aufgeführt (ich habe Imgur verwendet, sorry)

Aber dann bricht der Code. Ich bin sicher, dass die Rekursion zu schwierig wird, da die erforderliche Berechnung immer umfangreicher wird. Die nächsten beiden Zahlen sind angegeben als (nochmals, Entschuldigung für das Bild)

Und hier ist die Frage. Wie kann ich es bekommen, dass das 6. B [6], das 7. B [7], ..., die k-te Zahl B [k] in der eleganten faktorisierten Form wie in den vorherigen 5 geschrieben oder ausgegeben werden, ohne dieses klobige Binomial Funktion im Nenner? Ich interessiere mich für die Verteilung der Faktorisierung des Nenners.
Antworten
ClearAll[B];
B[k_]:=B[k]=Simplify[FunctionExpand[-1/(Binomial[n+k,k])*Sum[Binomial[n+k,j]*B[j],{j,0,k-1}]]]
Funktioniert gut für mich:
Table[{"B[" <> ToString[k] <> "]=", B[k]}, {k, 0, 7}] // TableForm
![]()
Stellen Sie dies ClearAll[B]
beim Ändern der Definition sicher, da die Werte von zwischengespeichert werden B[k]:=B[k]
. Das Berechnen dauerte B[k]
bis zu k=7
0,02 Sekunden und bis zu k=42
10,7 Sekunden. Das erscheint mir vernünftig.
Ich möchte nur auf den Unterschied zwischen der Definition von OP und der von N0va hinweisen:
Falsche Version
B[k] = B[k_] := <RHS>
Wenn Sie von links nach rechts lesen, ist die erste Zuordnung gleich (Set), während die zweite Zuordnung gleich (SetDelayed) ist. Beachten Sie, dass in der GUI k
blau angezeigt wird (vorausgesetzt, es ist kostenlos). Im Pseudocode:
- Mathematica sieht zuerst
B[k] = <expression1>
und sagt: "Ich werde das Ergebnis sofort auswerten<expression1>
und zuweisenB[k]
." - Mathematica sieht dann
<expression1>
, was istB[k_] := <RHS>
, und sagt: "Ich werde jetzt definieren,B[k_]
zu sein<RHS>
, aber ich werde die Bewertung von verzögern,<RHS>
bis ich einen tatsächlichen Wert von erhaltek
."
Der zweite Schritt kehrt zurück Null
und Null
wird sofort zugewiesen B[k]
. Tatsächlich ist dies dasselbe wie zu tun
B[k_] := <RHS>
B[k] = Null
dh eine nicht gespeicherte Definition, gefolgt von einer sofortigen (aber eher nutzlosen) Zuordnung.
Korrekte Version
B[k_] := B[k] = <RHS>
Wenn Sie von links nach rechts lesen, ist die erste Zuordnung Doppelpunkt-gleich (SetDelayed), während die zweite Zuordnung einfach gleich (Set) ist. Im Pseudocode:
- Mathematica sieht zuerst
B[k_] := <expression2>
und sagt: "Ich werde jetzt definieren,B[k_]
zu sein<expression2>
, aber ich werde die Auswertung von verzögern,<expression2>
bis ich einen tatsächlichen Wert von erhaltek
."
OK, was passiert, wenn ein tatsächlicher Wert von k
empfangen wird?
- Mathematica wertet dann
<expression2>
, was istB[k] = <RHS>
, und sagt : „Ich werde jetzt sofort auswerten<RHS>
und weisen Sie das ErgebnisB[k]
.“ Es ist diese zweite Aufgabe, die das Auswendiglernen erreicht.