Funktion einer Kurve ermitteln: Fit. Du willst aber vmtl. ein optimales Polynom:


[ FMSO.DE - Fahren mit Salatöl (deutsch) ]


Geschrieben von Ulrich extra vergine am 21. Oktober 2014 21:24:20:

Als Antwort auf: Funktion einer Kurve ermitteln ... geschrieben von waldi am 15. Oktober 2014 21:50:30:

Hi,


vom Prinzip her würde ich eine Ausgleichsrechnung (Kurven-Fit oder MMSE-Approximation, Regression o.ä. genannt) machen, wenn eine bekannte Funktion - z.B. eine e-Funktion vorliegt.

Variante I: Systematisches Verändern der Parameter, bis die Summe der Fehlerquadrate (Differenz aus Messwert und approximiertem Wert zum Quadrat) minimal wird.

Variante II: Wenn die zu ermittelnden Parameter nur linear eingehen (meist der Fall; die Funktion selbst muss nicht linear sein; nur in den zu ermittelnden Parametern), dann kommt eine exakte Lösung mittels Normalengleichung in Frage.

Dazu löst man das System der Normalengleichungen (Letztlich bekommt man das über das Nullsetzen des Gradienten der Fehlerfunktion):

A transponiert A x = A transponiert b

wobei x die gesuchten Parameter sind, A eine Matrix die die Summenterme der Linearkombinatin (also die Regressionsfunktion ohne Koeffizienten) an verschiedenen Messpunkten jeweils in den Spalten enthält, und b sind die Messwerte.

(Herleitung und Erklärung:
http://de.wikiversity.org/wiki/Kurs:Numerik_I/4_Lineare_Ausgleichsrechnung )

*****

Das Problem dabei ist auf Mikrocontrollern eher, dass die Bibliotheksfunktionen für die e-Funktion nicht unbedingt besonders Code- und Zeiteffizient sind.

Besser ist es, da häufig, einen Kurven-FIT mit einem Chebyshev-Polynom zu machen.

Letztlich berechnet nämlich auch die Mathe-Standardbibliothek die e-Funktion nicht anders, da kann man also besser gleich ein individuell passendes Polynom für die Messwerte bauen.

==> Das ist zwingend die effizienteste Variante, sofern man nicht mit einer ganz groben Wertetabelle mit Interpolation auskommt.

==> Sogar eine einfache Wertetabelle mit Interpolation ist häufig aufwändiger!


Das Gute dabei ist - das mit dem Chebychev-Fit muss man gar nicht selber machen, das gibt es schon fertig.


Wenn Du Python installiert hast, sind das nur eine Handvoll Zeilen. Hier ein Beispiel, wie man den Sinus wischen Null und Pi/2 mit einem Polynom fünften Grades annähert:

>>> import cheby
>>> import numpy as np
>>> import math
>>> c = cheby.Cheby.fit(np.sin,0,math.pi/2,5)
>>> c

Ist also in der Praxis trivial einfach.
Wenn man keine Funktion hat, sondern Messwerte, hat numpy die Funktion:

numpy.polynomial.chebyshev.chebfit()

Beispiel und Erklärung siehe:
http://www.embeddedrelated.com/showarticle/152.php


Gruß,
Ulrich

Wie lesenswert findest Du diesen Beitrag?                 Info zur Bewertung




Antworten:


[ FMSO.DE - Fahren mit Salatöl (deutsch) ]