Hallo Mathematik-Genies :-) Bräuchte mal Ideen, wie man folgendes Problem mathematisch lösen könnte. Der Hintergrund dazu in der Kurzfassung: Die Füllhöhe eines asymetrischen Tankes wird über einen Widerstands-Hebelgeber erfaßt, ein Picaxe 20X2 errechnet daraus die Füllmenge und gibt diese weiter zur Anzeige. Dabei ergibt sich das Problem, daß ein Wert auf der linearen Eingangskurve (schwarz) in einen entsprechenden Wert auf der Ausgangskurve (rot) umgerechnet werden muss, damit die Anzeige stimmt (siehe Beispielgrafik). Mangels besserem Wissen arbeite ich momentan mit einer wahrlich stümperhaften Lösung, die mich natürlich so nicht glücklich macht: Ich habe die Ausgangskurve in Teilbereiche (grün) zerlegt, die Steigung eines jeden Abschnitts wird recht einfach durch einen Multiplikator festgelegt. Klingt einfach, ist aber in der Praxis wahnsinnig kompliziert, weil an den Übergängen Sprünge enstehen, die ich empirisch ermitteln und wieder rausrechnen muss. Es fehlt somit die Möglichkeit einer einfachen Kalibrierungsmöglichkeit. Wie macht man sowas denn eigentlich "richtig"? Gut, wenn ich die Ausgangskurve in Teilbereiche zerlegen muss, ist das noch nicht tragisch, aber die Berechnungsgrundlage muss doch geschmeidiger zu machen sein. Ideal wäre dabei, wenn ich die Form der Ausgangskurve in Variablen festlegen könnte. Zusätzliche Schwierigkeit: Picaxe rechnet nur mit positiven Ganzzahlen (16 Bit), wodurch Berechnungen schnell ungenau werden und Zwischenergebnisse nicht größer als 65535 sein dürfen... Das Ganze hat übrigens keinen kommerziellen Hintergrund, ist lediglich eine private Bastelei. Ich erwarte jetzt keinen fertigen Code, sondern freue mich einfach über Vorschläge, wie man sowas mathematisch prinzipiell lösen kann. Änderungen an der Hardware sind nicht möglich. Danke schonmal :-)
Könntest du ggf. eine Regression durchführen, um deine gewünschte Kurve zu bekommen. f(x) = ... ? Oder missverstehe ich dein Problem?
zB hier mit: http://de.wikipedia.org/wiki/Polynominterpolation Damit kann auch erreicht werden, dass die Ableitung an den Stützstellen stetig ist. Alex
Achim K. schrieb: > ist aber in der Praxis wahnsinnig > kompliziert, weil an den Übergängen Sprünge enstehen Eine lineare Interpolation von Stützstelle zu Stützstelle ist alles andere als kompliziert (jedenfalls wenn man es richtig macht). Es entstehen auch keine Sprünge, nur die Steigung ändert sich, folglich muss man auch keine "Sprünge rausrechnen", was immer das heissen soll. Bei einer durchaus vertretbaren Anzahl von Stützstellen ist so eine Näherung besser als die Messgenauigkeit, und mehr ist nicht sinnvoll. Man kann sich auch ein Näherungspolynom errechnen lassen, aber das lohnt sich nur selten. Ausserdem kann man ohne Floating Point mit so einem Polynom wenig anfangen. Georg
Hm. Vereinfacht gesagt verstehe ich die gegebenen Beispiele so, daß Interpolation gegebene Punkte zu einer Kurve komplettiert. Dabei werden die Bezüge der Punkte zueinander betrachtet. Ich benötige jedoch einen Bezug zur Kennlinie des Eingangs. Die Form der Ausgangskennlinie liegt ja eigentlich schon fest...
Einfach das hier benutzen und schon hast Du die gesuchte Polynomfunktion: Beitrag "PolynomMaker - Funktion für nichtlineare Bauelemente finden"
Mein Vorschlag: Du hast eine Eingangsfunkion (schwarze Funktionkurve) und eine Ausgangsfunktion (rote Funktionskurve). Ich gehe davon aus, dass du von der schwarzen Kurve den Y-Wert gegeben hast und auch die Funktion selber kennst. Die rote Funktionskurve solltest du eine Funktion aufstellen können (Excel kann dir unter Umständen für eine Polynome Annäherung helfen) Somit hast du gegeben y=E(x) und y=A(x) Mit der Umkehrfunktion der Eingangsfunktion, also x=E'(y) kannst du zu einem zugehörigen y das x berechnen, und diese wieder in die Ausgangsfunktion einsetzen: ganz mathematisch: y_aus=A(E'(y_ein))
Es gibt keine nicht die Trennung zwischen der Kennlinie des Eingangs und der Kennlinie des Ausgangs. Dein Bild ist insofern falsch und Dein Verständnis. Oder ich verstehe irgendwas völlig falsch. Dann aber würde ich Dich bitten, mal zu erklären welche Werte (X und Y) die schwarze Kurve und welche Werte die rote Kurve in Beziehung setzt. Meiner Auffassung nach ist es so: In diesem Zusammenhang stellen die X-Werte, die von dem Sensor ausgegebenen und die Y-Werte die damit verbundenen Füllhöhen da. Es gibt genau einen Zusammenhang dazwischen und nicht mehrere (die schwarze und die rote Kurve). Es kann ja nicht ein X-Wert mehrere Füllhöhen gleichzeitig bedeuten. Vielmehr wird es so sein, dass die rote Kurve die relevante ist.
Mein Verständnis ist, dass der Sensor die schwarze Kurve liefert, aber das Auswertegerät die rote Kurve erwartet.
123abc schrieb: > Mein Verständnis ist, dass der Sensor die schwarze Kurve liefert, aber > das Auswertegerät die rote Kurve erwartet. Sicher. Aber ebenso sicher nicht auf der selben Skalen. Das eben ist die Unklarheit hier, die es (meiner Vermutung nach, dem TO) schwer macht, das Problem systematisch anzugehen. Üblicherweise gibt es nur eine Kurve: Die X-Achse gibt den Sensorwert an und die Y-Achse die Füllhöhe. Es scheint mir, das die rote Kurve diesen Zusammenhang angibt. Aber was gibt die schwarze Kurve an? Wozu dient sie?
Achim K. schrieb: > Wie macht man sowas denn eigentlich "richtig"? Gut, wenn ich die > Ausgangskurve in Teilbereiche zerlegen muss, ist das noch nicht > tragisch, aber die Berechnungsgrundlage muss doch geschmeidiger zu > machen sein. Ideal wäre dabei, wenn ich die Form der Ausgangskurve in > Variablen festlegen könnte. Kommt drauf an, wie genau du das ganze haben willst. Wenn du nicht mit Float arbeitest, bleibt dir nur eine Tabelle übrig. Im ersten Abschnitt hast du eine negative Abweichung, zweiter Abschnitt ist gut(?), dritter und vierter haben positive Abweichung. Also, Abweichung als Offset vom Sollwert eintragen und abfahren, zwischen Tabellenwerten interpolieren. > festgelegt. Klingt einfach, ist aber in der Praxis wahnsinnig > kompliziert, weil an den Übergängen Sprünge enstehen, Bei nur 4 Punkten ist das auch zu erwarten... > Es fehlt somit die Möglichkeit einer einfachen Kalibrierungsmöglichkeit. Nicht ganz so, nur die erste Kalibrierung ist immer aufwendig.
Bitflüsterer schrieb: > Üblicherweise gibt es nur eine Kurve: Die X-Achse gibt den Sensorwert an > und die Y-Achse die Füllhöhe. Es scheint mir, das die rote Kurve diesen > Zusammenhang angibt. Aber was gibt die schwarze Kurve an? Wozu dient > sie? Ich habe das so verstanden: Schwarze Kurve: Tatsächlich eingefüllte Menge. Rote Kurve: Da dieser Behälter asymetrisch ist, ist das der Wert der angezeigt werden soll. Grün: Gemessene Werte.
Wow, hätte nicht gedacht, gleich soviel Input zu bekommen! Komme kaum mit dem Antworten nach! Danke! :-) Es gibt offenbar Verständnisschwierigkeiten mit der Grafik oben. Die Grafik ist fiktiv und entspricht nicht der Realität, soll nur das Problem veranschaulichen. Der Eingangswert verschiebt sich auf der schwarzen Linie, je nach Füllhöhe. In der Realität stehen linear dezimale Werte zwischen ca. 100 und 500 an. Je nachdem müssen am Ausgang Werte entlang der roten Linie anstehen, nichtliner zwischen 300 und 800. Man nehme einen Punkt/Wert auf der schwarzen Linie und lote senkrecht darüber zur roten Linie, das wäre der dazugehörige Ausgangswert. @Georg: Hab mal auf die schnelle eine Exceltabelle gemacht, die das Problem visualisiert. Bis 100 wird mit 1,2 multipliziert, darüber mit 1,4. An der Schnittstelle gibt es eben diese Kante. Aber, auch die müßte sich berechnen und somit automatisch korrigieren lassen. Dazu hatte ich bisher jedoch keine brauchbaren Ideen. So falsch scheint mein bisheriger Weg ja dann aber nicht zu sein. Da denke ich also nochmal drüber nach. @Polynom Dein Tool sieht sehr vielversprechend aus! Gib mir mal Zeit, mich damit auseinanderzusetzen. Das wäre der Hammer, wenn das mein Problem lösen könnte! :-)
@ Achim > Der Eingangswert verschiebt sich auf der schwarzen Linie, je nach > Füllhöhe. > Man nehme einen Punkt/Wert auf der schwarzen Linie und lote senkrecht > darüber zur roten Linie, das wäre der dazugehörige Ausgangswert. Entschuldige aber das ist unsinnig. Wenn Du nicht klar sagen kannst, was jeweils bei der roten und schwarzen Kurve die X- und Y-Skalen sind, dann ist das alles Andere aber keine Mathematik. Wozu ist die schwarze Kurve überhaupt da, wenn ich ohnehin zur roten senkrecht nach oben gehe? Wozu peile ich ausgehend von der schwarzen Kurve anstatt von der X-Achse? Es mag sein, dass Du Dir da was zurechtgelegt hast, was irgendwie zum Ergebnis führt. Ich werde weiter mitlesen und mal sehen, was da rauskommt. Aber systematisch und führ spätere Gelegenheiten wertvoll ist das so nicht. Am Ende wird es so sein (falls Du die Polynomentwicklung benutzt), das Du die Wertepaare der roten Kurve eingibst und die schwarze Kurve garkeine Rolle spielt, denke ich. Ach ja. Kleiner Hinweis. Eine Regression mit Polynom (oder auch anderen Zusammenhängen) geht auch mit Excel bzw. Gnumeric.
Achim K. schrieb: > Das wäre der Hammer, wenn das mein Problem lösen könnte! :-) Mit Integer ? Kaum. Entweder Tabelle oder Float, alles andere kannst du vergessen.
Hallo Achim,
> Bis 100 wird mit 1,2 multipliziert, darüber mit 1,4
also sinngemäß:
wenn Meßwert <=100 dann Volumen = Meßwert x 1.2 sonst Volumen = Meßwert
x 1.4
Das glaube ich aber nicht, da hätte der Tank bei Meßwert 100 einen
unendlich großen Querschnitt in den 20 wasauchimmer 'rein passen.
Ich vermute mal daß Dein Tankquerschnitt unter Meßwert 100 bei 1.2
liegt, und drüber bei 1.4. Damit macht die Volumen zu Meßwert Kurve bei
100 keinen Sprung sondern nur einen Knick. So wie in der ursprünglichen
Frage formuliert.
Dann würde ich so rechnen:
Volumen = Meßwert x 1.2
Wenn Meßwert > 100 dann Volumen = Volumen + (Meßwert-100) x 0.2
Also ganz eingach 2 lineare Abschnitte bei dem der 2. um das delta an
Querschnitt korrigiert wird.
p.S. ich rechne immer in Festkomma, und hier kann man das sogar noch
vereinfachen wenn man die einzelnen Parameter kennt.
Martin schrieb: > Dann würde ich so rechnen: > Volumen = Meßwert x 1.2 > Wenn Meßwert > 100 dann Volumen = Volumen + (Meßwert-100) x 0.2 Und schon stimmt das Ganze nicht mehr... Ich nehme an, dieses Behälter sieht etwa so aus: | | |_ _| | | | | Oder umgekehrt. Dann muss aber die Ausgangskurve nach dem Knick viel flacher oder steiler verlaufen. Tut die aber nicht... Also, ist das, was du gezeichnet hast, falsch.
:
Bearbeitet durch User
Achim K. schrieb: > es eben diese Kante. Aber, auch die müßte sich berechnen und somit > automatisch > korrigieren lassen. Dazu hatte ich bisher jedoch keine brauchbaren > Ideen. > So falsch scheint mein bisheriger Weg ja dann aber nicht zu sein. Ich denke doch. Mein Eindruck ist: du berechnest die Steigung zwischen den Stützstellen. Aber dann multiplizierst du den vollen x-Wert mit dieser Steiung, nicht die Differen zwischen x und der nächstkleineren Stützstelle. Du tust also so, also hätte die Kurve die Steigung von Anfangswert an, nicht erst seit der Stützstelle. wenn du folgendermaßen rechnest, erhältst du die grünen Linien aus deinem ersten Post (Sprünge in der Steigung, aber keine Sprünge zwischen den Werten): Eingangswert: x gesucht: Y benachbarte Stützstellen:
Die Steigung ist:
der interpolierte Wert ist:
ich vermute du rechnest stattdessen etwas in der Art von:
Falls ich daneben liege, könntest du ja einfach mal einen Ausschnitt deines Codes zeigen.
Nicht abdriften! ;-) Die genauen Werte und die Tankform sind unerheblich. Ich möchte grundsätzlich nur einen ISTWERT (irgendein Punkt auf der schwarzen Linie) umrechnen in einen SOLLWERT (in der snkrechten darüber auf der roten Linie). Ich hab die Grafik nochmal verdeutlicht. Man nehme einen Punkt auf der schwarzen Linie. Im Beispiel erhält man den Wert 360 auf der Y-Achse, das wäre der ISTWERT. Der SOLLWERT entspricht dann analog dazu dem Punkt senkrecht darüber auf der roten Linie, was also auf der Y-Achse dem Wert 570 entsprechen würde. Aus einem ISTWERT von 360 muss ergo ein SOLLWERT von 570 werden.
Hallo Achim, schöner Name! ;-) Du könntest Recht haben. Auch hier brauche ich mal die Zeit, das auszuprobieren. Danke :-)
...genau 123abc :-) dann war meine erste Erklärung ja nicht soooo missverständlich ;-)
Achim K. schrieb: > Ich hab die Grafik nochmal verdeutlicht. Die übliche Auftragung wäre, dass die Eingangsgröße auf die x-Achse kommt, die Ausgangsgröße auf die y-Achse. Es verwirrt, dass du die x-Achse überhaupt nicht skalierst (so wie in deinem Excel-Ausdruck: die x-Achse ist ein nichtsagender Index) und die Eingangsgröße ins selbe Diagramm wie die Ausgangsgröße einzeichnest. Da die schwarze Kurve in deinem Diagramm linear verläuft könntest du sie auch gleich als x-Wert nehmen und die x-Achse mit Zahlen skalieren.
Achim K. schrieb: > Nicht abdriften! ;-) > Die genauen Werte und die Tankform sind unerheblich. Ich möchte > grundsätzlich nur einen ISTWERT (irgendein Punkt auf der schwarzen > Linie) umrechnen in einen SOLLWERT (in der snkrechten darüber auf der > roten Linie). Nicht abdriften, bitte. Wenn die IST- und SOLLWERTE in keiner linearen (oder welchen auch immer) Beziehung stehen, MUSS eine Tabelle her. PUNKT ENDE der Diskussion. Ob du die Werte aus einer Tabelle holst oder mittels einer Tabelle umrechnest, ist völlig egal.
:
Bearbeitet durch User
Achim K. schrieb: > Die genauen Werte und die Tankform sind unerheblich. Ich möchte > grundsätzlich nur einen ISTWERT (irgendein Punkt auf der schwarzen > Linie) umrechnen in einen SOLLWERT Und das ist so Quatsch. Natürlich ist die Form nicht unerheblich, da diese diese die transformation beeinflusst. Du hast den Einganswert E, und den Ausgangswert A. Diese werden mithilfe der Funktion E2A() umtransformiert. Du hast also: A=E2A(E) Das ist die einzige Mathematik die mithilfe deiner Angaben möglich ist. Was wir brauchen ist die Funktion E2A(). Denn diese beschreibt mathematisch deinen Tank. Möchtest du eine Formel in der nur Zahlen und die Ein-und Ausgangsgrößen stehen, brauchen wir zwangsweise die Transformationsbedingungen, sprich, die Maße deines tanks (oder die Füllmenge abhängig von der Höhe)
:
Bearbeitet durch User
Achim S. schrieb: > Achim K. schrieb: >> Ich hab die Grafik nochmal verdeutlicht. > > Die übliche Auftragung wäre, dass die Eingangsgröße auf die x-Achse > kommt, die Ausgangsgröße auf die y-Achse. Es verwirrt, dass du die > x-Achse überhaupt nicht skalierst (so wie in deinem Excel-Ausdruck: die > x-Achse ist ein nichtsagender Index) und die Eingangsgröße ins selbe > Diagramm wie die Ausgangsgröße einzeichnest. > > Da die schwarze Kurve in deinem Diagramm linear verläuft könntest du sie > auch gleich als x-Wert nehmen und die x-Achse mit Zahlen skalieren. Genau das ist, was ich meine. Wozu erst den Sensor-Wert (das ist eine Annahme, aber eine plausible und die übliche Variante) zu einem dimensionslosen willkürlichen Wert zuordnen um diessen dann erst im zweiten Schritt (jedenfalls gedanklich) der Füllmenge zuzuordnen? Das ist unnötig.
123abc schrieb: > oder eine (angenäherte) Funktion, die das beschreibt. Ja. Aber ob eine (solche) Funktion kürzer als Tabellenzugriff wäre, ist fraglich. Und auch diese Funktion will mit abweichenden Werten gefüttert werden... Gerald G. schrieb: > Und das ist so Quatsch. Natürlich ist die Form nicht unerheblich, da > diese diese die transformation beeinflusst. > Das ist die einzige Mathematik die mithilfe deiner Angaben möglich ist. > Was wir brauchen ist die Funktion E2A(). Denn diese beschreibt > mathematisch deinen Tank. Genau.
Eine Tabelle muss irgendwo hinterlegt werden, da bin ich mir nicht sicher, ob sich das in meinem System umsetzen läßt. Du hast aber natürlich Recht, wenn ich die rote Linie exakt nachbilden wollte, wäre das die beste Lösung. Weil ich aber auf eine Tabelle verzichten möchte oder muss und das ganze nicht sooooo genau zu sein braucht, hatte ich die Idee, die rote Kurve in lineare Teilbereiche aufzutrennen, also das, was die grüne Linie wiedergibt um dann jeden Teilbereich einzeln zu btrachten. Sorry für meine schlechte Grafik, hab ich so gemacht, wie ich Sie für verständlich gehalten habe.
Achim K. schrieb: > Sorry für meine schlechte Grafik, hab ich so gemacht, wie ich Sie für > verständlich gehalten habe. Die Grafik an sich ist nicht schlecht, sondern nur unvollständig. Es fehlen die Angaben der Einheiten und der gemessenen Quantität. Verstehe mich recht: Mache es wie Du willst. Aber was Du da machst ist halb-bewusstloser Pfusch (ist nicht böse gemeint) und keine technisch-mathematisch folgerichtige und korrekte Vorgehensweise. Da Du auf diese Fragen nicht eingehst, gehe ich davon aus, das Dir an einem Verständnis nicht gelegen ist, sondern nur daran, dass wir das Problem für Dich lösen. Auch dazu finden sich hier Leute bereit. Aber du bist letztlich schlicht ein Kunde und kein Mitstreiter der sich aus Interesse und Leidenschaft für das Thema damit beschäftigt.
Achim K. schrieb: > ... > Die genauen Werte und die Tankform sind unerheblich. > ... Nein, davon hängt ab welche Lösung am besten ist. Wenn der Querschnitt abschnittsweise konstant ist, und wenige Abschnitte vorhanden sind, dann rechnet man am besten Abschnitt für Abschnitt linear. Die "Tabellenwerte" sind dann nicht unbedingt im gleichen Abstand, die Suche nach dem richtigen Abschitt dauert aber nur kurz, wegen der Bedingung "wenige Abschnitte". Bei vielen linearen Abschnitten oder häufig hin und her springenden Querschnitten ist eine Tabelle mit Ausgangswerten für äquidistante Eingangswerte die beste Lösung, weil man dann den Eingangswert einfach in einen Index für die Tabelle umrechnen kann und nicht lange nach dem richtigen linearen Abschnitt suchen muß. Wenn der Querschnitt einen weich gerundeten Verlauf hat, dann ist eine Polynom-Annäherung am besten. Keinerlei Suche nach Tabellernwerten, nur stur rechnen. Wenn der Querschnittsverlauf total chaotisch ist baut man einen besseren Tank oder legt für jeden Meßwert einen Ausgangswert ab.
Martin schrieb: > Wenn der Querschnitt einen weich gerundeten Verlauf hat, dann ist eine > Polynom-Annäherung am besten. Keinerlei Suche nach Tabellernwerten, nur > stur rechnen. Ja, aber nicht mit Integer. > Wenn der Querschnittsverlauf total chaotisch ist baut man einen besseren > Tank oder legt für jeden Meßwert einen Ausgangswert ab. LOL, ja.
:
Bearbeitet durch User
Marc Vesely schrieb: > Martin schrieb: >> Wenn der Querschnitt einen weich gerundeten Verlauf hat, dann ist eine >> Polynom-Annäherung am besten. Keinerlei Suche nach Tabellernwerten, nur >> stur rechnen. > > Ja, aber nicht mit Integer. > Natürlich nicht. Ich hatte ja oben schon geschrieben daß ich für sowas Festkomma nehme.
Martin schrieb: > Wenn der Querschnitt einen weich gerundeten Verlauf hat, dann ist eine > Polynom-Annäherung am besten. Keinerlei Suche nach Tabellernwerten, nur > stur rechnen. Eine Polynom-Annäherung hat dabei das Problem, dass die Kurve zwischen den Stützstellen ziemlichen Unfug anstellen kann. Eine Spline-Interpolation ist da wesentlich gutmütiger. http://de.wikipedia.org/wiki/Spline-Interpolation
Wolfgang A. schrieb: > Martin schrieb: >> Wenn der Querschnitt einen weich gerundeten Verlauf hat, dann ist eine >> Polynom-Annäherung am besten. Keinerlei Suche nach Tabellernwerten, nur >> stur rechnen. > > Eine Polynom-Annäherung hat dabei das Problem, dass die Kurve zwischen > den Stützstellen ziemlichen Unfug anstellen kann. Eine > Spline-Interpolation ist da wesentlich gutmütiger. > http://de.wikipedia.org/wiki/Spline-Interpolation Ein klein bischen Hirn sollte man bei der Auswahl des Verfahrens und der Verteilung der Stützstellen natürlich schon walten lassen.
Martin schrieb im Beitrag #3794 > Ein klein bischen Hirn sollte man bei der Auswahl des Verfahrens und der > Verteilung der Stützstellen natürlich schon walten lassen. Mit Polynominterpolation ist das Verfahren festgelegt. Da ist das Kind schon in den Brunnen gefallen, wenn der Zusammenhang nicht vernünftig durch ein Polynom beschrieben werden kann. Versuche beispielsweise mal, die Funktion y = 1/x über einen größeren Bereich durch ein Polynom zu approximieren. Du kommst in Teufels Küche.
Wolfgang A. schrieb: > Eine Polynom-Annäherung hat dabei das Problem, dass die Kurve zwischen > den Stützstellen ziemlichen Unfug anstellen kann. Eine > Spline-Interpolation ist da wesentlich gutmütiger. Man braucht bei einem Polynom halt deutlich mehr Messwerte als die Ordnung+1 des Polynoms. Und rechnet dann eine Regressionskurve. Da schwingt dann nichts mehr. Ich würde beim Beispiel oben mindestens 20 Wertepaare für eine Ausgleichskurve 3. Ordnung nehmen. Splines sind auch kein Allheilmittel. Bei genügend Rauschen auf dem Meßwert schwingen die auch. Gruß Anja
Ich stelle mir gerade einen Tank mit einem in einem größeren Bereich 1/x förmigen Querschnittsverlauf vor.
Achim K. schrieb: > Bräuchte mal Ideen, wie man folgendes Problem mathematisch lösen könnte. Eine wirkliche Lösung muß schlicht und einfach die physischen Gegebenheiten widerspiegeln. Also die Form des Tanks, den Befestigungspunkt des Gebers und den Durchmesser seines Schwimmerwegs. Wenn der Tank nicht gerade aussieht wie eine Alraune, sondern mit "normalen" Technologien gefertigt wurde, sollte das machbar sein. Wenn dir dieser Ansatz zu aufwendig ist, dann bleibt nur das, was du schon getan hast, wenn auch höchstwahrscheinlich falsch. Denn: Hättest du es richtig getan, wären "Sprünge" unmöglich, weil immer genau an den Grenzpunkten zwischen den Bereichen Gleichheit der Funktionswerte herrscht und die abzubildende Folge monoton ist. Dein Fehler ist vermutlich, daß du die Sache nicht von X nach Y umgeformt hast.
Anja schrieb: > Splines sind auch kein Allheilmittel. Bei genügend Rauschen auf dem > Meßwert schwingen die auch. Woher sollen die auch wissen, dass die reingefütterten Daten nicht für bare Münze genommen werden dürfen, sondern fehlerhaft sind. Das funktioniert natürlich nur, wenn erheblich mehr Datenpunkte zur Verfügung stehen, als zur Lösung des Gleichungssystems erforderlich sind. Wenn Achim mal seine echte Wertetabelle zeigt, könnte man mal gucken, was als Basis für eine Modellierung passen könnte. Besser, aber evtl. wesentlich aufwändiger, könnte es sein, aus der Hebelgeometrie und der Tankform direkt den funktionalen Zusammenhang zu berechnen.
Laßt mal gut sein für den Moment, ich verfolge gerade den Weg von Achim S., der scheint für meine Zwecke genau der Richtige zu sein. :-) Die Form des Tanks ist ja nicht allein verantwortlich für die benötigte krumme Ausgangskurve. Die Eigenarten der Anzeigen und die Verfälschung im Signalverlauf Picaxe > Anzeigen wollen auch berücksichtigt werden. Da sich da noch einiges tun kann brauche ich die Möglichkeit einer flexiblen Anpassungsmöglichkeit und die wird mir so geboten. Also nicht böse sein, wenn ich nicht gleich alle Vorschläge und Möglichkeiten ausreichend verfolgen und studieren kann. Trotzdem bin ich sehr dankbar für alle gegebenen Hilfestellungen! :-)
Achim S. schrieb: > Es verwirrt, dass du die > x-Achse überhaupt nicht skalierst (so wie in deinem Excel-Ausdruck: die > x-Achse ist ein nichtsagender Index) und die Eingangsgröße ins selbe > Diagramm wie die Ausgangsgröße einzeichnest. Daran ist die bescheuerte Bezeichnungsweise der Diagrammtypen in MS-Excel wohl nicht ganz unschuldig. Jeder, der den Zusammenhang als Linien sehen möchte, ist erstmal versucht, als Diagrammtyp "Linien" zu wählen, statt "x-y Punkt" (oder so ähnlich), was für die Darstellung eines funktionalen Zusammenhanges erforderlich wäre.
Achim K. schrieb: > Weil ich aber auf eine Tabelle verzichten möchte > oder muss und das ganze nicht sooooo genau zu sein braucht, hatte ich > die Idee, die rote Kurve in lineare Teilbereiche aufzutrennen Du schreibst schlicht Unsinn. Die Tabelle, von der die Rede ist, beschreibt ja gerade die linearen Teilbereiche. Für jeden Teilbereich Xn,Yn .. Xn+1,Yn+1 wird ganz primitiv linear interpoliert (das hat zwangsweise zur Folge, dass es an den Grenzen eben keinen Sprung gibt!). Wie schon angemerkt ist es am einfachsten, die Teilbereiche gleich gross zu machen, dann ist Xn+1 - Xn immer gleich und man kann indiziert auf die Tabelle zugreifen. Ich fürchte, dein mathematisches Verständnis setzt schon bei den 4 Grundrechenarten aus, daher erfasst du das Problem überhaupt nicht. Ich mache daher auch keine weiteren Vorschläge mehr. Georg
1 | x1=[150 350 650 900 1000]; |
2 | y1=[400 490 510 650 850]; |
3 | |
4 | p = polyfit(x1,y1,3) |
5 | |
6 | x2 = 150:20:1000; |
7 | y2 = polyval(p, x2); |
8 | |
9 | figure; |
10 | hold on; |
11 | grid on; |
12 | plot(x1, y1, 'r'); |
13 | plot(x2, y2, 'b'); |
1 | >> test |
2 | |
3 | p = |
4 | |
5 | 0.0000 -0.0044 2.1086 169.8783 |
die werte für x1 und y1 habe ich anhand deines graphen geschätzt/geraten polynomial ist vielleicht nicht unbedingt die kurve der wahl aber die einfachste form der implementierung.
Irgendwie versteh ich das Problem nicht. Du hast zwei Kurven bzw. Funktionen in deinem Bild: schwarz() und rot(). Wie hängen die jetzt zusammen? So?
Ohne eine mathematische Formulierung ist es schwierig da Hilfe zu geben. Wie sind die Funktionen gegeben? Durch Messwerte? Durch eine Formel? Beide? Sind die Werte gut genug bekannt um die Ableitung (Steigung) von rot() zu bestimmen? Ist die Steigung von rot() am linken oder rechten Ende unendlich? Ist schwarz() eine Gerade oder sieht das nur so aus? Fragen über Fragen... Einfach durch Polymome zu interpolieren hat mannigfaltige Nachteile; steht aber oben schon: Schwingt zwischen den Stützstellen, schlecht mit Fixed-Point Arithmetik zu berechnen (Überläufe bei Zwischenergebnissen), etc.
Du musst die schwarze Kurve als X-Achse nehmen. Im Prinzip machst Du das in Deiner Graphik ja schon. Anders ausgedrückt, plotte die unförmige Kurve vom kleinsten Wert der schwarzen bis zum größten. Du bekommst Dann wieder diese seltsame Kurve. Das ergibt dann folgende Funktion (f1 ist Deine lineare Funktion f(x)): y=F(f1(x)) Dann definierst Du F als a*x^3+b*x^2+c*x, alternativ als a*x^4+b*x^3+c*x^2+d*x, je nachdem welche Genauigkeit Du willst. Anschließend fittest Du diese Funktion, was Dir die Parameter a bis c oder d gibt. Und diese notierst Du Dir und lässt Deinen Mikrocontroller dann für jeden Wert anhand der Formel und Parameter rechnen, was das echte Ergebnis ist. Wenn Du das nicht willst, baust Du Dir eine Lookup-Tabelle wo für jeden möglichen Wert des ADCs das korrekte Ergebnis drin steht. Oder nur ein paar, und wenn der ADC dazwischen liegt, interpolierst Du linear. Und das Beste zum Schluss: Im Prinzip geht das mit Excel! plotte Deine 5 Werte die Du da hast, lass sie als Diagramm darstellen (Achtung, müssen in Abhängigkeit der Werte der schwarzen Funktion als x-Achse geplottet werden!!!!), und klicke dann auf die Kurve mit der rechten Maustaste. Dann wähle "Trendlinie hinzufügen". Im anschließenden Dialog kannste Dir dann auswählen was Du willst, Polynom, Ordnung, Formel anzeigen (da stehen dann die Parameter a-d als Gleitkommazahlen drin!) etc. Problem gelöst.
:
Bearbeitet durch User
Achja, wenn Der Picaxe keine Floating Point Rechnungen macht, bist Du natürlich am Sack. Entweder selbst eine Routine schreiben die die Konversion vornimmt (im einfachsten Fall skalieren) oder die piecewise linear Interpolation mit lookup table machen. Die kannst Du Dir ja relativ gut mit Excel berechnen lassen.
Johann L. schrieb: > Du hast zwei Kurven bzw. Funktionen in deinem Bild: schwarz() und rot(). > Wie hängen die jetzt zusammen? So? Wolfgang A. schrieb: > Daran ist die bescheuerte Bezeichnungsweise der Diagrammtypen in > MS-Excel wohl nicht ganz unschuldig. Jeder, der den Zusammenhang als > Linien sehen möchte, ist erstmal versucht, als Diagrammtyp "Linien" zu > wählen, statt "x-y Punkt" (oder so ähnlich), was für die Darstellung > eines funktionalen Zusammenhanges erforderlich wäre.
>statt "x-y Punkt" (oder so ähnlich), was für die Darstellung > eines funktionalen Zusammenhanges erforderlich wäre. Genau das ist das Problem. Dann wird nämlich auch die geschwungene Kurve zur Funktion der geraden!
Was hier für ein Blödsinn zusammenkommt... Anstatt einfach zwei Tabellen mit z.B. jeweils 32 Werten, zwischen denen korrigiert werden muß zu nehmen, wird hier so etwas von mathematischen Unsinn geschrieben. Zwischen den 32 Werten aus der ersten Tabelle wird jeweils von Wert zu Wert bequem mit dem Faktor aus der zweiten Tabelle umgerechnet. So krumm kann diese Kurve auch nicht sein, dass man mehr als 32 korrigierende Punkte braucht... Für jede von euch grossen Mathematikern vorgeschlagene Funktion braucht das Programm mindestens doppelt so viel Platz und Zeit als diese einfachen Tabellen mit ( mehr als genügenden ) 32 Werten. Kopfschütteln...
:
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.