Forum: PC-Programmierung Eine Wertemenge auf eine andere abbilden


von Urs H. (uher)


Lesenswert?

Ich suche für eine messtechnische Kalibrationsaufgabe eine allgemeine, 
einfache programmtechnische Lösung, die Menge von (Mess)Werten A auf 
eine andere Menge zutreffender (Ergebnis)Werte B abzubilden:

Gegeben sei beispielsweise A mit der Folge von 0DB8H bis 0900H und 
zugehörig B von 100 bis 1500 (mA). Zu beachten hierbei: Die eine Abfolge 
fällt, die andere steigt dabei. Man könnte sowas natürlich aufwendig in 
einer großen Tabelle lösen. Gesucht wäre nun eine deutlich 
platzsparendere Lösung!

: Verschoben durch Moderator
von g457 (Gast)


Lesenswert?

> Ich suche für eine messtechnische Kalibrationsaufgabe eine allgemeine,
> einfache programmtechnische Lösung, die Menge von (Mess)Werten A auf
> eine andere Menge zutreffender (Ergebnis)Werte B abzubilden:

Das klingt nach einer schnöden Relation (oder im Spezialfall einer 
Funktion).

> Gesucht wäre nun eine deutlich platzsparendere Lösung!

Wenn linear reicht dann schafft das ein Einzeiler (zumindest in den 
üblichen Programmiersprachen). Wenns lesbar sein darf dann auch auf zwei 
oder drei Zeilen verteilt.

von Urs H. (uher)


Lesenswert?

g457 schrieb:
> Wenn linear reicht dann schafft das ein Einzeiler (zumindest in den
> üblichen Programmiersprachen).

Linear reicht.
Welcher Einzeiler schafft das nun konkret?

von df2ds (Gast)


Lesenswert?

Hier ist der Einzeiler:

y = y_min +(y_max-y_min)/(x_max-x_min)*(x-x_min)

von Urs H. (uher)


Lesenswert?

df2ds schrieb:
> Hier ist der Einzeiler:
> y = y_min +(y_max-y_min)/(x_max-x_min)*(x-x_min)

Welches Problem dieser Einzeiler löst weiß ich nicht. Dieses hier ist es 
jedenfalls nicht.

von Joachim B. (jar)


Lesenswert?

Urs H. schrieb:
> Welches Problem dieser Einzeiler löst weiß ich nicht. Dieses hier ist es
> jedenfalls nicht.

war ja  auch für eine positive Steigung ohne Offset!

Geradengleichung war schon immer

m=dx/dy
b=Offset

y = m * x + b

ohne Offset
y = m * x

y und x steigend m = positiv
ist einer nun fallend also m negativ muss dy oder dx umgedreht werden
ist nirgends ein Offset entfällt b

kann locker per Hand auf Karopapier oder als Tabelle in Exel überprüft 
werden.

: Bearbeitet durch User
von Sebastian R. (sebastian_r569)


Lesenswert?

Urs H. schrieb:
> df2ds schrieb:
>> Hier ist der Einzeiler:
>> y = y_min +(y_max-y_min)/(x_max-x_min)*(x-x_min)
>
> Welches Problem dieser Einzeiler löst weiß ich nicht. Dieses hier ist es
> jedenfalls nicht.

Ich hätte deine Problembeschreibung jetzt so verstanden, dass du einen 
Raw-AD-Wert auf den echten Messwert skalieren möchtest.

Also 1823 bis 245 Digits ergeben am Ende 100 bis 1500mA oder whatever.
Oder 4 bis 20mA sollen auf 0...100% umgerechnet werden.

Und genau das tut die Funktion, die df2ds angegeben hat.

https://www.arduino.cc/reference/de/language/functions/math/map/

von Achim S. (Gast)


Lesenswert?

Joachim B. schrieb:
> war ja  auch für eine positive Steigung ohne Offset!

Der Einzeiler von df2ds funktioniert für alle Geraden. Also unabhängig 
vom Vorzeichen der Steigung und unabhängig vom Offset.

Urs H. schrieb:
> Welches Problem dieser Einzeiler löst weiß ich nicht. Dieses hier ist es
> jedenfalls nicht.

Dann solltest du deine Problembeschreibung nochmal konkretisieren. Denn 
wenn dir eine lineare Abbildung der beiden Wertebereiche ausreicht (wie 
du eigentlich geschrieben hast), dann gibt dir der Einzeler die 
Rechenanleitung für diese lineare Gleichung.

von Urs H. (uher)


Lesenswert?

Sebastian R. schrieb:

> Ich hätte deine Problembeschreibung jetzt so verstanden, dass du einen
> Raw-AD-Wert auf den echten Messwert skalieren möchtest.

Genau.

Achim S. schrieb:
> Der Einzeiler von df2ds funktioniert für alle Geraden.

Ja, ich muss mich korrigieren, hatte das wegen der fehlenden Klammern 
hinten falsch berechnet. Die Formel passt ansonsten, danke für die 
Hilfe.

von jojo (Gast)


Lesenswert?

Hinreichend allgemeine und häufig genommene Ansätze: Lookup tables, 
Neuronale Netze (ja, auch die sind heutzutage einfach aufm µC zu 
nutzen), ggf. (nicht mehr allzu allgemein) polynomiale Regression (wovon 
die oben gezeigte Lineare Regression ein Spezialfall ist).

