Schneller und eleganter, um eine rekursive Folge von rationalen Zahlen zu erzeugen [geschlossen]

Nov 24 2020

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

10 N0va Nov 24 2020 at 10:08
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=70,02 Sekunden und bis zu k=4210,7 Sekunden. Das erscheint mir vernünftig.

6 yawnoc Nov 24 2020 at 20:54

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 kblau angezeigt wird (vorausgesetzt, es ist kostenlos). Im Pseudocode:

  1. Mathematica sieht zuerst B[k] = <expression1>und sagt: "Ich werde das Ergebnis sofort auswerten <expression1>und zuweisen B[k]."
  2. Mathematica sieht dann <expression1>, was ist B[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 erhalte k."

Der zweite Schritt kehrt zurück Nullund Nullwird 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:

  1. 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 erhalte k."

OK, was passiert, wenn ein tatsächlicher Wert von kempfangen wird?

  1. Mathematica wertet dann <expression2>, was ist B[k] = <RHS>, und sagt : „Ich werde jetzt sofort auswerten <RHS> und weisen Sie das Ergebnis B[k].“ Es ist diese zweite Aufgabe, die das Auswendiglernen erreicht.