Lineare Interpolation
bearbeitet von Jörg ReinholzMoin!
> Hi,
>
> danke für deine Bemühung. Die Formel "y = y0 * (x1-x) / (x1-x0) + y1 * (x-x0) / (x1-x0)" is ide Aufgelöste Form von der, was ich als zaehle und nenner in meinem Programm habe. Beide geben dieselbe Ergebenisse zurück.
>
> Das problem liegt anscheint im Datum und dessen Umwandlung in Sekunden. Je ich mich dem zweiten Wert (x2) annähere, desto verdichten sich die berechneten Werte:
>
> ~~~
> double y0 = 1234.887;
> double y1 = 2453.778;
>
> Die berechneten Werte:
> 1316.1463999999999
> 1467.8306133333331
> 1665.0200906666664
> 1875.3555331555553
> 2068.1630221037035
> 2222.4090132622218
> 2330.3812070731847
> 2396.192829967486
> 2430.7439319869941
> 2446.0999773289977
> 2451.7305272877325
> 2453.3685054575462
> 2453.7234007276725
> 2453.7743600485114
> ~~~
>
> Ich weiss es nicht, ob das so korrekt wäre-
Das ist nicht mehr linear und könnte eine Folge davon sein, dass Du y1 den Wert von y gibst. Richtig ist es auf keinen Fall, also hat Deine Mechanik einen Fehler.
Du willst womöglich folgendes:
~~~
X1 Y1 - gesetzte Werte
x y - interpoliert :: y = Y1 + (Y2-Y1)/4 wenn delta x jeweils 1/4(x2-X1) ist.
x y - interpoliert :: Y = Y + 2*(Y2-Y1)/4 wenn delta x jeweils 1/4(x2-X1) ist.
x y - interpoliert :: Y = Y + 3*(Y2-Y1)/4 wenn delta x jeweils 1/4(x2-X1) ist.
X2 Y2
x y - interpoliert :: y = Y2 + (Y3-Y2)/4 wenn delta x jeweils 1/4(x3-X2) ist.
x y - interpoliert :: Y = Y + 2*(Y3-Y2)/4 wenn delta x jeweils 1/4(x3-X2) ist.
x y - interpoliert :: Y = Y + 3*(Y3-Y2)/4 wenn delta x jeweils 1/4(x3-X2) ist.
X3 Y3
x y - interpoliert :: y = Y3 + (Y4-Y3)/4 wenn delta x jeweils 1/4(x4-X3) ist.
x y - interpoliert :: Y = Y + 2*(Y4-Y3)/4 wenn delta x jeweils 1/4(x4-X3) ist.
x y - interpoliert :: Y = Y + 3*(Y4-Y3)/4 wenn delta x jeweils 1/4(x4-X3) ist.
X4 Y4
...
~~~
Du hast wie im Beispiel konstante Abstände zwischen den Punkten, kannst Dir also allerhand ersparen. Aber, Da, wo zum Zeitpunk X2 der Wert Y2 gemessen wurde, musst Du neu interpolieren und so weiter.
Du bekommst dann aber nicht EINE Line über die gesamte Messstrecke, sondern n-1 Linien zwischen den Messpunkten (deren Zahl n sei). Die wird (voraussichtlich!) gezackt sein.
**Du hast immer nicht kommuniziert, was Du wirklich willst. Eine gerade Linie oder eine gezackte Linie?**
Willst Du jedoch **genau eine **gerade** Linie über alle Messpunkte interpolieren**, dann setze in "meine" Formel
~~~
y = y0 * (x1-x) / (x1-x0) + y1 * (x-x0) / (x1-x0)
~~~
- für x0 das arithmetische Mittel der ersten (früheren) Hälfte der Messpunkte.
- für y0 das arithmetische Mittel der zugehörigen Messwerte
- für x1 das arithmetische Mittel der zweiten (späteren) Hälfte der Messpunkte.
- für y1 das arithmetische Mittel der zugehörigen Messwerte
Ist die Zahl der Messpunkte ungerade, dann berechne die vier arithmetischen Mittel jeweils einschließlich des mittleren Messwertes.
Die von Dir gezeigten Zahlen lassen kaum Rückschlüsse auf den Fehler zu. Ich müsste das nachprogrammieren und dann Deine Fehler spekulativ nachahmen. Da gibt es aber sehr viele Möglichkeiten, die ich dann mit Deinen Resultaten vergleichen müsste - was mir schlicht zu viel Aufwand ist. Deinen Fehler sehe ich ggf. in Deinem Code. So lange es nur um Mathe geht ist die Sprache halbwegs (Bis auf die Feinheiten Deiner DateTime-Objekte z.B.) egal.
Jörg Reinholz
Lineare Interpolation
bearbeitet von Jörg ReinholzMoin!
> Hi,
>
> danke für deine Bemühung. Die Formel "y = y0 * (x1-x) / (x1-x0) + y1 * (x-x0) / (x1-x0)" is ide Aufgelöste Form von der, was ich als zaehle und nenner in meinem Programm habe. Beide geben dieselbe Ergebenisse zurück.
>
> Das problem liegt anscheint im Datum und dessen Umwandlung in Sekunden. Je ich mich dem zweiten Wert (x2) annähere, desto verdichten sich die berechneten Werte:
>
> ~~~
> double y0 = 1234.887;
> double y1 = 2453.778;
>
> Die berechneten Werte:
> 1316.1463999999999
> 1467.8306133333331
> 1665.0200906666664
> 1875.3555331555553
> 2068.1630221037035
> 2222.4090132622218
> 2330.3812070731847
> 2396.192829967486
> 2430.7439319869941
> 2446.0999773289977
> 2451.7305272877325
> 2453.3685054575462
> 2453.7234007276725
> 2453.7743600485114
> ~~~
>
> Ich weiss es nicht, ob das so korrekt wäre-
Das ist nicht mehr linear und könnte eine Folge davon sein, dass Du y1 den Wert von y gibst. Richtig ist es auf keinen Fall, also hat Deine Mechanik einen Fehler.
Du willst womöglich folgendes:
~~~
X1 Y1 - gesetzte Werte
x y - interpoliert :: y = Y1 + (Y2-Y1)/4 wenn delta x jeweils 1/4(x2-X1) ist.
x y - interpoliert :: Y = Y + 2*(Y2-Y1)/4 wenn delta x jeweils 1/4(x2-X1) ist.
x y - interpoliert :: Y = Y + 3*(Y2-Y1)/4 wenn delta x jeweils 1/4(x2-X1) ist.
X2 Y2
x y - interpoliert :: y = Y2 + (Y3-Y2)/4 wenn delta x jeweils 1/4(x3-X2) ist.
x y - interpoliert :: Y = Y + 2*(Y3-Y2)/4 wenn delta x jeweils 1/4(x3-X2) ist.
x y - interpoliert :: Y = Y + 3*(Y3-Y2)/4 wenn delta x jeweils 1/4(x3-X2) ist.
X3 Y3
x y - interpoliert :: y = Y3 + (Y4-Y3)/4 wenn delta x jeweils 1/4(x4-X3) ist.
x y - interpoliert :: Y = Y + 2*(Y4-Y3)/4 wenn delta x jeweils 1/4(x4-X3) ist.
x y - interpoliert :: Y = Y + 3*(Y4-Y3)/4 wenn delta x jeweils 1/4(x4-X3) ist.
X4 Y4
...
~~~
Du hast wie im Beispiel konstante Abstände zwischen den Punkten, kannst Dir also allerhand ersparen. Aber, Da, wo zum Zeitpunk X2 der Wert Y2 gemessen wurde, musst Du neu interpolieren und so weiter.
Du bekommst dann aber nicht EINE Line über die gesamte Messstrecke, sondern n-1 Linien zwischen den Messpunkten (deren Zahl n sei). Diw wird (voraussichtlich!) gezackt sein.
Willst Du jedoch **genau eine Linie über alle Messpunkte interpolieren**, dann setze in "meine" Formel
~~~
y = y0 * (x1-x) / (x1-x0) + y1 * (x-x0) / (x1-x0)
~~~
- für x0 das arithmetische Mittel der ersten (früheren) Hälfte der Messpunkte.
- für y0 das arithmetische Mittel der zugehörigen Messwerte
- für x1 das arithmetische Mittel der zweiten (späteren) Hälfte der Messpunkte.
- für y1 das arithmetische Mittel der zugehörigen Messwerte
Ist die Zahl der Messpunkte ungerade, dann berechne die vier arithmetischen Mittel jeweils einschließlich des mittleren Messwertes.
Die von Dir gezeigten Zahlen lassen kaum Rückschlüsse auf den Fehler zu. Ich müsste das nachprogrammieren und dann Deine Fehler spekulativ nachahmen. Da gibt es aber sehr viele Möglichkeiten, die ich dann mit Deinen Resultaten vergleichen müsste - was mir schlicht zu viel Aufwand ist. Deinen Fehler sehe ich ggf. in Deinem Code. So lange es nur um Mathe geht ist die Sprache halbwegs (Bis auf die Feinheiten Deiner DateTime-Objekte z.B.) egal.
Jörg Reinholz
Lineare Interpolation
bearbeitet von Jörg ReinholzMoin!
> Hi,
>
> danke für deine Bemühung. Die Formel "y = y0 * (x1-x) / (x1-x0) + y1 * (x-x0) / (x1-x0)" is ide Aufgelöste Form von der, was ich als zaehle und nenner in meinem Programm habe. Beide geben dieselbe Ergebenisse zurück.
>
> Das problem liegt anscheint im Datum und dessen Umwandlung in Sekunden. Je ich mich dem zweiten Wert (x2) annähere, desto verdichten sich die berechneten Werte:
>
> ~~~
> double y0 = 1234.887;
> double y1 = 2453.778;
>
> Die berechneten Werte:
> 1316.1463999999999
> 1467.8306133333331
> 1665.0200906666664
> 1875.3555331555553
> 2068.1630221037035
> 2222.4090132622218
> 2330.3812070731847
> 2396.192829967486
> 2430.7439319869941
> 2446.0999773289977
> 2451.7305272877325
> 2453.3685054575462
> 2453.7234007276725
> 2453.7743600485114
> ~~~
>
> Ich weiss es nicht, ob das so korrekt wäre-
Das ist nicht mehr linear und könnte eine Folge davon sein, dass Du y1 den Wert von y gibst. Richtig ist es auf keinen Fall, also hat Deine Mechanik einen Fehler.
Du willst womöglich folgendes:
~~~
X1 Y1 - gesetzte Werte
x y - interpoliert :: y = Y1 + (Y2-Y1)/4 wenn delta x jeweils 1/4(x2-X1) ist.
x y - interpoliert :: Y = Y + 2*(Y2-Y1)/4 wenn delta x jeweils 1/4(x2-X1) ist.
x y - interpoliert :: Y = Y + 3*(Y2-Y1)/4 wenn delta x jeweils 1/4(x2-X1) ist.
X2 Y2
x y - interpoliert :: y = Y2 + (Y3-Y2)/4 wenn delta x jeweils 1/4(x3-X2) ist.
x y - interpoliert :: Y = Y + 2*(Y3-Y2)/4 wenn delta x jeweils 1/4(x3-X2) ist.
x y - interpoliert :: Y = Y + 3*(Y3-Y2)/4 wenn delta x jeweils 1/4(x3-X2) ist.
X3 Y3
x y - interpoliert :: y = Y3 + (Y4-Y3)/4 wenn delta x jeweils 1/4(x4-X3) ist.
x y - interpoliert :: Y = Y + 2*(Y4-Y3)/4 wenn delta x jeweils 1/4(x4-X3) ist.
x y - interpoliert :: Y = Y + 3*(Y4-Y3)/4 wenn delta x jeweils 1/4(x4-X3) ist.
X4 Y4
...
~~~
Du hast wie im Beispiel konstante Abstände zwischen den Punkten, kannst Dir also allerhand ersparen. Aber, Da, wo zum Zeitpunk X2 der Wert Y2 gemessen wurde, musst Du neu interpolieren und so weiter.
Du bekommst dann aber nicht EINE Line über die gesamte Messstrecke, sondern n-1 Linien zwischen den Messpunkten (deren Zahl n sei). Di kann gezackt sein.
Willst Du jedoch **genau eine Linie über alle Messpunkte interpolieren**, dann setze in "meine" Formel
~~~
y = y0 * (x1-x) / (x1-x0) + y1 * (x-x0) / (x1-x0)
~~~
- für x0 das arithmetische Mittel der ersten (früheren) Hälfte der Messpunkte.
- für y0 das arithmetische Mittel der zugehörigen Messwerte
- für x1 das arithmetische Mittel der zweiten (späteren) Hälfte der Messpunkte.
- für y1 das arithmetische Mittel der zugehörigen Messwerte
Ist die Zahl der Messpunkte ungerade, dann berechne die vier arithmetischen Mittel jeweils einschließlich des mittleren Messwertes.
Die von Dir gezeigten Zahlen lassen kaum Rückschlüsse auf den Fehler zu. Ich müsste das nachprogrammieren und dann Deine Fehler spekulativ nachahmen. Da gibt es aber sehr viele Möglichkeiten, die ich dann mit Deinen Resultaten vergleichen müsste - was mir schlicht zu viel Aufwand ist. Deinen Fehler sehe ich ggf. in Deinem Code. So lange es nur um Mathe geht ist die Sprache halbwegs (Bis auf die Feinheiten Deiner DateTime-Objekte z.B.) egal.
Jörg Reinholz
Lineare Interpolation
bearbeitet von Jörg ReinholzMoin!
> Hi,
>
> danke für deine Bemühung. Die Formel "y = y0 * (x1-x) / (x1-x0) + y1 * (x-x0) / (x1-x0)" is ide Aufgelöste Form von der, was ich als zaehle und nenner in meinem Programm habe. Beide geben dieselbe Ergebenisse zurück.
>
> Das problem liegt anscheint im Datum und dessen Umwandlung in Sekunden. Je ich mich dem zweiten Wert (x2) annähere, desto verdichten sich die berechneten Werte:
>
> ~~~
> double y0 = 1234.887;
> double y1 = 2453.778;
>
> Die berechneten Werte:
> 1316.1463999999999
> 1467.8306133333331
> 1665.0200906666664
> 1875.3555331555553
> 2068.1630221037035
> 2222.4090132622218
> 2330.3812070731847
> 2396.192829967486
> 2430.7439319869941
> 2446.0999773289977
> 2451.7305272877325
> 2453.3685054575462
> 2453.7234007276725
> 2453.7743600485114
> ~~~
>
> Ich weiss es nicht, ob das so korrekt wäre-
Das ist nicht mehr linear und könnte eine Folge davon sein, dass Du y1 den Wert von y gibst. Richtig ist es auf keinen Fall, also hat Deine Mechanik einen Fehler.
Du willst womöglich folgendes:
~~~
X1 Y1 - gesetzte Werte
x y - interpoliert :: y = Y1 + (Y2-Y1)/4 wenn delta x jeweils 1/4(x2-X1) ist.
x y - interpoliert :: Y = Y (Y2-Y1)/4 wenn delta x jeweils 1/4(x2-X1) ist.
x y - interpoliert :: Y = Y (Y2-Y1)/4 wenn delta x jeweils 1/4(x2-X1) ist.
X2 Y2
x y - interpoliert :: y = Y2 + (Y3-Y2)/4 wenn delta x jeweils 1/4(x3-X2) ist.
x y - interpoliert :: Y = Y (Y3-Y2)/4 wenn delta x jeweils 1/4(x3-X2) ist.
x y - interpoliert :: Y = Y (Y3-Y2)/4 wenn delta x jeweils 1/4(x3-X2) ist.
X3 Y3
x y - interpoliert :: y = Y3 + (Y4-Y3)/4 wenn delta x jeweils 1/4(x4-X3) ist.
x y - interpoliert :: Y = Y (Y4-Y3)/4 wenn delta x jeweils 1/4(x4-X3) ist.
x y - interpoliert :: Y = Y (Y4-Y3)/4 wenn delta x jeweils 1/4(x4-X3) ist.
X4 Y4
...
~~~
Du hast wie im Beispiel konstante Abstände zwischen den Punkten, kannst Dir also allerhand ersparen. Aber, Da, wo zum Zeitpunk X2 der Wert Y2 gemessen wurde, musst Du neu interpolieren und so weiter.
Du bekommst dann aber nicht EINE Line über die gesamte Messstrecke, sondern n-1 Linien zwischen den Messpunkten (deren Zahl n sei). Di kann gezackt sein.
Willst Du jedoch **genau eine Linie über alle Messpunkte interpolieren**, dann setze in "meine" Formel
~~~
y = y0 * (x1-x) / (x1-x0) + y1 * (x-x0) / (x1-x0)
~~~
- für x0 das arithmetische Mittel der ersten (früheren) Hälfte der Messpunkte.
- für y0 das arithmetische Mittel der zugehörigen Messwerte
- für x1 das arithmetische Mittel der zweiten (späteren) Hälfte der Messpunkte.
- für y1 das arithmetische Mittel der zugehörigen Messwerte
Ist die Zahl der Messpunkte ungerade, dann berechne die vier arithmetischen Mittel jeweils einschließlich des mittleren Messwertes.
Die von Dir gezeigten Zahlen lassen kaum Rückschlüsse auf den Fehler zu. Ich müsste das nachprogrammieren und dann Deine Fehler spekulativ nachahmen. Da gibt es aber sehr viele Möglichkeiten, die ich dann mit Deinen Resultaten vergleichen müsste - was mir schlicht zu viel Aufwand ist. Deinen Fehler sehe ich ggf. in Deinem Code. So lange es nur um Mathe geht ist die Sprache halbwegs (Bis auf die Feinheiten Deiner DateTime-Objekte z.B.) egal.
Jörg Reinholz
Lineare Interpolation
bearbeitet von Jörg ReinholzMoin!
> Hi,
>
> danke für deine Bemühung. Die Formel "y = y0 * (x1-x) / (x1-x0) + y1 * (x-x0) / (x1-x0)" is ide Aufgelöste Form von der, was ich als zaehle und nenner in meinem Programm habe. Beide geben dieselbe Ergebenisse zurück.
>
> Das problem liegt anscheint im Datum und dessen Umwandlung in Sekunden. Je ich mich dem zweiten Wert (x2) annähere, desto verdichten sich die berechneten Werte:
>
> ~~~
> double y0 = 1234.887;
> double y1 = 2453.778;
>
> Die berechneten Werte:
> 1316.1463999999999
> 1467.8306133333331
> 1665.0200906666664
> 1875.3555331555553
> 2068.1630221037035
> 2222.4090132622218
> 2330.3812070731847
> 2396.192829967486
> 2430.7439319869941
> 2446.0999773289977
> 2451.7305272877325
> 2453.3685054575462
> 2453.7234007276725
> 2453.7743600485114
> ~~~
>
> Ich weiss es nicht, ob das so korrekt wäre-
Das ist nicht mehr linear und könnte eine Folge davon sein, dass Du y1 den Wert von y gibst. Richtig ist es auf keinen Fall, also hat Deine Mechanik einen Fehler.
Du willst womöglich folgendes:
X1 Y1 - gesetzte Werte
x y - interpoliert :: y = Y1 + (Y2-Y1)/4 wenn delta x jeweils 1/4(x2-X1) ist.
x y - interpoliert :: Y = Y (Y2-Y1)/4 wenn delta x jeweils 1/4(x2-X1) ist.
x y - interpoliert :: Y = Y (Y2-Y1)/4 wenn delta x jeweils 1/4(x2-X1) ist.
X2 Y2
x y - interpoliert :: y = Y2 + (Y3-Y2)/4 wenn delta x jeweils 1/4(x3-X2) ist.
x y - interpoliert :: Y = Y (Y3-Y2)/4 wenn delta x jeweils 1/4(x3-X2) ist.
x y - interpoliert :: Y = Y (Y3-Y2)/4 wenn delta x jeweils 1/4(x3-X2) ist.
X3 Y3
x y - interpoliert :: y = Y3 + (Y4-Y3)/4 wenn delta x jeweils 1/4(x4-X3) ist.
x y - interpoliert :: Y = Y (Y4-Y3)/4 wenn delta x jeweils 1/4(x4-X3) ist.
x y - interpoliert :: Y = Y (Y4-Y3)/4 wenn delta x jeweils 1/4(x4-X3) ist.
X4 Y4
...
Du hast wie im Beispiel konstante Abstände zwischen den Punkten, kannst Dir also allerhand ersparen. Aber, Da, wo zum Zeitpunk X2 der Wert Y2 gemessen wurde, musst Du neu interpolieren und so weiter.
Du bekommst dann aber nicht EINE Line über die gesamte Messstrecke, sondern n-1 Linien zwischen den Messpunkten (deren Zahl n sei). Di kann gezackt sein.
Willst Du jedoch **genau eine Linie über alle Messpunkte interpolieren**, dann setze in "meine" Formel
y = y0 * (x1-x) / (x1-x0) + y1 * (x-x0) / (x1-x0)
- für x0 das arithmetische Mittel der ersten (früheren) Hälfte der Messpunkte.
- für y0 das arithmetische Mittel der zugehörigen Messwerte
- für x1 das arithmetische Mittel der zweiten (späteren) Hälfte der Messpunkte.
- für y1 das arithmetische Mittel der zugehörigen Messwerte
Ist die Zahl der Messpunkte ungerade, dann berechne die vier arithmetischen Mittel jeweils einschließlich des mittleren Messwertes.
Die von Dir gezeigten Zahlen lassen kaum Rückschlüsse auf den Fehler zu. Ich müsste das nachprogrammieren und dann Deine Fehler spekulativ nachahmen. Da gibt es aber sehr viele Möglichkeiten, die ich dann mit Deinen Resultaten vergleichen müsste - was mir schlicht zu viel Aufwand ist. Deinen Fehler sehe ich ggf. in Deinem Code. So lange es nur um Mathe geht ist die Sprache halbwegs (Bis auf die Feinheiten Deiner DateTime-Objekte z.B.) egal.
Jörg Reinholz