Newton Iteration

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

BlackJack hat geschrieben:Häh? :K
Erst schlägst Du vor er soll den Algorithmus erst verstehen bevor er ihn implementiert, dann sagst Du es geht auch ohne Verständnis (wenn man fremden Quelltext nimmt).
Justifiez hat geschrieben:Ok, inwieweit verändert denn das math.exp(x) die letztendliche Lösung? Kann man das überhaupt in einer Zahl ausdrücken?
Ja
korrekte Lösung: x=sqrt(7)
um wieviel verändert math.exp(x) den Funktionswert an dieser Stelle?
Um: math.exp( sqrt(7) )
und das ist recht viel, wenn man Nullstellen sucht.
Justifiez hat geschrieben:Heißt das math.exp(x) , das in die Nullstellenberechnung jedesmal ein e^x einfließt?
Du definierst die Funktion, die Du an Newton übergibst und alles was in dieser Funktion drin steht beeinflusst die Lösung. Warum sollte Newton da was weglassen?
a fool with a tool is still a fool, www.magben.de, YouTube
BlackJack

@MagBen: Das eine ist was man machen sollte, das zweite ist was gemacht wurde und da gehört noch der Satz davor dazu:
BlackJack hat geschrieben:Ich sehe nicht das er da irgendeinen Algorithmus *selbst* implementiert hat. Fremden Quelltext hernehmen und an einer Stelle eine Funktion ändern kann man auch ohne vorher verstanden zu haben was der Rest macht.
Justifiez
User
Beiträge: 13
Registriert: Montag 26. Mai 2014, 19:48

Ah, gut, ok.
Das macht natürlich Sinn. Dann macht es auch umso mehr Sinn, das der Fehler kleiner wird, je größer der Anstieg (oder Stauchung) ist.

Cool, danke.

Ich habe mir jetzt mal den Fehler durch math.exp() ausgegeben. Und zumindest bei linearen Funktionen kann man den Fehler auf die ungefähre Nullstelle addieren und kommt dann auf den richtigen Wert:

Code: Alles auswählen

def F(x):
    f = math.exp(x) + x + 2
    df = math.exp(x) + 1
    return (f, df)
Weiter unten im Code steht dann:

Code: Alles auswählen

 print ("-" * 10)
    print(str(math.exp(x)))
    print("Ungefähre Nullstelle:" + str(x))
    print ("-" * 10)
Ausgabe:

Code: Alles auswählen

Iteration Nr.:       Root value:     Value of f(x):
I    0:              -1.50000000,       0.72313016
I    1:              -2.09121276,       0.03232446
I    2:              -2.11998303,       0.00005064
I    3:              -2.12002824,       0.00000000
----------
0.12002823900078922
Ungefähre Nullstelle:-2.1200282388781004
Für quadratische Gleichungen funktioniert das dann leider nicht mehr:

Code: Alles auswählen

def F(x):
    f = math.exp(x) + x**2 - 4
    df = math.exp(x) + 2*x
    return (f, df)
Ausgabe:

Code: Alles auswählen

Iteration Nr.:       Root value:     Value of f(x):
I    0:              3.00000000,       25.08553692
I    1:              2.03833542,       7.83262949
I    2:              1.37198323,       1.82550114
I    3:              1.09899598,       0.20894346
I    4:              1.05880792,       0.00400649
I    5:              1.05800671,       0.00000157
I    6:              1.05800640,       0.00000000
----------
2.880622455251378
Ungefähre Nullstelle:1.0580064010906844
----------
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

Ich würde math.exp lieber weglassen und die Null-Division abfangen anstatt den Fehler abzuschätzen, den Du selbst eingebaut hast.

Quick-and-Dirty-Lösung:
Verschieb einfach den Startwert, wenn eine Null-Division auftritt.
a fool with a tool is still a fool, www.magben.de, YouTube
Antworten