Seite 1 von 1

Funtionen in neuen Funktionen verwenden

Verfasst: Samstag 20. November 2010, 19:27
von fragensteller
Hallo,
ich möchte das Newtonverfahren programmieren und habe ein Problem damit Python zu sagen, dass es eine Funtion verwenden soll die ich angebe.
Hier mein Ansatz:

Code: Alles auswählen

def newton(x0, itmax,g):
    x_n1=x0
    for i in range (1, itmax):
        x_n1=x_n1-(g(x_n1)/dg(x_n1))
    end
Hierbei ist itmax die Anzahl der Iterationen, x0 der Startwert und g die Funktion deren Nullstelle ich bestimmen möchte.
Ich möchte bei newton(1,10,x³) eine Annäherung der Nullstelle 0 erhalten, aber Python gibt mir eine Fehlermeldung, dass ich g falsch angegeben habe. Ich habe auch schon diverse andere Schreibweisen wie g(), g=(), g(x),... ausprobiert.
Vielleicht kann mir jemand sagen wie man es richtig macht.

Vielen dank

Re: Funtionen in neuen Funktionen verwenden

Verfasst: Samstag 20. November 2010, 19:48
von numerix
1. Fehlermeldungen posten.
2. Im Prinzip ist das schon richtig so, aber was soll das "end"?
3. Das Ergebnis müsste wohl auch zurückgeliefert werden ...

Re: Funtionen in neuen Funktionen verwenden

Verfasst: Samstag 20. November 2010, 19:48
von Darii
fragensteller hat geschrieben:Ich möchte bei newton(1,10,x³) eine Annäherung der Nullstelle 0 erhalten, aber Python gibt mir eine Fehlermeldung, dass ich g falsch angegeben habe. Ich habe auch schon diverse andere Schreibweisen wie g(), g=(), g(x),... ausprobiert.
Vielleicht kann mir jemand sagen wie man es richtig macht.
Du machst es richtig, indem du die exakte Fehlermeldung hier reinschreibst, inklusive des Codes der nicht funktioniert. Ich habe nicht die geringste Lust darüber nachzudenken, was die eigentliche Fehlermeldung gewesen sein könnte und wo du versucht haben könntest g(), g=(), g(x) hinzuschreiben.

Re: Funtionen in neuen Funktionen verwenden

Verfasst: Sonntag 21. November 2010, 02:27
von hendrikS
g übergibst Du als Parameter und dg nicht. Finde ich inkonsistent. Ich würde entweder beide als Parameter oder keine von beiden als Parameter übergeben.
Wie rufst Du Deine Funktionen newton denn auf?
Und wie sieht die Definition der zu übergebenden Funktion g denn aus?

Re: Funtionen in neuen Funktionen verwenden

Verfasst: Sonntag 21. November 2010, 17:40
von fragensteller
ok,
erstmal danke für die Antworten.
Dann mache ich das jetzt mal besser:

Code: Alles auswählen

def g(x):
    return(x*x)
def newton(x0, itmax):
    x_n1=x0
    for i in range (itmax):
        x_n1=x_n1-(g(x_n1)/dg(x_n1))
       
print g

print "newton(%x0,%itmax)=", x_n1
Das ist mein Code und

Code: Alles auswählen

<function g at 0x021D1B30>
newton(%x0,%itmax)=

Traceback (most recent call last):
  File "C:\Python26\Newton", line 10, in <module>
    print "newton(%x0,%itmax)=", x_n1
NameError: name 'x_n1' is not defined
das ist die Fehlermeldung.
Ich glaube ich habe das jetzt schon soweit angepasst, dass ihm nur noch dg fehlt. Daher meine Frage: Gebt es da nicht irgendwo so Funktionenmodule die man runterladen kann? Die Ableitung müsste ja ziemlich gebräuchlich sein. ich habe da auch schon mal gesucht, bin aber etwas überfordert welche Version ich jetzt nehmen muss und warum.
Es wäre nett wenn mir nochmal jemand helfen könnte.

