Nicht-Lineare Interpolation

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
phischmi
User
Beiträge: 34
Registriert: Dienstag 12. Juli 2016, 06:08

Hallo zusammen,
ich habe einige Wertepaare ermittelt und möchte nun innerhalb dieser Daten weitere Werte interpolieren.
Die X-Werte entsprechen dabei Prozentwerten von 0-100%.
Die Y-Werte habe ich zu fünf X-Werten ermittelt. Die Wertepaare sehen wie folgt aus.

X / Y
0 / 0
25 / 350
50 / 450
75 / 650
100 / 950

Nun möchte ich weitere Y-Werte zu gegebenen X-Werte interpolieren, also z.B. 10%, 40% etc.

Meine Frage nun, wie stelle ich das am elegantesten an?
Gibt es hierzu eine passende Funktion in Python, welche die Y-Werte berechnen kann?
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich bin da nicht der groesste Experte hier, aber fuer ein "fitting" (das muesste das sein, was du suchst) gibt es zwar viele Moeglichkeiten. Nur ob dir das was hilft, also einen Fehler hat, der kleiner als "nur" linear interpolieren - das kann man so gar nicht sagen. Da solltest du noch ein paar mehr Messungen machen, insbesondere an den Raendern sieht es ja so aus, als ob da grosse Aenderungen stattfinden.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@phischmi: es gibt zwar nur eine Art, linear zu interpolieren, aber viele, das nicht-linear zu tun. Die Frage ist nur, was Du willst. Wenn hinter Deinen Werten ein physikalischer Prozess steht, wäre es am besten, die zugehörige Formel anzufitten. Gerne genommen werden Splines, weil die so schön glatte Kurven machen, aber sonst wenig mit Messungen zu tun haben. Schaut man sich die Punkte an, sieht man, dass sich zwischen 0% und 50% die Krümmung ändert. Soll das so sein, oder ist der Wert bei 0% oder 25% falsch?
phischmi
User
Beiträge: 34
Registriert: Dienstag 12. Juli 2016, 06:08

Moin,
danke für eure Antworten :)
Ich bin gestern noch auf die Funktion interp1d() gestoßen, die grundsätzlich ja schon mal genau das macht, was ich zu erreichen versuche.

Zur näheren Erklärung:
Bei den y-Werten handelt es sich um die Schritte, welche ein Stepper-Motor stellen muss, um einen definierten Gasfluss (0-100%) an einem Nadelventil einzustellen. Das dürfte die großen Änderungen an den Rändern erklären..
Mehr bzw. genauere Messungen machen keinen Sinn, da ich nur ein analoges Manometer zur Verfügung habe, um den Gasdruck zu messen.

Hätte mir damals mal jemand gesagt, wozu ne Kurvendiskussion so nützlich sein kann... :roll:
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Im Grunde weisst du also nicht, was das Ergebnis sein wird, weil der Verlauf so schon hoch nicht-linear und schwer messbar ist. Alles andere als lineare Interpolation ist da mE mathematisches Globuli einwerfen, aber sowas soll ja ungemein beruhigen :twisted:
phischmi
User
Beiträge: 34
Registriert: Dienstag 12. Juli 2016, 06:08

So mache ich nun auch und interpoliere zwischen den Messpunkten linear - klappt mit interp1d() ja prima :)
Danke für eure Hilfe!
PeterOpa
User
Beiträge: 6
Registriert: Montag 31. Juli 2017, 20:44

Vermutlich hast du dies zustande bekommen"
Bild

Ich denke das ein Polynom dritten Grades geeignet ist. Bin dabei es mit machinelearning (tensorflow) zu probieren
die beste nichtlineare interpolation zu finden :)
PeterOpa
User
Beiträge: 6
Registriert: Montag 31. Juli 2017, 20:44

Durch die gegebenen Punkt kann man ein Polyom 4.ten Grades legen. Das ergibt dann:

Bild

Unten stehen die 5 coefficienten von niedrig nach hoch :)
PeterOpa
User
Beiträge: 6
Registriert: Montag 31. Juli 2017, 20:44

Das Resultat wenn man noch mehr Punkte hat z.B. dicht bei 0 (etwa 10) und dann ein Polynom höheren Grades durch die gegebenen Punkte
legt, ist SEHR STARK abhängig von den extra Werten (y Werkt bei etwa 10, zu klein ==> schlecht, groß genug => redlich bis gut)

Übrigens, das ganze hab ich als Python-Notebook fix und fertig, welches durch alle gegebenen Punkte ein Polynom legt.
(Grafik müsste man noch etwas anpassen, ist für DIESEN Fall angepasst).

Wer es haben will, muss mich probieren zu erreichen zum 'upload'
Mit Anaconda3 hab ich sympy, mathplotlib und numpy ohne Schwierigkeiten auf W10 installieren koennen. Die Bibliotheken werden
nämlich benutzt.
Vermutlich kann man auch ohne sympy auskommen (ist aber naeher an wie man es evtl. mal gelernt hat):
A*x = b aufloesen nach x wird sympy.linsolve((M,b),vars) mit vars eine Liste von Variablen.

Beispiel (A|b) wurde:

Code: Alles auswählen

[a,
 a + 25*b + 625*c + 15625*d + 390625*e - 350,
 a + 50*b + 2500*c + 125000*d + 6250000*e - 450,
 a + 75*b + 5625*c + 421875*d + 31640625*e - 650,
 a + 100*b + 10000*c + 1000000*d + 100000000*e - 950]
Antworten