Forum: Mikrocontroller und Digitale Elektronik Kurve mathematisch verbiegen


von Achim K. (achim67)


Angehängte Dateien:

Lesenswert?

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 :-)

von Alex (Gast)


Lesenswert?

Könntest du ggf. eine Regression durchführen, um deine gewünschte Kurve 
zu bekommen. f(x) = ... ?

Oder missverstehe ich dein Problem?

von Alex (Gast)


Lesenswert?

zB hier mit:
http://de.wikipedia.org/wiki/Polynominterpolation

Damit kann auch erreicht werden, dass die Ableitung an den Stützstellen 
stetig ist.

Alex

von Markus (Gast)


Lesenswert?


von Georg (Gast)


Lesenswert?

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

von Achim K. (achim67)


Lesenswert?

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...

von Polynom (Gast)


Lesenswert?

Einfach das hier benutzen und schon hast Du die gesuchte 
Polynomfunktion:

Beitrag "PolynomMaker - Funktion für nichtlineare Bauelemente finden"

von 123abc (Gast)


Lesenswert?

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))

von Bitflüsterer (Gast)


Lesenswert?

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.

von 123abc (Gast)


Lesenswert?

Mein Verständnis ist, dass der Sensor die schwarze Kurve liefert, aber 
das Auswertegerät die rote Kurve erwartet.

von Bitflüsterer (Gast)


Lesenswert?

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?

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

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.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

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.

von Achim K. (achim67)


Angehängte Dateien:

Lesenswert?

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! :-)

von Bitflüsterer (Gast)


Lesenswert?

@ 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.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

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.

von Martin (Gast)


Lesenswert?

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.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

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
von Achim S. (Gast)


Lesenswert?

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.

von Achim K. (achim67)


Angehängte Dateien:

Lesenswert?

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.

von 123abc (Gast)


Lesenswert?

Na dann ist doch meine Lösung richtig!

von Achim K. (achim67)


Lesenswert?

Hallo Achim, schöner Name! ;-)

Du könntest Recht haben. Auch hier brauche ich mal die Zeit, das 
auszuprobieren. Danke :-)

von Achim K. (achim67)


Lesenswert?

...genau 123abc :-)

dann war meine erste Erklärung ja nicht soooo missverständlich ;-)

von Achim S. (Gast)


Lesenswert?

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.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

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
von 123abc (Gast)


Lesenswert?

Marc Vesely schrieb:
> MUSS eine Tabelle her.

oder eine (angenäherte) Funktion, die das beschreibt.

von Gerald G. (gerald_g)


Lesenswert?

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
von Bitflüsterer (Gast)


Lesenswert?

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.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

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.

von Achim K. (achim67)


Lesenswert?

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.

von Bitflüsterer (Gast)


Lesenswert?

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.

von Martin (Gast)


Lesenswert?

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.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

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
von Martin (Gast)


Lesenswert?

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.

von Wolfgang A. (Gast)


Lesenswert?

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

von Martin (Gast)


Lesenswert?

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.

von Wolfgang A. (Gast)


Lesenswert?

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.

von Anja (Gast)


Lesenswert?

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

von Martin (Gast)


Lesenswert?

Ich stelle mir gerade einen Tank mit einem in einem größeren Bereich 1/x 
förmigen Querschnittsverlauf vor.

von c-hater (Gast)


Lesenswert?

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.

von Wolfgang A. (Gast)


Lesenswert?

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.

von Achim K. (achim67)


Lesenswert?

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! :-)

von Wolfgang A. (Gast)


Lesenswert?

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.

von Georg (Gast)


Lesenswert?

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

von Daniel F. (df311)


Angehängte Dateien:

Lesenswert?

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.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

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.

von Karl O. (knorke)


Lesenswert?

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
von Karl O. (knorke)


Lesenswert?

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.

von n.b. (Gast)


Lesenswert?

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.

von Karl O. (knorke)


Lesenswert?

>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!

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

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
Noch kein Account? Hier anmelden.
Lade...