Newtonverfahren

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
peter.pan
User
Beiträge: 10
Registriert: Dienstag 14. Februar 2017, 11:29

Liebe Foren-Mitglieder,

ich bringe mir gerade Python bei und wollte auf diesem Weg hier eine Frage zum Newtonverfahren stellen, genauer: Wenn ich zwei Funktionen definiert habe, wir kann ich einen Startwert in der For-Schleife waehlen?
Dazu poste ich euch nochmal meinen code:

Code: Alles auswählen

import numpy as np
import matplotlib.patches as mpatches
import matplotlib.pyplot as plt

def f(x):
    return 2*x + 4*x**2 - 3*x**3 - 1

def df(x):
    return 2 + 8*x - 9*x**2

x1 = np.arange(-10,10,0.1)

n=50
x[1]=2
for i in range(1,n):
    x[i+1]=x[i] + f(x)/df(x)
    if df(x) < 0.001:
        break

plt.figure()
plt.plot(x1,f(x1),'-b')
plt.plot(x1,df(x1),'-r')
black_patch = mpatches.Patch(color='black', label='f(x)')
plt.legend(handles=[black_patch])
red_patch = mpatches.Patch(color='red', label='df(x)')
plt.legend(handles=[red_patch])
plt.show()
schon jetzt herzlichen Dank fuer euere Ideen!!
Zuletzt geändert von Anonymous am Dienstag 14. Februar 2017, 12:29, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

ich verstehe die Frage ehrlich gesagt nicht - wo ist denn der Zusammenhand zwischen der Definition von Funktionen und einer for-Schleife, die außerhalb der Funktion eingesetzt wird?

Abgesehen davon ist dein Code so nicht lauffähig - in der Zeile `x[1] = 2` bekommst du einen `NameError`.

Gruß, noisefloor
BlackJack

@peter.pan: Und was hat das mit dem Newtonverfahren zu tun? War das nicht was mit Intervallschachtelung und wo man einen Startwert benötigt von dem aus man sich dem Ergebnis nähern kann? Davon sehe ich in dem Code auch nichts.
peter.pan
User
Beiträge: 10
Registriert: Dienstag 14. Februar 2017, 11:29

hey leute,

genau das ist mein Problem, ich habe die Funktion definiert und die For-Schleife, wei- aber nicht wie ich beides zusammenbringen kann. Das Newton-Verfahren steht in Zeile 16. Ich habe nun das Problem, dass ich den ersten Startpunkt als x_0 da irgendwie rein bekommen muss, der ist ja im ersten Fall x = x_0.

Ich habe mir uebrigens die Aufgabe selbst ausgedacht..Danke schon mal fuer euere Hilfe...Gruss peter.pan
peter.pan
User
Beiträge: 10
Registriert: Dienstag 14. Februar 2017, 11:29

...und ich dachte mit 'x[1] = 2' kann ich den ersten Startwert annehmen...
peter.pan
User
Beiträge: 10
Registriert: Dienstag 14. Februar 2017, 11:29

...ausserdem bekomme ich im debugging-modus angezeigt, dass auch f(x) nicht definiert ist.
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

@peter.pan: Bevor man Variablen benutzen kann, muß man sie definieren, z.B. eine leere Liste `x = []`. Da die Liste aber leer ist, kann man nicht auf beliebige Elemente zugreifen, sondern muß erst welche hineinstecken (z.B. mit `x.append(2)`)
peter.pan
User
Beiträge: 10
Registriert: Dienstag 14. Februar 2017, 11:29

ja, das ist mir klar, daher habe ich in Zeile 14 definiert, kann ich das nicht so machen?... Also wenn ich deinen Rat befolge ist Zeile 14 dann x.append(2)?
peter.pan
User
Beiträge: 10
Registriert: Dienstag 14. Februar 2017, 11:29

@Sirius3:
ich habe deinen Tipp versucht einzubauen, mit x.append(2) wir allerdings immernoch angegeben: name 'x' is not defined.

Aber trotzdem dank Dir!
Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
mit x.append(2) wir allerdings immernoch angegeben: name 'x' is not defined.
Natürlich - solange du nicht x erst definierst - so wie Sirius3 in seinem Post ja auch schreibt - kannst du die Liste auch nicht befüllen, weil nicht existent.

Gruß, noisefloor
peter.pan
User
Beiträge: 10
Registriert: Dienstag 14. Februar 2017, 11:29

aber, wie befuellt man denn dies???

hier eine weiter Idee:

Code: Alles auswählen