der fragensteller

Re: Funtionen in neuen Funktionen verwenden

Verfasst: Sonntag 21. November 2010, 18:05
von hendrikS
Oh hier sind noch jede Menge elementare Fehler. Ich vermute, daß gleich jemand auf das Tutorial verweisen wird.
Du rufst newton gar nicht auf. x_nl ist nur lokal in der Funktion newton bekannt und führt deshalb zur Ausnahme. Ein Aufruf von newton sollte so aussehen:

Code: Alles auswählen

print newton(2,1000)
Ach ja. Die Ableitung von x*x ist 2*x. Wozu brauchst Du da ein extra Modul?

Re: Funtionen in neuen Funktionen verwenden

Verfasst: Sonntag 21. November 2010, 22:29
von Darii
fragensteller hat geschrieben:Ich glaube ich habe das jetzt schon soweit angepasst, dass ihm nur noch dg fehlt. Daher meine Frage: Gebt es da nicht irgendwo so Funktionenmodule die man runterladen kann? Die Ableitung müsste ja ziemlich gebräuchlich sein.
Nein, Ableitungen sind nicht gebräuchlich. Python ist kein CAS. Es gibt zwar z.B. sympy, das symbolisch rechnen und Ableitungen bilden kann, aber vermutlich ist es am einfachsten die Ableitung selbst mit (g(x+∆x)-g(x-∆x))/2∆x, ∆x ≪ 1 anzunähern.

Re: Funtionen in neuen Funktionen verwenden

Verfasst: Montag 22. November 2010, 15:58
von nomnom
fragensteller hat geschrieben:

Code: Alles auswählen

def g(x):
    return(x*x)
Wozu brauchst du eine Funktion um x² zu rechnen? ;)

EDIT: Was ist überhaupt `dg` und was tut es?

Re: Funtionen in neuen Funktionen verwenden

Verfasst: Montag 22. November 2010, 16:05
von EyDu
nomnom hat geschrieben:Wozu brauchst du eine Funktion um x² zu rechnen? ;)
Um diese an eine Funktion, hier das Newton-Verfahren, weitergeben zu können.
nomnom hat geschrieben:EDIT: Was ist überhaupt `dg` und was tut es?
Das ist ganz offensichtlich die Ableitung von g.

Re: Funtionen in neuen Funktionen verwenden

Verfasst: Montag 22. November 2010, 16:48
von numerix
nomnom hat geschrieben:EDIT: Was ist überhaupt `dg` und was tut es?
http://de.wikipedia.org/wiki/Newtonverfahren

Re: Funtionen in neuen Funktionen verwenden

Verfasst: Mittwoch 24. November 2010, 00:20
von fragensteller
:D Ich brauche kein Programm um die Ableitung von x^2 zu berechnen, das ist nur eine Beispielfunktion die ich ändern werde, sobald ich das programm verwenden möchte. :D
Trotzdem vielen Dank für die vielen Antworten.

Re: Funtionen in neuen Funktionen verwenden

Verfasst: Mittwoch 24. November 2010, 00:27
von fragensteller
nochmal vielen dank,
so, ich habe es jetzt nochmal angepasst, jetzt gibt mir python keine Fehler mehr an.
Allerdings läuft das Programm nicht. Eigentlich sollte es mich doch fragen welchen Startwert ich nehmen möchte oder nicht? Oder muss ich ihm da auch erstmal eine for oder if-schleife davorsetzen, damit er mich das fragt?

Code: Alles auswählen

print "Startwert eingeben:"
d=input("Schrittweite für Ableitung eingeben:")
print "Anzahl Iterationen eingeben:"
x0=input("Startwert eingeben:")
print "Schrittweite für Ableitung eingeben:"
itmax=input("Anzahl Iterationen eingeben:")

def g(x):
    return(x*x)
def dg(x,d):
    (g(x+d)-g(x-d))/2*d
def newton(x0, itmax):
    x_n1=x0
    for i in range (itmax):
        x_n1=x_n1-(g(x_n1)/dg(x_n1))
       
