Seite 1 von 1

ODR-Fit mit "sinnvollem" Ergebnis realisieren

Verfasst: Dienstag 29. November 2011, 02:41
von blbltheworm
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.

Re: ODR-Fit mit "sinnvollem" Ergebnis realisieren

Verfasst: Dienstag 29. November 2011, 05:41
von 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]

Re: ODR-Fit mit "sinnvollem" Ergebnis realisieren

Verfasst: Mittwoch 30. November 2011, 02:32
von blbltheworm
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.