def f(x):
    return 2*x + 4*x**2 - 3*x**3 - 1

def df(x):
    return 2 + 8*x - 9*x**2



n=50
x0=2
for val in range(1,n):
    x2 = x0 - f(x0)/df(x0)
    if f(x2) < 0.001:
        break
    x0 = x2
    print('the solution is: ')
    print(x2,f(x2))
Zuletzt geändert von Anonymous am Dienstag 14. Februar 2017, 16:20, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

@peter.pan: Vielleicht solltest Du ein Python-Grundlagentutorial durcharbeiten statt zu versuchen Code zu raten. Das funktioniert nämlich nicht. In der Python-Dokumentation gibt es ein Tutorial.
peter.pan
User
Beiträge: 10
Registriert: Dienstag 14. Februar 2017, 11:29

dann gebt mir doch bitte mal einen Tipp:
ich weiss wie ich funktionen definiere und wie for schleifen funktonieren, aber die verknuepfung ist mir raetzelhaft, daher habe ich das hier gepostet, da hilft auch kein python-buch, dazu habe ich schon zwei durch gearbeitet...
Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

aber du hast offensichtliche Defizite beim Anlegen von Variablen (ink. Listen) und Basis-Operationen mit Listen, wie einfügen von Elementen. Daher rührt auch der Hinweis, mal das Python-Tutorial durchzuarbeiten. Das sind nämlich absolute Grundlagen.

Gruß, noisefloor
peter.pan
User
Beiträge: 10
Registriert: Dienstag 14. Februar 2017, 11:29

das ist echt sehr bedauerlich, dass alle nur auf meine Fehler eingegangen sind und keine konstruktiven Hilfestellung dargelegt haben. Das finde ich schon schade, ich habe mich ja schliesslich angemeldet, da ich beim Durcharbeiten, meines zweiten Python Buches gerne mal ein eigenes Beispiel diskutieren wollte. Daher werde ich mich wieder abmelden, so kann ich dann natuerlich auch fuer das Forum, wenn ich die Sprache "drauf" habe nicht mehr fuer andere zur Verfuegung stehen und helfen...so schnell verliert man user...
Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
und keine konstruktiven Hilfestellung dargelegt haben
Hier im Forum gibt's sehr fundierte Hilfe zur Selbsthilfe. Das ist in deinem Fall nun Mal: lies das offiziellen Python-Tutorial. Grund: siehe oben. Abgesehen davon nützt es ziemlich wenig, wenn man einem Nutzer eine fertige Lösung auf dem Silbertablett präsentiert. Weil: kein Lerneffekt und ein hohes "Risiko", dass die gleichen Fehler in der Zukunft wieder gemacht werden.

Mal so rein Interesse halber: welche beiden Python-Bücher hast du gelesen?

Gruß, noisefloor
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

@peter.pan: wie kann ich Dir konkreter mit Beispiel helfen, als zu sagen, dass man Variablen definieren muß, bevor man sie verwenden kann. Und zwar mit `x = []`. Danach kommen natürlich noch ein paar Folgefehler, mit denen ich Dich selber nochmal wurschteln lassen wollte.

Dein zweiter Ansatz kommt ja ohne Listen aus. Da hättest Du schreiben können, warum Du bei der Idee nicht weiterkommst, dass zum Beispiel gar nichts ausgegeben wird. Ohne das ›break‹ wird das ziemlich schnell klar:

Code: Alles auswählen

1.7222222222222223 -1.0159465020576128
1.629158420507021 -0.0971819778841585
1.6181825492978994 -0.0012805329745138039
1.6180340157917228 -2.330474018208406e-07
1.6180339887498956 -5.329070518200751e-15
Der Funktionswert ist am Anfang negativ. Also auch kleiner als 0.001. Abhilfe schafft da die Betrags-Funktion ›abs‹.
peter.pan
User
Beiträge: 10
Registriert: Dienstag 14. Februar 2017, 11:29

liebe Nutzer,

ihr braucht mir nicht mehr helfen, ich habs selbst geloest...

@ noisefloor: Ich will doch gar keine fertige Loesung geboten bekommen, ich will nur tipps, dass ich selbst drauf komme, und mich dann auf Einstiegsliteratur zu verweisen ist schon ganz schoen einfach und loest das Problem nicht...uebrigens habe ich python 101 and python intensive durch gearbeitet.

@Sirius3: Herzlichen Dank fuer dein Hilfeangebot, in der Zwischenzeit habe ich alles hingekommen, auch mit dem break, danke Dir.
Antworten