So, nach dem meine vorherige Frage in einen Bereich verschoben wurde, der mit dem Thema gar nichts zu tun hat und dort dementsprechend auch nicht verstanden wurde, versuche ich, das Problem mal anders darzustellen.
Es geht mir hier um eine rein mathematische Fragestellung und dementsprechend auch um eine rein mathematische Lösung für exakt dieses Problem.
Eigentlich kann die Lösung nicht so kompliziert sein, allerdings stehe ich gerade komplett auf dem Schlauch:
Ich habe einen Wertebereich (der als linear anzunehmen ist) mit Messwerten, bei denen ich real folgende Werte habe:
Minimalwert ist 193
Mittelwert ist 2221
Maximalwert ist 4070
Der interne Wertebereich, den ich zur Verfügung habe, geht von 0 bis 4095.
Jetzt würde ich die realen Werte gerne so skalieren, dass sie einerseits den internen Wertebereich so gut wie möglich ausnutzen (bis ganz nach 0 wird es auf Grund des hohen realen Minimalwertes wohl nicht gehen können!?), andererseits der Mittlerwert bei exakt 2048 liegt.
Heißt, ich muss einen Skalierungsfaktor und einen Offset ermitteln, der diese Bedingungen erfüllt und mit denen ich jeden anderen, realen Messwert im Bereich 193..4070 auf eben den internen Wert im Bereich von 0..4095 konvertieren kann. Rechenleistung ist dabei kein Problem, Fließpunktzahlen sind vorhanden.
Wie kriege ich hier einen passenden Offset und Faktor ermittelt?
Heißt, ich muss einen Skalierungsfaktor und einen Offset ermitteln, der
diese Bedingungen erfüllt und mit denen ich jeden anderen, realen
Messwert im Bereich 193..4070 auf eben den internen Wert im Bereich von
0..4095 konvertieren kann. Rechenleistung ist dabei kein Problem,
Fließpunktzahlen sind vorhanden.
PS: Wenn ungenaue floats erlaubt sind, normalisiere ich gerne auf 0..1. Also "(double)(value-min)/(max-min)". Dass kann man dann einfach mit 4095 multiplizieren, und schon geht's von 0..4095. Und wenn man mehrere Werte im Bereich 0..1 hat, kann man die auch multiplizieren usw., und hat wieder einen Wert von 0..1. Es wird alles einfacher, sobald man merkt, das 100% = 100/100 = 1 ist.
Ich habe einen Wertebereich (der als linear anzunehmen ist)
Wenn Du die 3 Werte in ein Koordinatensystem einträgst, wirst Du sehen, dass Du da keine Gerade durchziehen kannst. Der Wertebereich ist daher nicht linear.
Wie kriege ich hier einen passenden Offset und Faktor ermittelt?
Wenn Du einen Deiner 3 Punkte ignorierst, ist das einfach:
Geradengleichung ist:
1
y = a * x + b
Bestimmung von Steigung a:
1
a=(y2–y1)/(x2–x1)
Fehlt nur noch der y-Achsenabschnitt b:
1
b = y - a * x
Konkret für Punkt (x1,y1):
1
b = y1 - a * x1
Das ganze klappt aber nur mit 2 Punkten. Wenn der Wertebereich tatsächlich linear wäre, dann könntest Du einen der 3 Punkte ignorieren. Geht aber nicht, da die 3 Punkte nicht auf einer Geraden liegen. Egal, welche zwei Punkte Du von den dreien auswählst, wirst Du jedesmal eine andere Geradengleichung erhalten - eben weil sie nicht auf einer Geraden liegen.
Egal, wie oft Du für das Thema einen neuen Thread öffnest, wirst Du keine zufriedenstellende Lösung erhalten. Das liegt daran, dass Deine Annahme, der Wertebereich sei linear, für die angegebenen Punkte einfach falsch ist.
Also: Entweder sind die 3 Punkte (damit Deine Messung) falsch oder Deine Annahme ist falsch. Dieser Widerspruch ist durch wiederholte Fragen einfach nicht auflösbar.
Tipp:
Ziehe eine Gerade durch den minimalen und den mittleren Punkt. Ziehe eine zweite Gerade durch den mittleren Punkt zum maximalen Punkt. Wende darauf die obigen Formeln an. Dann erhältst Du zwei Geradengleichungen. Mit der ersten Geradengleichung kannst Du dann Punkt zwischen Min und Mittel extrapolieren, mit der zweiten Geradengleichung die Punkte zwischen Mittel und Max. Immerhin ist das einfacher als mit Polynomen herumrechnen zu müssen. Die Genauigkeit wird vielleicht Deinen Ansprüchen nicht genügen. Das ist aber Dein Problem.
Alternativ könntest Du Deine Messwerte anzweifeln und da nochmal neu ansetzen.
Was du allerdings machen könntest, wäre aus den drei Meßpunkten eine Gerade zu berechnen, die die Summe der Fehlerquadrate minimiert. Das geht recht einfach in Excel. Trage deine drei Punkte ein, erstelle daraus einen xy-Graphen, und wähle dann "lineare Interpolation" und "Formel einblenden". Dann zeigt Excel dir Offset und Faktor einer "besten" Annäherung.
Minimalwert ist 193
Mittelwert ist 2221
Maximalwert ist 4070
Der interne Wertebereich, den ich zur Verfügung habe, geht von 0 bis
4095.
Jetzt würde ich die realen Werte gerne so skalieren, dass sie einerseits
den internen Wertebereich so gut wie möglich ausnutzen (bis ganz nach 0
wird es auf Grund des hohen realen Minimalwertes wohl nicht gehen
können!?), andererseits der Mittlerwert bei exakt 2048 liegt.
Weil das offenbar sehr viel mit "ich will unbedingt!" zu tun hat, würde ich die Eingangswerte mit zwei(!) unabhängigen(!) Geraden so skalieren, dass 193..2220 auf 0..2047 sowie der Bereich 2221..4070 auf 2048..4095 abgebildet werden. Brute Force at its best.
Es geht mir hier um eine rein mathematische Fragestellung und
dementsprechend auch um eine rein mathematische Lösung für exakt dieses
Problem.
Rein mathematisch hast du erstmal 3 Gleichungen fuer 3 Punkte in deinem Bereich. Daraus kannst du dir 3 Unbekannte errechnen - das gibt eine quadratische Funktion (Polynom 2.Kajuete). Die wurde dir schon vorexerziert und geht exakt durch die 3 gegebenen Punkte.
Du kannst aber auch hergehen und sagen: Ich will da mit Gewalt eine Gerade, also ein Polynom 1.Kajuete, durchlegen - dann hast du 2 Moeglichkeiten:
1.) Du laesst aus deinen 3 Gleichungen fuer 3 Punkte einfach mal eine Gleichung weg, evtl. die, wo du spaeter Abweichungen am besten tolerieren kannst. Dann berechnest du die Gerade fuer diesen Fall und lebst mit der Abweichung, die du dann fuer die weggelassene Gleichung hast.
2.) Du hast ein ueberbestimmtes Gleichungssystem, da kannst du in deinem Fall eine Gleichung fuer eine Gerade berechnen, bei der der Fehler, also die (Quadrate der) Abweichung zur quadratischen Funktion minimal wird.
Dann geht deine Gerade aber wahrscheinlich durch keinen der gegebenen Punkte genau, sondern halt nur so ungefaehr. Aber das beste Ungefaehr, was du kriegen kannst.
recht viel mehr wird das Problem wohl nicht hergeben, vermute ich mal.
würde ich die Eingangswerte mit zwei(!) unabhängigen(!) Geraden so
skalieren, dass 193..2220 auf 0..2047 sowie der Bereich 2221..4070 auf
2048..4095 abgebildet werden. Brute Force at its best.
Eigentlich kann die Lösung nicht so kompliziert sein, allerdings stehe
ich gerade komplett auf dem Schlauch
Ich finde es immer wieder erstaunlich, dass genau die Leute, die es selber nicht hinbekommen, sich oft anmaßen, den Kompliziertheitsgrad einer Lösung als "nicht so kompliziert" beurteilen zu können.
Und nein, es ist in der Tat nicht sonderlich kompliziert.
Ich habe einen Wertebereich (der als linear anzunehmen ist) mit
Messwerten, bei denen ich real folgende Werte habe:
Minimalwert ist 193
Mittelwert ist 2221
Maximalwert ist 4070
Was ist ein "linearer Wertebereich"?
Bevor du mit solchen Begriffen um dich wirfst, solltest du wenigstens ein ganz klein wenig verstehen, wovon du sprichst. Der Mittelwert hängt von der Verteilung deiner Messwerte ab und ist eine statistische Größe. Woraus ist deine 2221 gemittelt? Falls es die Mitte zwischen Minimal- und Maximalwert sein soll, hast du einen NICHTlinearen Zusammenhang. Dein Annahme wäre dann falsch. Eine andere Möglichkeit ist, dass deine Messwerte fehlerbehaftet sind und den funktionalen Zusammenhang nur innerhalb eines gewissen Fehlerbandes darstellen. Eine weitere Möglichkeit ist, dass der Zusammenhang nichtlinear ist, du das Verhalten aber nur an diesen drei Punkten kennst und damit eine Parabel die rein mathematische Lösung für dein Problem wäre. Oder du beharrst auf "Linear" und betrachtest den Zusammenhang als abschnittsweise linear, wie von Lother vorgeschlagen, darfst dich dann aber nicht über den Knick beim mittleren Wert wundern.