Wendepunkt einer Kurve

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
Micha_uni
User
Beiträge: 15
Registriert: Dienstag 23. Mai 2017, 12:14

Hallo liebe Python-Fans!

Ich habe eine Datenmenge(gemessene Punkte), die eine Magnetisierung darstellt. Diese habe ich gegen Temperatur aufgetragen und gefittet.
Nun möchte ich den Wendepunkt der Kurve finden. Ich habe aber keine Funktion, um sie abzuleiten.
Gibt es in Python einen Weg dafür?

LG
Micha
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@Micha_uni: welche Funktion hast Du denn angefittet?
Micha_uni
User
Beiträge: 15
Registriert: Dienstag 23. Mai 2017, 12:14

wie gesagt, keine Funktion. Nur gemessene Punkte gegen Temperatur.
Die Kurve sieht sehr gut aus, weiß nur nicht, wie ich daraus den Wendepunkt raus kriegen kann.
LG
Micha
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@Micha_uni: wenn Du nur Punkte hast, hast Du keine Kurve und auch keinen Wendepunkt. Oben schreibst Du noch, dass Du gefittet hast. Was denn nun?
Benutzeravatar
bwbg
User
Beiträge: 407
Registriert: Mittwoch 23. Januar 2008, 13:35

Beschreibe bitte genau, wie der "Wendepunkt" einer Sequenz von Punkten und "Punkt" definiert sind. Das wäre dann bereits 90% der Lösung.
"Du bist der Messias! Und ich muss es wissen, denn ich bin schon einigen gefolgt!"
Micha_uni
User
Beiträge: 15
Registriert: Dienstag 23. Mai 2017, 12:14

Hallo nochmal!

Ich bin dabei das Ising-Modell über Monte-Carlo Methode zu simulieren. Der Code ist ziemlich lang und kompliziert, deshalb habe ich ihn hier nicht kopiert. Der Code spukt mir dann am Ende einige tausende Punkte(je nach Genauigkeit und Fehlertoleranz kann man die Anzahl der Punkte bestimmen).
Es gibt eine Abhängigkeit von der Temperatur zwar, mein f(T) ist aber keine einfache Funktion, die sich herleiten lässt. f(T) kommt Zustände aus :
1. Spin-Konfigurationen eines Gitters(über random.choice[-1,1] konstruiert)
2. random() für Spinflip
3. exp(-1/T)

Nur das dritte Argument ist analytisch ableitbar.

Wenn man die Punkte gegen T aufträgt und fittet, erhält man eine Kurve, deren Wendepunkt bei T=2,269 liegen soll.
Meine Kurve sieht sehr gut aus und passt zur Theorie. Ich muss aber aus meiner Simulation den Wert berechnen.
Ich dachte, da man nach dem Fitten eine Kurve hat, sollte auch möglich sein, daraus den Wendepunkt zu erhalten.

LG
__deets__
User
Beiträge: 14541
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wenn du gefittet hast, solltest du doch die Koeffezienten zB des Polynoms haben, oder nicht? Das sollte dann doch in sympy uebertragbar sein.

Oder du gehst es numerisch an. Gab's da nicht was von Newton?
Micha_uni
User
Beiträge: 15
Registriert: Dienstag 23. Mai 2017, 12:14

Das Problem liegt daran, dass ich mich mit dem Python nicht genügend gut auskenne.

sciypy war mir zu kompliziert. Ich habe es nicht benutzen können. Stattdessen habe ich polyfit benutzt und deq=3 gesetzt.

Zu meiner Kurve passt eigentlich "Cubic Spline-fitting", weil meine Kurve beleibt bei 1 bis kurz vor Tc, dann fällt schnell runter bis auf null.
Ich weiß aber nicht, wie ich Cubic Spline anwenden kann. Diese ganzen Parameter habe ich ja nicht. bei polyfit habe ich ledeglich das Grad des Polynoms auf 3 gestellt. Es kommt einiger Maßen zufriedenstellend raus.

magnetisierung_f = np.polyfit(T, magnetisierung, 3)
y_magnetisierung_f = np.polyval(magnetisierung_f, T)

Es gibt sicherlich elegantere Wege in Pythone zu fitten. Bin aber blutiger Anfänger im Programmieren.
Hättest du vielleicht ne Idee, aus Datenmengen und nicht aus analytisch ableitbare Funktionen zu fitten?
Danke dir.....
LG
__deets__
User
Beiträge: 14541
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich habe nicht von scipy gesprochen. Du hast doch ein Polynom dritten Grades, und dazu die Koeffizienten. Das ist doch sogar per Hand ableitbar, wenn du das machen willst.

Und mit sympy (was anderes als scipy) kannst du auch Funktionen symbolisch ableiten, und dann zB Nullstellen der Ableitung finden.

http://docs.sympy.org/0.6.7/modules/polynomials.html
http://docs.sympy.org/0.6.7/modules/pol ... .Poly.diff

Damit bekomme ich zB die Nullstellen meines Testpolynoms:

Code: Alles auswählen

from sympy import Poly, roots
from sympy.abc import x, y, z

p = Poly(x**3 + 2*x**2, x)

d = p.diff()
print(d)

print(roots(d))
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@Micha_uni: wenn Du polyfit nimmst, hast Du keine Splines. polyfit gibt Dir einfach die Koeffizienten von a*x^3+b*x^2+c*x+d zurück, und von dieser Funktion solltest Du die Wendepunkte händisch bestimmen können.
Antworten