Pi berechnen

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von Higlav.

    Ich wollte mir mal in 'nem Miniprogramm pi berechnen. Ich hab versucht, das über Annäherung des Umfangs machen aber irgendwie ist noch ein Fehler drin.
    Bitte schaut das mal durch:

    VB.NET-Quellcode

    1. ​Public Class Form1
    2. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    3. Dim radius As Double = 7 'Radius festlegen
    4. Dim zahl_kreisteile As Integer = 64 '≙ Winkel von 5,625°
    5. Dim kreisteil As Double = Math.Sqrt(radius * radius + radius * radius - 2 * radius * radius * Math.Cos(5.625)) 'eine Seitenlänge bestimmen
    6. Dim Umfang_Näherung As Double = zahl_kreisteile * kreisteil 'Umfang mit allen Strecken annähren
    7. Dim pi As Double = (Umfang_Näherung / radius) / 2 'Pi durch umgestellte Formel berechnen
    8. MessageBox.Show(pi) 'Ausgabe von Pi
    9. End Sub
    10. End Class


    So weit ich das überblicken kann ist der Fehler im "kreisteil"

    Marceliboy schrieb:

    Fehler
    Der Winkel muss im Bogenmaß angegeben werden.
    Allerdings steckst Du dann Pi rein. ;(
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Marceliboy schrieb:

    Fehler
    Setz mal radius auf 1 und schmeiß die Variable raus.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Damit du das Problem umgehen kannst, muss bei deinem n-Eck n = 6 * 2^x mit x = 0, 1, 2, 3... sein. Warum ? Momentan brauchst du zur Berechnung der des Teilumfangs den Kosinussatz, dafür das Bogenmaß. Fängst du mit nem 6-eck an, ist diese Seite automatisch gleich dem Radius (mach ne Skizze, ist so). Halbierst du jz die Seiten (also 6eck zu 12eck, 12 zu 24, 24 zu 48) dann kannst du diese Seite immer wieder mit dem Pythagoras ausrechnen, und brauchst keine Trigonometrie.
    »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais
    *Finger und Nacken knacken lassen*

    Hallo miteinander,

    Für die Berechnung von Pi gibt es viele Möglichkeiten. Ich habe mich vor etwa 2 Jahren damit beschäftigt und ein paar Dinger herausgefunden:
    Selbst erarbeitete Lösungen

    Kreisformel 1
    Nehmen wir mal die Pythagoreische Formel
    $c^2=a^2+b^2$
    . Jetzt ersetzen wir
    $c$
    mit dem Radius
    $r$
    ,
    $a$
    mit
    $x$
    und
    $b$
    mit
    $y$
    . Dann für die Funktion nach
    $y^2$
    auflösen und los geht's:
    \begin{align} y^2 &= r^2-x^2\\ f(x)&=\sqrt{r^2-x^2}\\ r \to 1\\ f(x)&=\sqrt{1-x^2}\\ \text{Daraus folgt:}&\\ V_{\text{Halbeinheitskreis}}&=\int_{-1}^1f(dx) =\tfrac\pi2\\ &=\int_{-1}^1\sqrt{1-x^2}dx\\ &=2\cdot\int_0^1\sqrt{1-x^2}dx\\ &=2\cdot\left[\frac{\arcsin(x)}{2}+\frac{x\cdot\sqrt{1-{x}^{2}}}{2}\right]_0^1\\ &=2\cdot\frac{\arcsin{(1)}+1\cdot\sqrt{1-1^2}}2+\frac{\arcsin{(0)}+0\cdot\sqrt{1-0^2}}2\\ &=2\cdot\frac{\arcsin{(1)}+\sqrt{1-1^2}}2+\frac{\arcsin{(0)}}2\\ &=2\cdot\frac{\arcsin{(1)}+\sqrt{1-1}}2\\ &=\frac{2\cdot\arcsin{(1)}}2\\ &=\arcsin{(1)}\\ \pi&=2\cdot\arcsin{(1)} \end{align}

    Ok, das sieht doch schonmal ziemlich hübsch aus. Jetzt gibt's da aber noch ein Problem:
    $\arcsin{(1)}$
    ist immernoch eine Funktion, die aufgerufen wird. Ergo müssen wir diese auch noch auflösen. Hierzu benutzen wir die entsprechende Taylorentwicklung(and der Entwicklungsstelle 1):
    \begin{align} \pi&=2\cdot\sum_{k=0}^\infty\frac{(2k)!}{4^k\cdot(k!)^2\cdot(2k+1)}\cdot x^{2k+1}\\ x\to1&\\ &=2\cdot\sum_{k=0}^\infty\frac{(2k)!}{4^k\cdot(k!)^2\cdot(2k+1)}\cdot 1^{2k+1}\\ \pi&=2\cdot\sum_{k=0}^\infty\frac{(2k)!}{4^k\cdot(k!)^2\cdot(2k+1)} \end{align}

    Problem: Dauert ewig, bis die Reihe konvergiert. Schlechter Algorithmus.


    Riehmannintegral
    Nehmen wir wieder den Viertelkreis und rechnen wir das ganze mal mit dem Riehmannintegral:
    \begin{align} \lim_{n \to 0}&\left(\pi=4\cdot\int_0^{1}f_{Viertelkreis}(x)dx\right) \end{align}

    Nun iterieren wir in Minimalschritten von
    $0$
    bis
    $1$
    und rechnen dann das Rechteck hinzu.
    \begin{align} \lim_{n \to 0}&\left(\pi=4\cdot\sum_{k=0}^{\tfrac1n}n\cdot\sqrt{1-(kn)^2}\right) \end{align}

    Daraus nehmen wir jetzt die Formel:
    \begin{align} \pi(n)&=4n\cdot\sum_{k=0}^{\tfrac1n}\sqrt{1-(kn)^2} \end{align}

    für die Berechnung von Pi mit angegebener Auflösung(
    $0<n\leq1$
    ).\\
    Wir erhalten beispielsweise mit einer Auflösung von
    $n=0.001$
    (also 1000 Iterationen) ein Resultat von
    $\pi=3.143555467$
    . Diese Methode ist also auch nicht zufriedenstellend.


    Kreisformel 2
    Ich wollte ja anfangs
    $\pi$
    dadurch berechnen, dass ich
    $\pi=2\arcsin{(1)}$
    gerechnet habe. Mir ist noch ein etwas schönerer Weg in den Sinn gekommen: Anstatt dem grenzwertigen
    $\pi=3\arcsin{(1)}$
    rechne ich einfach
    $\pi=6\arcsin{(0.5)}$
    , da bei 30 Grad der Sinus genau 0.5 beträgt.
    Also dann: Weiter geht's!
    \begin{align} \pi&=2\cdot\sum_{k=0}^\infty\frac{(2k)!}{4^k\cdot(k!)^2\cdot(2k+1)}\cdot x^{2k+1}\\ x\to0.5&\\ \pi&=6\cdot\sum_{k=0}^\infty\frac{(2k)!}{4^k\cdot(k!)^2\cdot(2k+1)}\cdot 0.5^{2k+1}\end{align}

    Wenn wir nun diese Formel nachbauen(in Excel beispielsweise), dann erhalten wir ein erstaunlich präzises Ergebnis. Mit einem Inkrement bei der 100sten Iteration von
    $3.5419\cdot10^{-64}$
    erhalten wir Pi bis auf die 64-ste Stelle genau. Diese Methode ergibt nach nur 11 Iterationen ein Resultat von
    $\pi=3,141592654$
    .



    Andere Lösungen

    Leibiz
    Gottfried Willhelm Leibniz fand 1682 eine interessante Reihenentwicklung, die
    $\pi$
    approximierte:
    \begin{align} \frac\pi4&=\sum_{n=0}^{\infty} \frac{(-1)^n}{2n+1}\\ \pi_{Leibniz}&=4\cdot\sum_{n=0}^{\infty} \frac{(-1)^n}{2n+1} \end{align}

    Man möge jedoch beachten, dass diese Reihenentwicklung in Indien schon seit dem 15. Jahrhundert mehr oder minder bekannt war.
    Diese Reihe hat bei der 100sten Iteration noch wechselnde Werte im Grössenbereich von
    $5\cdot10^{-3}$
    und kommt bei besagter Iteration auf eine Approximation von
    $\pi=3.151493401$
    .
    Ohne angeben zu wollen: Meine selbsthergeleitete Reihenentwicklung ist da genauer.


    Ramanujan
    Der berühmte Inder, der sich seine Grund-Mathematikkenntnisse autodidaktisch aus einem Grundschulbuch beibrachte(Danke, "Good Will Hunting"), fand 1914 die Reihenentwicklung:
    \begin{align} \frac{1}{\pi} &= \frac{2\sqrt{2}}{9801} \cdot\sum_{n=0}^{\infty} \frac{(4 n)! \cdot (1103+26390 n)}{(n!)^{4} \cdot 396^{4 n}}\\ \frac1\pi&=\frac{2\sqrt{2}\cdot\sum_{n=0}^{\infty} \frac{(4 n)! \cdot (1103+26390 n)}{(n!)^{4} \cdot 396^{4 n}}}{9801}\\ \pi_{Ramanujan}&=\frac{9801}{2\sqrt{2}\cdot\sum_{n=0}^{\infty} \frac{(4 n)! \cdot (1103+26390 n)}{(n!)^{4} \cdot 396^{4 n}}} \end{align}

    Diese Formel ist zu überprüfen; Bei meinem Versuch bekam ich falsche Werte, konnte den Fehler aber nie finden(habe aber ehrlich gesagt auch nicht sonderlich heftig danach gesucht).


    Bailey-Borwein-Plouffe-Reihenentwicklung(-en)
    Die drei Herren haben eine sehr praktische und performante BBP-Reihe entwickelt:
    \begin{align} \pi_{BBP_1} &= \sum_{k = 0}^{\infty} \frac{1}{16^k}\left( \frac{4}{8k + 1} - \frac{2}{8k + 4} - \frac{1}{8k + 5} - \frac{1}{8k + 6}\right)\\ \pi_{BBP_1}(n) &= \sum_{k = 0}^{n} \frac{1}{16^k}\left( \frac{4}{8k + 1} - \frac{2}{8k + 4} - \frac{1}{8k + 5} - \frac{1}{8k + 6}\right) \end{align}

    Diese Reihe hat den Vorteil, dass man mit ihr präzis bestimmte Stellen in Pi berechnen kann, ohne, dass alle vorigen Schritte mitgerechnet werden müssen. bei der 100sten Iteration erzielt diese Formel ein ungefähren Fehler von
    $1.471\cdot10^{-124}+\varepsilon_{k=101+}$
    und kommt somit nach 100 Iterationen der Reihe zum Resultat
    $\pi_{BBP_1}(99)=3.141592654$
    .

    Es wurden später noch weitere BBP-Reihen gefunden:
    \begin{align} \pi_{BBP_2} &= \frac12\sum_{k=0}^{\infty}\frac1{16^k}\left(\frac8{8k+2} + \frac4{8k+3} + \frac4{8k+4} - \frac1{8k+7}\right)\\ \pi_{BBP_2}(n) &= \frac12\sum_{k=0}^{n}\frac1{16^k}\left(\frac8{8k+2} + \frac4{8k+3} + \frac4{8k+4} - \frac1{8k+7}\right) \end{align}

    Nach 100 Iterationen:
    $\pi_{BBP_2}(99)=3.141592654$

    Resultat für
    $k=99$
    :
    $1.1699\cdot10^{-121}$


    \begin{align} \pi_{BBP_3} &= \frac14\sum_{k=0}^{\infty}\frac1{16^k}\left(\frac8{8k+1} + \frac8{8k+2} + \frac4{8k+3} - \frac2{8k+5} - \frac2{8k+6} - \frac1{8k+7}\right)\\ \pi_{BBP_3}(n) &= \frac14\sum_{k=0}^{n}\frac1{16^k}\left(\frac8{8k+1} + \frac8{8k+2} + \frac4{8k+3} - \frac2{8k+5} - \frac2{8k+6} - \frac1{8k+7}\right) \end{align}

    Nach 100 Iterationen:
    $\pi_{BBP_3}(99)=3.141592654$

    Resultat für
    $k=99$
    :
    $1.173\cdot10^{-121}$


    \begin{align} \pi_{BBP_4} &= \;\;\sum_{k=0}^{\infty}\frac{(-1)^k}{4^k}\left(\frac2{4k+1} + \frac2{4k+2} + \frac1{4k+3}\right)\\ \pi_{BBP_4}(n) &= \;\;\sum_{k=0}^{n}\frac{(-1)^k}{4^k}\left(\frac2{4k+1} + \frac2{4k+2} + \frac1{4k+3}\right) \end{align}

    Nach 100 Iterationen:
    $\pi_{BBP_4}(99)=3.141592654$

    Resultat für
    $k=99$
    :
    $-3.1287\cdot10^{-62}$


    Chudnovsky-Reihe
    Die Chudnovsky-Brüder machten sich schon früh einen Namen, als sie Pi auf mehrere Hundert Millionen Stellen berechnet haben. Später erhöhten sie bis auf über Zwei Milliarden. Dafür haben sie(nebst ihrem selbstgebastelten Supercomputer mit locker 2 Gigaflops) einen eigenen Algorithmus geschrieben:
    \begin{align} \frac{1}{\pi} &= 12\cdot\sum^\infty_{k=0} \frac{(-1)^k\cdot(6k)!\cdot(163\cdot 3344418k + 13591409)}{(3k)!(k!)^3\cdot640320^{3k + \frac32}}\\ \pi_{Chudnovsky} &= \frac1{12}\cdot\sum^\infty_{k=0} \frac{(-1)^k\cdot(6k)!\cdot(545140134k + 13591409)}{(3k)!\cdot(k!)^3\cdot640320^{3k + \frac32}} \end{align}

    Leider versagt Excel beim Nachbau, wie auch schon bei der Ramanujan'schen Entwicklung(Ach ja! DAS war der Grund, weshalb ich so eklige Fehler bekam! Jetzt weiss ich's wieder!).


    Puh. Ich hoffe, es klappt alles mit den Formeln und so. :D
    Hier gibt's noch 'nen Wiki-Artikel dazu.