print "newton(%x0,%itmax)="%(x0,itmax), x_n1

Re: Funtionen in neuen Funktionen verwenden

Verfasst: Mittwoch 24. November 2010, 00:36
von hendrikS
fragensteller hat geschrieben:so, ich habe es jetzt nochmal angepasst, jetzt gibt mir python keine Fehler mehr an.
Allerdings läuft das Programm nicht.
Du hast die Tips von oben nicht gelesen. Du rufst newton immer noch nicht auf. Ebenso erwartet dg einen zweiten Parameter.
Deine Funktion g ist doch zur Laufzeit unverändert. Also ist auch die Ableitung immer gleich. Also ich würde die Ableitung direkt in dg aufschreiben. Du kannst zu jeder Funktion eine Ableitung finden. Da numerisch anzunähern ist irgendwie suboptimal.

Re: Funtionen in neuen Funktionen verwenden

Verfasst: Mittwoch 24. November 2010, 00:51
von EyDu
fragensteller hat geschrieben:Oder muss ich ihm da auch erstmal eine for oder if-schleife davorsetzen, damit er mich das fragt?
Immer wieder allseits beliebt.
hendrikS hat geschrieben:Du kannst zu jeder Funktion eine Ableitung finden
Abgesehen von den offensichtlichen Fällen wie Unstetigkeit, möchtest du dich vielleicht noch einmal kurz mit Herrn Weierstrass unterhalten ;-)

Re: Funtionen in neuen Funktionen verwenden

Verfasst: Mittwoch 24. November 2010, 01:32
von hendrikS
EyDu hat geschrieben:Abgesehen von den offensichtlichen Fällen wie Unstetigkeit, möchtest du dich vielleicht noch einmal kurz mit Herrn Weierstrass unterhalten ;-)
Differenzierbarkeit mal vorausgesetzt. Sonst funktioniert das Newton Verfahren auch nicht.

Re: Funtionen in neuen Funktionen verwenden

Verfasst: Mittwoch 24. November 2010, 01:42
von Shaldy
Hallo!

Als erstes will ich dir dieses wunderbare Openbook ans Herz legen.

Code: Alles auswählen

print "Startwert eingeben:"
d=input("Schrittweite für Ableitung eingeben:")
print "Anzahl Iterationen eingeben:"
x0=input("Startwert eingeben:")
print "Schrittweite für Ableitung eingeben:"
itmax=input("Anzahl Iterationen eingeben:")
Da musst du dich schon entscheiden. Entweder

Code: Alles auswählen

print "Startwert eingeben:",
start = input()
oder

Code: Alles auswählen

start = input("Startwert eingeben: ")
abgesehen von den oben bereits erwähnten Programmmängeln läuft es deshalb nicht so wie du willst, weil du die Funktion immernoch nicht aufrufst.
Bei

Code: Alles auswählen

def func(p1, p2):
    .....
passiert nichts. Erst wenn du die Funktion aufrufst

Code: Alles auswählen

func(3, 1001)
wird an dieser Stelle im Programm das Ergebnis zurückgeliefert.

Falls du später im Programm nur Polynome als Funktionen verwenden solltest würde ich dir empfehlen einfach die Koeffizienten in einer Liste zu speichern und dafür dann Funktionen wie
berechne(liste, x)
ableitung(liste, n)
zu schreiben.

Re: Funtionen in neuen Funktionen verwenden

Verfasst: Mittwoch 24. November 2010, 09:05
von /me
Shaldy hat geschrieben:Als erstes will ich dir dieses wunderbare Openbook ans Herz legen.
"Wunderbar" ist der falsche Ausdruck. "Wundersam" trifft es schon eher.

Hier mal ein Lesehinweis zum genannten Werk: http://bj.spline.de/python_openbook.html.

Re: Funtionen in neuen Funktionen verwenden

Verfasst: Mittwoch 24. November 2010, 14:58
von Dauerbaustelle