Nicht linearer mehrdimensionaler Gleichungslöser nach Newton

  • Hallo Zusammen,

    wer wollte nicht schon immer mal nichtlineare mehrdimensionale Gleichungen nummerisch lösen? ;)

    Weil ich es manchmal beruflich benötige, habe ich mir mit AU3 eine relativ einfache Lösung gebastelt, diese ist evtl. auch für andere Leute brauchbar, denn wenn man es ein wenig aufhübscht könnte man so etwas wie den M$ Excel Solver damit programmieren.

    Hier ein Beispiel Programm:

    [autoit]

    #include "solver01.au3"

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

    ; Weitere Infos unter http://de.wikipedia.org/wiki/Newton-Ve…hrdimensionalen

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

    ; Gleichungssystem 1 aus "fa1.csv"
    ; x1^2-2*x2=10
    ; sin(x1)+4*x2=20;
    dim $a[1][1], $b[1][1], $x[1][1], $D[1][1]
    csv2Fmatrix("fa1.csv",$a,$b)
    erzeuge0Matrix($x,$a[1][0],1)
    ; Startwerte für Iteration
    $x[1][1]=10
    $x[2][1]=10
    ; Mehrdimensionale Lösung nach Newton
    $x=solverM($a,$b,$x,1E-3,200,1E-5)
    _arraydisplay($x, "Eine Lösung für x1=$x[1][1], x2=$x[2][1]")
    ; Probe
    msgbox(0,"x1^2-2*x2=10",$x[1][1]^2-2*$x[2][1]&"=10")
    msgbox(0,"sin(x1)+4*x2=20",sin($x[1][1])+4*$x[2][1]&"=20")

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

    ; Gleichungssystem 2 aus "fa2.csv"
    ; x1/x3+2*x2+x3=10
    ; x1+4*x2+x3*x1=5
    ; x1^2+x2+x3=1
    dim $a[1][1], $b[1][1], $x[1][1], $D[1][1]
    csv2Fmatrix("fa2.csv",$a,$b)
    erzeuge0Matrix($x,$a[1][0],1)
    ; Startwerte für Iteration
    $x[1][1]=1
    $x[2][1]=1
    $x[3][1]=1
    ; Mehrdimensionale Lösung nach Newton
    $x=solverM($a,$b,$x,1E-3,200,1E-6)
    _arraydisplay($x, "Eine Lösung für x1=$x[1][1], x2=$x[2][1], x3=$x[3][1]")
    msgbox(0,"x1/x3+2*x2+x3=10",$x[1][1]/$x[3][1]-2*$x[2][1]+$x[3][1]&"=10")
    msgbox(0,"x1+4*x2+x3*x1=5",$x[1][1]+4*$x[2][1]+$x[3][1]*$x[1][1]&"=5")
    msgbox(0,"x1^2+x2+x3=1",$x[1][1]^2+$x[2][1]+$x[3][1]&"=1")

    [/autoit]

    Alles weiter (die benötigten units und die csv Beispiel Dateien) im Anhang!

    Bei der Nutzung bitte beachten:
    - Lösung muss vollständig im Bereich der Reellen-Zahlen liegen!!!
    - Es wird immer nur eine Lösung gefunden
    - Diese Lösung kann je nach Startwert verschieden sein

    Weitere Infos unter
    http://de.wikipedia.org/wiki/Newton-Ve…hrdimensionalen

    Gruß
    uuchip

  • Bekomme leider folgende Fehlermeldung:

    Code
    matrix00.au3(54,24) : ERROR: NumLn(): undefined function.
       $m = NumLn($filename)

    Wenn man nur den solver nutzt wird diese Funktion nicht gebraucht( oder doch???). Evtl. tritt der Fehler auf wenn man die anderen Funktionen aus matrix00.au3 nutzen will? Bitte durch "$m=_FileCountLines($filename)" ersetzen.

    Können auch überbestimmte Systeme damit gelöst werden?


    In der jetzigen Form leider nicht, weil für jeden Iterationsschritt die inverse Jacobi- Matrix schnöde nach Gauß berechnet wird. Daraus folgt n Unbekannte benötigen nun mal genau n Gleichungen.
    Gruß
    uuchip

  • Das Newton-Verfahren hat den Nachteil, daß bei bestimmten Funktionen (beispielsweise Spiralen, trigonometrischen Funktionen) eine Lösung sehr weit vom Startpunkt entfernt gefunden wird (wenn überhaupt....). Wenn es dumm läuft, konvergiert die Folge nicht, oder schlimmer, oszilliert, und dann gilt es, neue Startpunkte zu finden....

    Meistens braucht man ja (alle) Lösungen innerhalb eines bestimmten Intervalls, da bietet sich dann die schnöde Intervallteilung an, bzw das schrittweise "ablaufen" der x-Achse mit kleinen Schritten und Suche nach Nulldurchgang zwischen y(n) und y(n+1) mit anschließender Intervallteilung.
    Da werden (mit Bezug auf die gewählte Schrittweite) dann auch "alle" Nullstellen gefunden, bei hyperbolischen Spiralen steigt dieses Verfahren natürlich auch irgendwann aus^^

    Jedenfalls macht es Sinn, den Funktionsverlauf grafisch darzustellen, wenn man überhaupt keine Ahnung hat, wie die Funktion überhaupt aussieht. Dann vermeidet man auch Aussagen wie "keine Nullstelle im Intervall", nur weil der Rechner keine gefunden hat :D