Gauß-Legendre-Algorithmus... Problem!

  • Halli hallo, hallöchen.
    Hab dieses Skript:

    [autoit]

    ;Der Gaußsche Algorithmus zur Berechnung der Nachkommastellen von Pi
    #include<array.au3>
    #include<bignum.au3>
    local $a[2]
    local $b[2]
    local $t[2]
    local $p[2]
    $i=0
    $a[0]= 1
    $b[0]= 1/sqrt(2)
    $t[0]= 1/4
    $p[0]=1

    [/autoit][autoit][/autoit][autoit]

    while 1
    $i+=1
    $a[$i] = ($a[$i-1]+$b[$i-1])/2
    $b[$i]= sqrt($a[$i-1]*$b[$i-1])
    $t[$i]= $t[$i-1]-$p[$i-1]*($a[$i-1]-$a[$i])^2
    $p[$i]= 2*$p[$i-1]
    _arrayadd($a, $a[$i])
    _arrayadd($b, $b[$i])
    _arrayadd($t, $t[$i])
    _arrayadd($p, $p[$i])
    Msgbox(0, "", _bignum_div(_bignum_pow((_bignum_add($a[$i-1], $b[$i-1])),2), _bignum_mul(4, $t[$i-1])))
    wend

    [/autoit]

    Erklärt sich glaub von selbst, ansonsten http://en.wikipedia.org/wiki/Gauss%E2%…endre_algorithm
    1. Weiter als 48 Nachkommastellen gehts hier nicht. Sollte ich in dem Fall bignum schon bei den obrigen Variabeln anwenden?
    2.

    Zitat

    2. Repeat the following instructions until the difference of a_n\! and b_n\! is within the desired accuracy:


    Versteh ich eigentlich. Aber wie bitte soll ich das mit ner Do-until-Schleife machen? Was für eine accuracy ist denn gewünscht? So wie ich das seh, gehts mit der while-schleife auch ganz angenehm.

    Irgendwelche Codebeispiele oder fertige Programme will ich net (ich weiß, hört sich komisch an). Möchte alles selber machen, brauche nur nen kleinen Tipp.
    danke,
    billie

    [align=center]Meine Werke mit der Irrlicht Engine
    AutoIt Picture Viewer Dreidimensionaler Bildbetrachter
    Mr Bubble 3D Neue Interpretation des Flashklassikers Bubble trouble

  • Jop, das Problem gabs schonmal. Es liegt vor allem an den großen Zahlen. Deshalb nimm lieder die BigNum UDF


    MfG, campweb

  • Hallo,
    du hattest recht.
    Hab die ersten 2 Variablen mit bignum beschrieben :

    [autoit]

    ;Der Gaußsche Algorithmus zur Berechnung von Pi
    #include<array.au3>
    #include<bignum.au3>
    local $a[2]
    local $b[2]
    local $t[2]
    local $p[2]
    $i=0
    $a[0]= 1
    $b[0]= 1/sqrt(2)
    $t[0]= 1/4
    $p[0]=1

    [/autoit][autoit][/autoit][autoit]

    while 1
    $i+=1
    $a[$i] = _bignum_div(_bignum_add($a[$i-1],$b[$i-1]),2)
    $b[$i]= _bignum_sqrt(_bignum_mul($a[$i-1],$b[$i-1]))
    $t[$i]= $t[$i-1]-$p[$i-1]*($a[$i-1]-$a[$i])^2
    $p[$i]= 2*$p[$i-1]
    _arrayadd($a, $a[$i])
    _arrayadd($b, $b[$i])
    _arrayadd($t, $t[$i])
    _arrayadd($p, $p[$i])
    Msgbox(0, "", _bignum_div(_bignum_pow((_bignum_add($a[$i-1], $b[$i-1])),2), _bignum_mul(4, $t[$i-1])))
    wend

    [/autoit]


    Nur entweder hat die bignum nen fehler, oder ich hab einen reingemacht. Wenn, dann bei $b[$i]. Sieht ihn jemand?
    Edit:

    [autoit]

    $b[$i]= _bignum_sqrt(_bignum_mul($a[$i-1],$b[$i-1]),2)

    [/autoit]

    ist immer noch leicht fehlerhaft =/

    [align=center]Meine Werke mit der Irrlicht Engine
    AutoIt Picture Viewer Dreidimensionaler Bildbetrachter
    Mr Bubble 3D Neue Interpretation des Flashklassikers Bubble trouble

  • Du berechnest immer noch $t[$i] und $o[$i] ohne BigNum. Damit hast du schon wieder Ungenauigkeiten drin.

    Zitat

    Versteh ich eigentlich. Aber wie bitte soll ich das mit ner Do-until-Schleife machen? Was für eine accuracy ist denn gewünscht? So wie ich das seh, gehts mit der while-schleife auch ganz angenehm.


    Du kannst ja nicht bis ins unendliche Rechnen. Irgendwann musst du damit aufhören und durch die Abbruchbedinung der Schleife bestimmst du diesen Zeitpunkt. Die Genauigkeit der Übereinstimmung von a und b gibt dir die Zahl der gültigen berechneten Ziffern von Pi an.

  • Gauß ist jede Menge, Gauß'sches Eliminationsverfahren ist deine Vorstellung (glaub ich). Gauß hat aber auch z.B. die Blur-Matrix erfunden/gefunden.

    PS: Zum Gauß'schen Eliminationsverfahren hätte ich auch noch eine Frage, wer sich damit auskennt meldet sich bitte per PN, danke! :)

  • Gauß hat aber auch z.B. die Blur-Matrix erfunden/gefunden.

    Nicht ganz.
    Die Gauß-Filter heißen nur so da die Gewichte in der Filtermatrix über die Gaußsche Normalverteilung berechnet werden.
    Gauß selbst hat keine linearen Filtermatrizen erfunden.
    Zum ersten mal beschrieben wurde eine Gauß-Filter-Matrix glaube ich 1983 bei Burt und Adelson.

    Einmal editiert, zuletzt von AspirinJunkie (30. Juni 2011 um 23:30)

  • Also ich weiß ja nicht. wenn ich p[$i] und o[$i] mit bignum beschreiben lass, kommt diese tolle zahl raus:

    Zitat


    -4976216652641.8093060830045807941121405391144823947599153088874195305219847587968992246885992733908271016270314108719159240616978117791473469482078501003250964492976115254322867831663265528662338524320949258230439025804719088714412028985185873590368481720783672810825281679448810704404928695551687183818930020206497322938237864021199441524077321419794407809281995168830588914868907768623904398250868965114163476733624646591194734089648642229155185527641550993358677073020894324111071758124048594686121644493737664452041033836765456007322049826279643564990186057102371335009552950583627936674393010675793258432794937262427866785063179866312829838748245807611256508789565713734374144576415845483519540337760191981711393892816320468293104550900825090784754827641590522603356539664821824611291619623558444493049147396041129259389593477316414474520293422964706955916111830898818996315560772856741942535227201884578380248527756345743615843808737205363898090259384505497440737146188164113454963771916526971688798460780815831751050509995505565153047081563110523961675991492543044624449965308287024175197502195804526137347273774314552400311876481158672675461139134167743620505047707207917166988503801073025500048700687025125232824644486511008928048662651398319358880952338328254966283944157011160875378265694904720148782666382771265060747910326279040857868601497388333942082394171182177478102208503811607770512256049723816253852026025825796996136422880958107267056782989602200621771267727235463952006055632

    [autoit]

    $t[$i]= _bignum_mul((_bignum_sub($t[$i-1],$p[$i-1])),(_bignum_pow((_bignum_sub($a[$i-1],$a[$i])),2)))
    $p[$i]= _bignum_mul(2,$p[$i-1])

    [/autoit]


    findet jemand den fehler?

    [align=center]Meine Werke mit der Irrlicht Engine
    AutoIt Picture Viewer Dreidimensionaler Bildbetrachter
    Mr Bubble 3D Neue Interpretation des Flashklassikers Bubble trouble

  • Hi,

    Zitat von stayawayknight

    Ich wundere mich gerade etwas - war der Gauß-Algorythmus nicht ein Algorythmus um Gleichungen in Matrizen lösen zu können?


    Der Gauss-Algorithmus ist in der Tat für Matrizen, aber Gauss war eben, wie oben schon erwähnt, sehr vielseitig.
    Wenn ich also alle Gleichungen eines Systemes untereinanderschreibe, steht dort:
    A*x=l
    (Wobei A die Koeffizientenmatrix, x der Vektor der Unberkannten und l der Lösungsvektor ist)
    Nun eine kleine Nebenrechnung:
    A^(-1)*A*x=A^(-1)*l
    (Linksmultiplikation mit der Inversen von A auf beiden Seiten ist erlaubt(wenn die Determinante<>0 ist))
    Kurze Überlegung:
    A^(-1)*A=E --> Einheitsmatrix, entspricht der 1(um es mal kurz zu formulieren)
    Also ist:
    x=A^(-1)*l
    Wir sehen also, daß das Lösen von Gleichungssystemen durchaus mit Matrizenrechnung zu tun hat bzw. damit auch gelöst werden kann
    Das Gauss'sche Verfahren ist nicht das einzige, doch für alle gilt: die Determinante der Matrix muß <>0 sein, sonst klappt's nicht, auch nicht mit dem Nachbarn^^
    Habe ich nicht mal die Determinantenberechnung von FreeBasic nach AutoIt portiert? Egal, auf http://ytwinky.freebasic-portal.de ist sie bei den QuellCodes zu finden..
    [Edit]
    Jetzt ist die Determinantenberechnung auch mit AutoIt möglich
    Siehe hier
    [/Edit]
    Gruß
    ytwinky

    (Ich) benutze stets die aktuelle (Beta) und SciTE..

    2 Mal editiert, zuletzt von ytwinky (2. Juli 2011 um 19:09) aus folgendem Grund: Link auf das AutoIt-Programm eingefügt