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
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.
Danke für die schnelle Antwort. Versteh ich noch nicht ganz, aber ich werd mich mal dransetzen.
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?
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.
>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.
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
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.
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.
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.
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!
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.