Funtionen in neuen Funktionen verwenden

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.
Antworten
fragensteller
User
Beiträge: 5
Registriert: Samstag 20. November 2010, 19:09

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
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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 ...
Zuletzt geändert von numerix am Samstag 20. November 2010, 19:48, insgesamt 1-mal geändert.
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

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.
Benutzeravatar
hendrikS
User
Beiträge: 420
Registriert: Mittwoch 24. Dezember 2008, 22:44
Wohnort: Leipzig

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?
fragensteller
User
Beiträge: 5
Registriert: Samstag 20. November 2010, 19:09

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
Benutzeravatar
hendrikS
User
Beiträge: 420
Registriert: Mittwoch 24. Dezember 2008, 22:44
Wohnort: Leipzig

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?
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

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.
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

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?
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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.
Das Leben ist wie ein Tennisball.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

nomnom hat geschrieben:EDIT: Was ist überhaupt `dg` und was tut es?
http://de.wikipedia.org/wiki/Newtonverfahren
fragensteller
User
Beiträge: 5
Registriert: Samstag 20. November 2010, 19:09

: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.
fragensteller
User
Beiträge: 5
Registriert: Samstag 20. November 2010, 19:09

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
Benutzeravatar
hendrikS
User
Beiträge: 420
Registriert: Mittwoch 24. Dezember 2008, 22:44
Wohnort: Leipzig

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.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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 ;-)
Das Leben ist wie ein Tennisball.
Benutzeravatar
hendrikS
User
Beiträge: 420
Registriert: Mittwoch 24. Dezember 2008, 22:44
Wohnort: Leipzig

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.
Shaldy
User
Beiträge: 123
Registriert: Sonntag 2. März 2008, 22:49

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.
Dies ist keine Signatur!
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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.
Antworten