newton raphson verfahren

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
xPae
User
Beiträge: 12
Registriert: Freitag 23. März 2012, 10:56

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
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.
xPae
User
Beiträge: 12
Registriert: Freitag 23. März 2012, 10:56

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
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.
xPae
User
Beiträge: 12
Registriert: Freitag 23. März 2012, 10:56

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:

Code: Alles auswählen

if (i==1 and i==2 and ..) 
        print (i,f(x)..)
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
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

Code: Alles auswählen

i==1 and i==2 and ...
heißt auch: i == 1 und außerdem i == 2 und außerdem ...

Sowas würde man mit „or“ machen:

Code: Alles auswählen

i == 1 or i == 2 or ...
Du möchtest da aber trotzdem „in“ benutzen:

Code: Alles auswählen

if i in (1, 2, 5, 10, 20):
    ...
Antworten