Gibt natürlich noch deutlich mehr.

von Urs H. (uher)


Lesenswert?

Urs H. schrieb:
> der fehlenden Klammern hinten

um den mittleren Quotienten herum meinte ich

von df2ds (Gast)


Angehängte Dateien:

Lesenswert?

Hier nochmal (ganz ausführlich zur Erklärung) mit "deinen" Werten als 
Anhang.

Viel Erfolg!

von A. S. (Gast)


Lesenswert?

Urs H. schrieb:
> Urs H. schrieb:
>
>> der fehlenden Klammern hinten
>
> um den mittleren Quotienten herum meinte ich

Wo meinst Du fehlt da eine Klammer?

Man nutzt i.d.r ja auch nicht die Formel, sonder berechnet daraus m und 
b.

Und eigentlich auch nicht aus den Grenzwerten, sondern aus typischen 
aber weit auseinander liegenden werten oder per linearer Regression.

Am Ende gibt es ein m und ein b.

Je nach Auflösung kann man zwischen 2 Versionen wählen, die ein 
unterschiedliches b ergeben:

y=mx+b oder y=m(x+b)

von Urs H. (uher)


Lesenswert?

Urs H. schrieb:
> Die Formel passt ansonsten

Ich hatte nur ein richtiges Zufalls-Ergebnis!
Also nochmal:

Y=mA  X=Wert
100  3522  (Ymin/Xmax)
200  3435
300  3348
400  3261
500  3174
600  3087
700  3000
800  2913
900  2826
1000  2739
1100  2652
1200  2565
1300  2478
1400  2391
1500  2304  (Ymax/Xmin)

Die Formel so ich sie hoffentlich richtig verstehe:
y = y_min + ((y_max-y_min)/(x_max-x_min))  *(x-x_min)

Ymin = 100
Ymax-Ymin = 1500-100 = 1400
Xmax-Xmin = 3522-2304 = 1218

Beispiel:
Ich möchte für den Messwert X=3000 das zugehörige Y= 700 ausrechnen.

Also:
Y = 100 + (1400/1218) * 3000-2304
Y=  100 + 1,1494*696
Y=  100+800 = 900!

Also Unsinn. Oder was habe ich hier falsch gemacht?

A. S. schrieb:
> Man nutzt i.d.r ja auch nicht die Formel

Ich brauche nur die richtige Formel.
Und bitte unzureichende mathematische Kenntnisse zu entschuldigen.

: Bearbeitet durch User
von Achim S. (Gast)


Lesenswert?

Urs H. schrieb:
> Ich brauche nur die richtige Formel.

Die Formel ist richtig, falsch ist die Interpretation, wofür ymin und 
ymax bzw. xmin und xmax stehen.

min bedeutet hier nicht den minimalen Absolutwert. Sondern es steht 
jeweils für den Wert am Anfang deines Bereichs.

max bedeutet hier nicht den größten Absolutwert. Sondern den Wert am 
Ende deines Bereichs.

Wenn du also mit ymin=100mA und xmin=3522 rechnest, geht es auf. Du 
darfst auch den Bereich umdrehen und ymin=1500mA und xmin=2304 rechnen. 
Du darfst die min-max-Zuordnung nur nicht bei x und y "mischen".

von Urs H. (uher)


Lesenswert?

Achim S. schrieb:
> min bedeutet hier nicht den minimalen Absolutwert. Sondern es steht
> jeweils für den Wert am Anfang deines Bereichs.
>
> max bedeutet hier nicht den größten Absolutwert. Sondern den Wert am
> Ende deines Bereichs.

Danke
Nun hab ich's endlich.
Passt.

von df2ds (Gast)


Lesenswert?

Na also.

Deshalb hatte ich in dem angehängten Listing schon "min" und "max" durch 
"links" und "rechts" ersetzt.

Schön, dass es jetzt funktioniert.

von Urs H. (uher)


Angehängte Dateien:

Lesenswert?

df2ds schrieb:
> Schön, dass es jetzt funktioniert.

Ja, und zwar ganz praktisch und nicht nur als Erleuchtung in der Birne 
;)
Vielen Dank auch an Dich!

von Pandur S. (jetztnicht)


Lesenswert?

Das Ganze geht uebrigens auch ohne aufwendigen Float. Indem man die 
Temperatur, Strom, Spannung zB 4 Stellen abbildet und deren letzte Zwei 
als implizites Nachkomma betrachtet.

1189 = 11.89

von W.S. (Gast)


Lesenswert?

Urs H. schrieb:
> Ich suche für eine messtechnische Kalibrationsaufgabe eine allgemeine,
> einfache programmtechnische Lösung,

Dann schau in dein Mathe-Schulbuch. Mich erstaunt es immer wieder, wie 
sehr gar vielen Leuten hier die Grundlagenkenntnisse fehlen.

W.S.

von Urs H. (uher)


Lesenswert?

W.S. schrieb:
> Dann schau in dein Mathe-Schulbuch.

Schau Du in den Thread, der Fall ist längst gelöst. Schneller als 
gedacht!

W.S. schrieb:
> Mich erstaunt es immer wieder, wie sehr gar vielen Leuten hier die
> Grundlagenkenntnisse fehlen.

Mich erstaunt immer wieder, wie manche in solchen Foren statt schneller 
Hilfsangebote nur Plattformen zur eigenen Selbstdarstellung sehen.

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.