Forum: Mikrocontroller und Digitale Elektronik Funktion aus Messwerten generieren


von David F. (Firma: Student) (davefirehill)


Angehängte Dateien:

Lesenswert?

Hallo Leute,

Ich habe einen Satz an Messwerten, welche ich benutzen will um eine 
Funktion daraus zu erstellen.
Zuerst wollte ich die Lagrange Interpolation zur Funktionsgenerierung 
benutzen und das hat im Mathematikprogramm Matlab auch zur richtigen 
Funktion geführt. Als ich dann den Code nach C übersetzt hatte und ich 
mit dem Simulator "durchgestept" bin hab ich gemerkt das die Variablen 
zur generierung immer ungenauer wurden (wahrscheinlich Rundungsfehler).
Und da bei einem Polynom 7. Grades schon einiges an Rechenoperationen 
mit teilweise recht großen (und sehr kleinen) Werten zusammenkommen, ist 
das berechnete Polynom dann eher nutzlos für meine Anwendung.

Ich schätze einmal das die µC generell nicht so gut im umgehen mit 
double Variablen sind oder?

Wie würdet ihr an die Sache herangehen? Ich wollte eigentlich keine 
Lookuptabelle verwenden...

Ich habe einmal die Grafik angehängt in der man die zwei Graphen sieht.

von Andreas B. (bitverdreher)


Lesenswert?

Wozu braucht es hier ein Polynom 7.Grades?
2.Grad reicht doch, so wie das aussieht.

Gruß
Andreas

von Karl H. (kbuchegg)


Lesenswert?

Deine Graphik zeigt ganz klar, dass der Grad des Polynoms viel zu hoch 
ist.

> Ich schätze einmal das die µC generell nicht so gut im umgehen mit double 
Variablen sind oder?


Da du AVR Studio angesprochen hast:
Im GCC hast du keine double. Es gibt dort nur float mit 5-6 
signifikanten Stellen (AChtung: signifikant(!), nicht Nachkommastellen).

von John (Gast)


Lesenswert?

Gib mir drei Punkte und ich fitte dir einen Elefanten ...

Vielleicht kann man ja was über den physikalischen Prozess aussagen, der 
den Daten zu Grunde liegt? Dann könnte man nämlich vielleicht mit dem 
potentiell recht einfachen adäquaten Modell fitten und braucht nicht 
einfach ein Polynom draufschmeißen ...

von Henrik V. (henrik_v)


Lesenswert?

Gefühlt 2-3 ordnung sollte reichen

und dann bei der Bereichnung nicht
y=ax³+bx²+cx+d
sondern
y= ((ax+b)x+c)x+d
programmieren

: Bearbeitet durch User
von David F. (Firma: Student) (davefirehill)


Lesenswert?

Danke für das schnelle antworten c:

Ich hab mir zuerst gedacht je höher der grad desto genauer...

Aber jetzt wo ihr es mir vor Augen führt ist es natürlich offensichtlich 
das ich dadurch viel weniger Rechnungen und Rundungsfehler aufsammle

Karl Heinz schrieb:
> Im GCC hast du keine double.

haben µC generell nur float?



Ich werd mal überprüfen ob mit niedrigeren Graden auch passende Graphen 
rauskommen

John schrieb:
> Vielleicht kann man ja was über den physikalischen Prozess aussagen, der
> den Daten zu Grunde liegt?

Ich bestimme die Windgeschwindigkeit anhand einer gemessenen Spannung. 
Mit der Zeit wird allerdings das ganze in einen anderen Bereich driften 
und dann soll es möglich sein das ganze zu eichen, dafür sollte die 
Funktion verändert werden können

von Karl H. (kbuchegg)


Lesenswert?

David Firehill schrieb:
> Danke für das schnelle antworten c:
>
> Ich hab mir zuerst gedacht je höher der grad desto genauer...

Je höher der Grad, desto mehr Kurven (= Wechsel der Krümmung) kann ein 
Polynom haben.

Dein im AVR errechnetes Polynom zeigt das sehr deutlich. Nichts als 
'Richtungsänderungen' wo im Original mit ein bischen Phantasie einfach 
nur ein Abschnitt einer Parabel zu erkennen ist.


> Karl Heinz schrieb:
>> Im GCC hast du keine double.
>
> haben µC generell nur float?

Nein. Nicht generell.
Beim GCC hat man es nur vor langer Zeit als nicht sehr wichtig erachtet, 
8 Byte double einzuführen, weil das meiste sowieso nur mit Integern 
(also ganzen Zahlen) gemacht wird.

> Mit der Zeit wird allerdings das ganze in einen anderen Bereich driften
> und dann soll es möglich sein das ganze zu eichen, dafür sollte die
> Funktion verändert werden können

Nitpicking (daher nicht falsch verstehen).
Du darfst nicht 'eichen'. Das darf nur das Eichamt. Du darfst 
kalibrieren.

> dafür sollte die Funktion verändert werden können

Dafür gibts dann auch noch das Werkzeug der Abschnittweisen 
Interpolation. D.h. anstatt einer einzigen Kurve für alles gibt es 
mehrere Kurven. Wenn von deinem Sensor zb Spannungen zwischen 0 und 10V 
kommen können, dann gibt es eine Kurve, die den Zusammenhang beschreibt, 
wenn die Spannung zwischen 0 und 1V liegt, eine für 1V bis 2V, usw. Der 
Clou an der Sache: diese Kurven können sehr oft einfach nur Geraden 
sein, ohne dass man einen groben Fehler ins System einführt. Und sie 
sind simpel zu berechnen und zu kalibrieren.

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.