Seite 1 von 1
newton raphson verfahren
Verfasst: Freitag 18. Mai 2012, 23:00
von xPae
Guten Abend
ich soll einen code programmieren, der mit einer besonderen Form des Newton Verfahren, konvergenzverhalten p=3, die nullstelle der funtkion f(x)=x^3+4*x^2-15 bestimmt. Der totale Fehler soll bei 10^-12 liegen.
Die Iterationsvorschrift ist x_k+1=x_k-f(x_k+f(x)/f'(x)-f(x))/f'(x) .
Meine erste frage: die definition von xold ist ziemlich unschön, hat da jmd ne bessere idee? bzw ist der code überhautp richtig? =)
Ich sollte zum beispiel auch einstellen können, welche i das programm ausgibt, also quasi if i=1 or 2 or ... then print (i,x), ginge dies einfacher?
Code: Alles auswählen
def f(x): return x**3+4*x**2-15
def df(x): return 3*x**2+8*x
def newton_raphs(x0,f,df):
x=x0
eps=1E-12
xold=x+1
i=0
while (abs(x - xold)>eps):
i=i+1
xold=x
x=xold-(f(xold+f(xold)/df(xold))-f(xold))/df(xold)
print (i,x,f(x), xold)
newton_raphs(-0.9, f, df)
beste grüße und vielen dank
xPae
Re: newton raphson verfahren
Verfasst: Samstag 19. Mai 2012, 00:10
von BlackJack
@xPae: In Deiner Iterationsvorschrift kommen `x_k` und `x` vor, die im Quelltext alle ohne Unterschied zu `xold` werden — soll das so sein‽
Da vor Ausführung der Zeile vor dem ``print`` gilt ``x == xold`` hättest Du in der Zeile auch statt `xold` auf der rechten Seite der Zuweisung `x` verwenden können.
Man könnte die Berechnung der Folge auch vom Rest trennen, in dem man eine Generatorfunktion schreibt, die unendlich viele Elemente der Folge berechnet.
Dann kann man sich mit `tee()` und `izip()` aus dem `itertools`-Modul einen Iterator basteln, der immer ein Element und sein Folgeelement als Paar liefert. Ich glaube da ist in der Dokumention sogar ein Beispiel. Oder zumindest etwas ähnliches. Dazu dann noch ein `enumerate()` um das `i` zu bekommen.
Re: newton raphson verfahren
Verfasst: Samstag 19. Mai 2012, 10:35
von xPae
Hi,
ja das soll so sein, ich habe mich oben leider verschrieben, da müsste überall x_k stehen!
habe jetzt für x old x ersetzt, das "sieht schon einmal" besser aus! ; )
Ich glaube ich würde bei einem solchen einfachen Programm auf eine Generatorfunktion verzichten.. Welche genauen Vorteile würde die mir bringen?
Wie würdet ihr / du das mit dem Ausspuchen von nur bestimmten i's verwirklichen?
if i == 1 or 2 or .. geht ja leider nicht.
Viele Grüße
xpae
Re: newton raphson verfahren
Verfasst: Samstag 19. Mai 2012, 17:51
von BlackJack
@xPae: Ich fände den Code mit einer Generatorfunktion einfach schöner. Einmal weil ich Iteratoren unheimlich mag.

Und kleine, einfache Funktionen sind auch schick. Man könnte `f`, die Ableitung, und die Iterationsvorschrift als einzelne Funktionen implementieren. Und eine `newton_raphson()` formulieren, die unabhängig von den Dreien ist.
Welche `i`\s sollen denn ausgegeben werden?
Ist Dir klar warum ``if i == 1 or 2 or 3:`` nicht geht‽ Also was da in welcher Reihenfolge ausgewertet wird, und was die jeweiligen Teilausdrücke bedeuten und warum die Gesamtbedingung dadurch immer „wahr” wird? ``or`` ist ein binärer Operator, wie ``==`` oder ``+`` und so weiter. Da steht rechts etwas und links etwas und der Operator verbindet die beiden Teilausdrücke und liefert ein Ergebnis. Und es gibt eine Reihenfolge welche Operatoren stärker binden als andere, also vor anderen ausgwertet werden.
Re: newton raphson verfahren
Verfasst: Samstag 19. Mai 2012, 23:10
von xPae
Hey ,
danke für die schnelle Hilfe!
Ich würde sagen, dass er bei einem 'or' , wenn i==1 wahr ist, einfach "weiter" geht. Und die anderen nicht beachtet.
Er soll 1,2,5,10,20 ausgeben. Ich hätte daher es nach:
Allerdings gibt er dann gar nichts bei mir aus. Ich werde mal versuchen mich näher (habs nur kurz überflogen (leider bisher kaum Erfahrung mit programmieren) in einem Tutorial) mit Iteratoren udn Generatoren zu beschäftigen. Hättest Du dafür einen guten Link?
Vielen dank , super Forum
xPae
Re: newton raphson verfahren
Verfasst: Samstag 19. Mai 2012, 23:14
von nomnom
heißt auch: i == 1 und außerdem i == 2 und außerdem ...
Sowas würde man mit „or“ machen:
Du möchtest da aber trotzdem „in“ benutzen: