Forum: Mikrocontroller und Digitale Elektronik Gleichung aufstellen?


von Mink (Gast)


Lesenswert?

Hallo zusammen,

für eine Mikrocontrollerbasierte Anwendung versuche ich gerade eine 
Gleichnung aufzustellen. Dabei habe ich im Prinzip zwei Variablen:

Batteriespanung = batt
Position = po

Die beiden Positionen sind wiederum von der Batteriespannung abhängig. 
Hier mal meine Meßergebnisse:

batt | po_min - po_max
232  |   71   -   149
229  |   71   -   147
227  |   70   -   145
:         :        :
:         :        :
:         :        :
193  |   60   -   125

Nun möchte ich eine Formel aufstellen, die Anhand der Batteriespannung 
einer Variablen den Wert 190 bei po_max und den Wert 90 bei po_min 
zuweist. Die Zwischenwerte sind natürlich auch noch von Interesse.

Leider komme ich auf keinen Lösungsansatz mit den unterschiedlichen 
Batteriespannungen.

Bei einer konstanten Batteriespannung kann ich das ganze folgendermaßen 
berechnen:

149x + b = 190
71x  + b = 90

Gleichsetzungsverfahren:

x = 1,28
b = -1


Hat vielleicht jemand ne Idee wie ich die verschiedenen Werte bei 
unterschiedlichen Batteriespannungen in ein Formel einbringen kann? Ist 
das überhaupt möglich?


Vielen Dank und Gruß,
Mink

von Jan M. (mueschel)


Lesenswert?

Schon gut der Ansatz:

>149x + b = 190
>71x  + b = 90

71 ist ja gerade po_min(batt=232) und 149 po_max(batt=232)


Also:

>po_min(batt)*x + b = 190
>po_max(batt)*x  + b = 90


Dann brauchst du nur noch eine Formel fuer po_min(batt) und po_max(batt) 
(auch wieder was lineares nehme ich an), setzt es ein und loest wieder 
auf. Dann hast du eine Funktion die von batt und po abhaengt.

von Mink (Gast)


Lesenswert?

Danke für die schnelle Antwort.

Versteh ich noch nicht ganz, aber ich werd mich mal dransetzen.

von Jan M. (mueschel)


Lesenswert?

Die 149 und 71 sind ja Abhaengig von batt. Finde also zuerst eine 
Funktion, die dir die jeweiligen min/max-Werte ausspuckt wenn du batt 
hineinsteckst.



PS: Koennte es dir eventuell die Rechnerei sparen, wenn du die 
Batteriespannung (oder eine davon abgeleitete Spannung) als ADC_ref 
nimmst und nicht die interne Referenz?

von Yob (Gast)


Lesenswert?

Hi, wieviele Probemesswerte hast du denn?

Poste diese bitte mal damit man besser abschätzen kann um welche 
Fiunktion es sich hierbei handelt.

Grüße Yob.

von analog (Gast)


Lesenswert?

zieh 100 ab und multipliziere mit 1.1

von Gast (Gast)


Lesenswert?

>Nun möchte ich eine Formel aufstellen, die Anhand der Batteriespannung
>einer Variablen den Wert 190 bei po_max und den Wert 90 bei po_min
>zuweist.

Dieser Satz ist unverständlich.

von Wolfgang S. (wsm)


Lesenswert?

po_min = batt*11/39 + 5,56

po_max = batt*24/39 + 6,23

Gruß

Wolfgang

von Michael H* (Gast)


Lesenswert?

was du suchst ist eine sogenannte interpolation zu gegebenen 
stützstellen.
da gibt es nun mehrere verschiedene. z.b. polynominterpolation, die dann 
um deine gegebenen stützstellen "schwingt". wenn du hier iterativ 
vorgehst, also deine vorhandenen stützstellen interpolierst, dann deine 
erhaltene funktion zu wertepaare diskretisierst, zwischen deinen 
stützstellen mittelst und erneut interpolierst, und damit wieder von 
vorn beginnst, bekommst du nach ein paar durchläufen je nach 
quantisierung eine recht genaue funktion. je nach anzahl der messpunkte 
kannst du da evtl auch einfach einmalig ein hochgradiges polynom 
ansetzen.
dabei sagt keiner, dass die funktion schön ist, aber dafür musst du z.b. 
zur verarbeitung nur die polynomkoeffizienten speichern.

nachtrag: ich bin immer wieder von der qualität der wikipedia-artikel 
begeistert: http://de.wikipedia.org/wiki/Interpolation

grüße,
holli

von Mink (Gast)


Lesenswert?

Hallo,

erst einmal vielen Dank für die ganzen Antworten!

Das mit der Interpolation hab ich mir auch mal angeschaut, komm da aber 
auf keinen grünen Zweig.

Den Ansatz von wolfgang hab ich nun auch hinbekommen:

Steht also:

po_min = batt*11/39 + 5,56

po_max = batt*24/39 + 6,23


Nun weiß ich aber nicht wie ich weiter vorgehen muss, um auf ne Funktion 
zu kommen die von batt und po abhaengt.

von ... (Gast)


Lesenswert?

Das ist wirklich gar nicht so einfach. Interpolation ist eigentlich auch 
nicht das richtige Stichwort. Es geht vielmehr darum, eine Funktion mit 
der Methode des genauen hinschauens zu finden und die Parameter dann 
nach der Methode der kleinsten Fehlerquadrate anzupassen. D.h. du 
brauchst auf alle Fälle erstmal viel mehr Messwerte als freie Parameter 
bei deiner (noch zu ermittelnden) Funktion. Dann solltest du die in 
einem Diagramm (mit z.B. Excel) darstellen. Wenn du dir den Zusammenhang 
der Größen nicht physikalisch herleiten kannst, dann musst du dir die 
Kurve genau anschauen. Ist es ein linearer Zusammenhang, quadratisch, 
eine e-Funktion?
Wenn ich dich richtig verstanden habe, dann willst du erstmal zwei 
Funktionen haben, po_min(batt) und po_max(batt), um dann zwischen diesen 
beiden Werten zu interpolieren. Also mach ein Diagramm, wo du po_max und 
po_min auf der y-Achse hast und batt auf der x-Achse und zeig uns das 
hier mal. Wenn der Zusammenhang linear ist, dann bestimme einfach die 
Regressionsgerade. Wenn der Zusammenhang nichtlinear ist, aber durch ein 
Polynom dargestellt werden kann, dann wird die Bestimmung der Parameter 
auch nicht zu kompliziert. (Stichwort Polynomfitting) Wichtig ist, das 
der Grad des Polynoms nicht zu hoch wird. Wenn du z.B. eine 
Newton-Interpolation nehmen würdest, dann würde das Polynom zwar durch 
alle Punkte exakt durch gehen, die Zwischenwerte wären aber absolut 
nutzlos, weil sie sonstwo liegen, nur nicht dort wo du sie erwartest. 
Also ein Polynom 2. oder 3. Grades sollte hoffentlich reichen.

von Mink (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

Im Anhang das Diagramm!


Gruß,Mink

von ... (Gast)


Lesenswert?

Ok, das sieht ziemlich linear aus. Also kannst du jetzt entweder mit 
Excel oder per Hand eine Regressionsgerade für po_min(batt) und 
po_max(batt) berechnen. (Guck mal in einem Mathebuch deiner Wahl oder 
bei google/Wikipedia für die Formeln. Ist im Prinzip ganz einfach, nur 
ein paar Summen bilden und dividieren.)
Mit diesen beiden Funktionen kannst du ja für ein batt die 
enstprechenden po_min und po_max Werte ausrechnen und dann dazwischen 
linear interpolieren, wie du es oben bei der konstanten Batteriespannung 
gemacht hast.

von Mink (Gast)


Lesenswert?

Aber ist es dann nicht das selbe was wir schon haben? Siehe Oben!

>>po_min = batt*11/39 + 5,56

>>po_max = batt*24/39 + 6,23


Die beiden Formeln passen für die min und max Werte schon optimal. Im 
Prinzip müsste ich doch jetzt folgendes machen:

po(po_min(batt))*x +b = 90
po(po_max(batt))*x +b = 190

=>

f(x)= (po(batt))*x +b


Nur ich weiß nicht wie...;-) Mist, hätte ich der Schule mal besser 
aufgepasst!

von ... (Gast)


Lesenswert?

Du hast doch gar nicht alle Messwerte gepostet? Oder hab ich was 
übersehen? Deshalb kann Wolfgang die Koeefizienten doch nur für die paar 
Werte berechnet haben, die du oben mitgeschickt hattest. Du solltest die 
Geraden nochmal für alle deine Werte berechnen und da Wolfgang sich 
ziemlich kurz gefasst hat, wollte ich das nochmal so beschreiben, das du 
es slebst machen kannst.
Wenn du die beiden Geraden hast, dann ist es doch ganz einfach eine 
"große" Formel draus zu machen, wobei das nicht unbedingt sinnvoll ist.

Du hast doch po_min(batt) und po_max(batt). Nimm das erstmal als 
konstant an und rechne das mit Variablen durch, also so hier:

f(po) = a * po + b

Gleichungen:

190 = a * po_max + b
90 = a * po_min + b

Lösung:

a = 100 / (po_max - po_min)
b = -100 * po_min / (po_max - po_min) + 90

Hier setzt du nun einfach für po_min und po_max die Funktionen, also die 
Regressionsgeraden ein. Mal angenommen po_min(batt) und po_max(batt) ist 
so gegeben:

po_min = a1 * batt + b1
po_max = a2 * batt + b2

(a1, a2, b1, b2 werden durch die lineare Regression bestimmt)

und du setzt das ein, dann bekommst du folgendes:

Var(batt, po) = 100*(a2*batt+b2-po)/(a1*batt-a2*batt+b1-b2)+190

von Mink (Gast)


Lesenswert?

So, wunderbar!

Hab jetzt alle Konstanten berechnet, Formel gekürzt und ein sauberes 
Ergebnis, was dazu auch noch gut im Controller verarbeitet werden kann.

Var(batt,po) = (299*(po-5)/batt+2) + 6


Vielen vielen Dank für die Hilfe!!!


Gruß, Mink

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.