ODR Berechnung gibt "wilde" kurve

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
Tomax
User
Beiträge: 31
Registriert: Sonntag 21. August 2016, 08:05

Hallo

Ich benutze das modul odr für eine Polynomberechnung.

Bisher hatte ich immer prima verlaufende Kurven im Definitionsbereich, der vom ersten und letzten Wert eingeschlossen wird.

Code: Alles auswählen

def f(b, x):
    return b[0] * x**5 + b[1] * x**4 + b[2] * x**3 + b[3] * x**2 + b[4] * x + b[5]

modell = Model(f)
data_pump = Data(self.x_init, self.y_init)
odr_pump = ODR(data_pump, modell, beta0=[0., 0., 0., 0., 0., 0.])
Mit diesen Werten läuft alles prima:
xwerte = [2.0, 4.0, 8.0, 10.0, 12.0, 15.0, 17.0, 19.5, 20.75]
ywerte = [6.75, 6.7, 6.5, 6.2, 5.8, 5.0, 4.3, 3.0, 1.7]
Bild

Mit diesen Werten entsteht eine völlig verrückte Kurve:
xwerte = [90.0, 180.0, 360.0, 720.0, 900.0, 1080.0, 1260.0, 1440.0, 1530.0]
ywerte = [79.75, 79.0, 76.0, 70.0, 66.5, 64.0, 58.0, 48.0, 38.0]
Bild

Es handelt sich jeweils um die schwarze gestrichelte Linie.
Weiss jemand, wieso das passiert oder wie ich das verbessern kann?

Danke,

Thomas
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@Tomax: Du legst ein Polynom 5. Grades durch Punkte, die Du eigentlich nur durch ein Polynom 2. Grades approximiert haben willst, und wunderst Dich, dass der Algorithmus ein Polynom 5. Grades findet, das besser passt, als das, das Du erwartest?
Tomax
User
Beiträge: 31
Registriert: Sonntag 21. August 2016, 08:05

@sirius3: Wie kommst du darauf, dass ich ein Polynom 2 Grades möchte? Ich möchte (und bekomme bisher immer) ein polynom 5. Grades und das hat auch immer super geklappt. Nur bei den angesprochenen Wertepaaren kommt eine Kurve raus, die gar nicht durch die Punkte geht.

Interessanterweise gibt ODR bei diesen Werten nur für b[0] - b[4] einen Wert zurück, b[5] ist = 0.
Mit der identischen Berechnung der oberen Wertepaare ergibt sich für b[0] - b[5] ein Wert >0.

"gute Kurve"
http://imgur.com/ijHCCFI

"schlechte Kurve"
http://imgur.com/fec5Yy5
Tomax
User
Beiträge: 31
Registriert: Sonntag 21. August 2016, 08:05

Es scheint mit der Grösse der Werte zusammen zu hängen. Nehme ich 1/10 der Werte, ergibt sich folgende Kurve:

[9.0, 18.0, 36.0, 72.0, 90.0, 108.0, 126.0, 144.0, 153.0]
[79.75, 79.0, 76.0, 70.0, 66.5, 64.0, 58.0, 48.0, 38.0]


http://imgur.com/LoqSMnb
Tomax
User
Beiträge: 31
Registriert: Sonntag 21. August 2016, 08:05

Na ja, da kann wohl keiner helfen.
Ich habe das System jetzt um die Möglichkeit erweitert, den n-ten Grad der Funktion selber zu bestimmen.
Wie ich gesehen habe, besteht ein grösserer Unterschied darin, ob man ein gerades oder ungerades n auswählt.
Interessanterweise hat die angesprochene Wertetabelle mit einer Funktion 4. Grades funktioniert.

na kommt schon, Jungs! Hier ist der Punkt ab dem man mich als wissenschaftlicher Herumprobierer beschimpfen sollte..... Die reine Lehre scheint mir nicht zu liegen.

;-)

Thomas
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@Tomax: woher kommen Deine Punkte? Welchen Verlauf erwartest Du denn? Polynome sind keine gute Wahl zum Fitten von beliebigen Kurven, weil sie dazu tendieren starke Krümmungen zu haben. Wenn es also kein physikalisches Gesetz gibt, wie die Punkte liegen sollten, und Du dieses als Fitfunktion verwenden kannst, solltest Du Dir nach einer anderen Funktion umschauen.
Tomax
User
Beiträge: 31
Registriert: Sonntag 21. August 2016, 08:05

@sirius:
Die Punkte kommen aus einer Pumpenkennlinie, also schon eher aus einer Kombination verschiedener physikalischer Gesetze.
Den Verlauf siehst du gut in den angehängten Beispielen.

Ich habe aber nach der Anpassung auf 4. und 5. Grad keine Ausreisser mehr gehabt.

Thomas
DelphiMarkus
User
Beiträge: 23
Registriert: Samstag 19. April 2008, 13:27
Wohnort: Münsterland

@Tomax:
Wenn dich die Physik hinter den Messpunkten nicht interessiert, warum führst Du dann einen Fit durch? Was willst Du mit den Daten machen, dass Du den Fit benötigst?

Ansonsten ist auch ODR keine Magie, schau mal was passiert, wenn man die Startparameter in Form von "beta0" ändert. Man bekommt damit unterschiedliche Funktionsverläufe. Bei richtiger Wahl der Startparameter findet sich sicherlich auch eine Funktion, die dir besser gefällt, aber die Frage bleibt, ob diese Funktion dann eine besondere Aussagekraft hat (von einem physikalischen Standpunkt gesehen).
Antworten