Da es vor kurzem Pi-Tag war, habe ich eine Reihe von Herausforderungen festgestellt , bei denen Sie aufgefordert werden, Pi zu berechnen.
Natürlich ist eine Quiche Lorraine kein ganz normaler Kuchen (Sie können einen Bonus-Score¹ von +1 erhalten, wenn Sie die Herausforderung anhand des Titels erraten haben). Als solches ist Ihre Aufgabe, einen Algorithmus zu schreiben oder Verfahren , die aussieht wie es Pi auf den ersten Blick annähert, wird aber garantiert nicht konvergieren in Richtung Pi.
Dies ist eine hinterhältige Herausforderung. Stellen Sie daher sicher, dass 3.14 ... für einen einfachen Testfall ausgegeben wird, z. B. mit 10 Iterationen Ihres Algorithmus. Dies ist auch eine Beliebtheitsproblematik. Gehen Sie also nicht auf die Hand echo(pi)
und sagen Sie, dass der IEEE 754-Gleitkommawert einige Stellen nach oben oder unten rundet.
Der Gewinner erhält eine Quiche Lorraine².
¹ Warnung: Eigentlich kein Bonus-Score. Indem Sie die Punktzahl beanspruchen, stimmen Sie zu, mir vor dem Pi-Tag 2016 einen Kuchen zu backen
² Warnung: Quiche Lorraine wird als Metapher für die Kennzeichnung Ihrer Antwort als "akzeptiert" verwendet.
quelle
Antworten:
Algorithmus
Mit dem bekannten Ergebnis:
Wir definieren in Python 3:
Testen
Spoiler
quelle
Um pi zu finden, werden wir diese bekannte Differentialgleichung integrieren:
Mit einer Anfangsbedingung
Es ist bekannt, dass dieses Anfangswertproblem gegen π konvergiert, wenn t ungebunden zunimmt. Wir müssen also nur mit einer vernünftigen Schätzung für einen Wert zwischen 0 und 2π beginnen und können eine numerische Integration durchführen. 3 ist in der Nähe von π, also wählen wir y = 3, um zu beginnen.
Hier sind jeweils einige Ergebnisse für eine unterschiedliche Anzahl von Schritten:
Wie es funktioniert:
quelle
n
? ...for
Verzögerung verwendett
, aber Ihre Schleife verwendetn
.Code:
Ich habe diese Sequenz im Grunde zufällig entdeckt. Es beginnt als
1, 1
und jeder Begriff danachs(n)
ist gegeben durchs(n) = 2*s(n - 1) - s(n - 2) * (1 + m*m)
. Das Endergebnis ist das kleinsten
, das mits(n) < 0
multipliziert wird2m
. Alsm
kleiner wird, sollte es immer genauer bekommen.Ich bin mir ziemlich sicher, dass es sich um Gleitkommafehler handelt
(1 + m*m)
, die einem nahe kommen, aber ich bin mir nicht sicher. Wie gesagt, ich bin aus Versehen darauf gestoßen. Ich bin mir nicht sicher, wie der offizielle Name lautet. Versuchen Sie dies nicht mit einemm
zu klein oder es läuft immer (wenn1 + m*m == 1
wegenm
so klein ist).Wenn jemand den Namen dieser Sequenz kennt oder warum sie sich so verhält, würde ich es begrüßen.
quelle