ODR-Fit mit "sinnvollem" Ergebnis realisieren

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
blbltheworm
User
Beiträge: 10
Registriert: Samstag 12. November 2011, 00:29

Hallo zusammen,

ich schlage mich erst seit ein paar Wochen mit Python rum und habe leider auch nicht viel Ahnung von Numerik.
Ich hoffe daher einfach mal, dass dieser Eintrag nicht unnötig ist und die Lösung offensichtlich (zumindest haben meine Recherchen nichts ergeben, wobei ich auch nicht so genau wusste wonach suchen).

Aber zum Kern der Sache:

Ich habe Messwerte, die ich gerne fitten würde. Dafür verwende ich momentan scipy und das odr-Modul. Passt wunderbar bis auf eine Sache. Ich fitte ein Polynom 2. Ordnung und dabei sind nur Ergebnisse physikalisch sinnvoll mit Koeffizienten kleiner Null. Jetzt kann es natürlich sein, dass mathematisch aber ein Polynom mit einem oder mehreren Koeffizienten größer Null besser passt. Kann ich da irgendwas dagegen tun?

Meine momentane Fitfunktion sieht in etwa so aus (wobei ich noch nicht alle Details verstanden habe):

Code: Alles auswählen

import numpy
import scipy
import scipy.odr

def cumfit(x, y):
    #Startwerte
    betanull = 1.0
    betaeins = 2.0
    betazwei = 0.25
    xStandardAbweichung = 0.5
    yStandardAbweichung = 0.5
    coeffs = numpy.zeros((2,2),float)
    
    PolynomZweiter = scipy.odr.Model(lambda B,x: B[2]*x*x+ B[1]*x + B[0])
    inODRDaten = scipy.odr.RealData(x, y, sx=xStandardAbweichung, sy=yStandardAbweichung)
    ODRDaten = scipy.odr.ODR(inODRDaten, PolynomZweiter, beta0=[betanull, betaeins, betazwei])
    ausODRDaten = ODRDaten.run()

    for i in range(2): #fuer weitere Berechnungen wird nur B[0] und B[1] benoetigt
        coeffs[i,0] = ausODRDaten.beta[i]
        coeffs[i,1] = ausODRDaten.sd_beta[i]
    return coeffs
Vielen Dank schon mal für jeden konstruktiven Beitrag.
Zuletzt geändert von Anonymous am Dienstag 29. November 2011, 04:53, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
BlackJack

@blbltheworm: Vorweg: Ich habe Null Ahnung was `odr` ist/macht. Soweit ich das verstanden habe sucht das Parameter die im Zusammenhang mit der Model-Funktion die Daten annähern!? Dann müsste man doch (falls es keinen anderen, einfacheren Weg gibt) bei Parametern die einem so gar nicht gefallen, doch ein Ergebnis zurück geben können, das weit von den Daten abweicht. Und dann halt hoffen dass der Algorithmus bessere findet. Also zum Beispiel:

Code: Alles auswählen

    def fit_function(bs, x):
        return numpy.nan if max(bs) >= 0 else bs[2] * x**2 + bs[1] * x + bs[0]
blbltheworm
User
Beiträge: 10
Registriert: Samstag 12. November 2011, 00:29

Hi,

danke für die doch naheliegende Antwort. Ich sehe schon, ich habe die lambda-Geschichte noch nicht ganz durchschaut.

Auf jeden Fall funktioniert es jetzt, nochmal danke.

PS: Das nächste mal werde ich selber die richtigen Code-Tags setzen, sorry.
Antworten