Das Problem ist alt und gut bekannt:
Ich habe einen Eingangswert, zu dem ich einen Ausgangswert bestimmen möchte, wo bei der Zusammenhang sich schwer oder gar nicht als mathematische Formel darstellen läßt, wohl aber recht einfach als Kurve mit vielen Stützstellen und linearer interpolation dazwischen.
Die Lösung ist auch alt und gut bekannt:
Man hat eine Tabelle der Stützstellen (x/y) im Speicher die nach x sortiert ist. Das Programm sucht die beiden Punkte, deren x-Werte den gegebenen Eingangswert einschließen und berechnet den gesuchten y-Wert per linearer Interpolation.
Wünschenswert wäre, wenn wie bei anderen Berechnungen auch, das Ergebnis noch im selben Zyklus vorliegen würde, in dem sich der Eingangswert geändert hat...
Ich habe da an folgenden Code gedacht, kann ihn aber derzeit nicht testen. Würde der funktionieren?
[highlight=epc]
// Bei Systemstart das Array mit (x/y)-Wertepaaren belegen
// dabei gilt x0 muss kleiner oder gleich dem kleinsten im Betrieb
// für x zu erwartenden Wert sein, (sonst wird kein y berechnet)
// der letzte x-Wert xn muss größer oder gleich dem groeßten im
// Betrieb für x zu erwartenden Wert sein (sonst wird der Index
// ueber das Array-Ende hinaus inkrementiert), und die x-Werte
// muessen streng monoton steigen: x0<x1<x2<x3< ... <xn
// Die y-Werte duerfen beliebig sein.
if systemstart() then {
i=1u16
x=0.0f32
y=0.0f32
stringset(Array,x00,0u16)
stringset(Array,y00,4u16)
stringset(Array,x01,8u16)
stringset(Array,y01,12u16)
...
stringset(Array,x30,240u16)
stringset(Array,y30,244u16)
stringset(Array,x31,248u16)
stringset(Array,y31,252u16)
} endif
// Wenn sich x aendert wird der Array-Index auf 0 gesetzt
if change(x) then i=0u16 endif
// Wenn der Index sich ändert neue Wertepaare aus dem Array holen.
// Da es sein kann, das er beim letzten mal i mit 0 zurückgelassen wurde
// und event() bei Variablen nicht funktioniert,
// wird auch auf Aenderungen von x getriggert
if change(i) or change(x) then {
xu=stringcast(Array,x,i)
yu=stringcast(Array,y,i+4)
xo=stringcast(Array,x,i+8)
yo=stringcast(Array,y,i+12)
} endif
// Wenn sich x oder die Vergleichswerte ändern, dann
// wenn x innerhalb von xu und xo liegt, dann
// y neu berechnen sonst weiter mit den naechsten Wertepaaren
if change(x) or change(xu) or change(xo) then {
if ( xu <= x) and (x <= xo) then y = (yo-yu)*(x-xu)/(xo-xu)+yo else i = i+8 endif
} endif
[/highlight]
Ich habe einen Eingangswert, zu dem ich einen Ausgangswert bestimmen möchte, wo bei der Zusammenhang sich schwer oder gar nicht als mathematische Formel darstellen läßt, wohl aber recht einfach als Kurve mit vielen Stützstellen und linearer interpolation dazwischen.
Die Lösung ist auch alt und gut bekannt:
Man hat eine Tabelle der Stützstellen (x/y) im Speicher die nach x sortiert ist. Das Programm sucht die beiden Punkte, deren x-Werte den gegebenen Eingangswert einschließen und berechnet den gesuchten y-Wert per linearer Interpolation.
Wünschenswert wäre, wenn wie bei anderen Berechnungen auch, das Ergebnis noch im selben Zyklus vorliegen würde, in dem sich der Eingangswert geändert hat...
Ich habe da an folgenden Code gedacht, kann ihn aber derzeit nicht testen. Würde der funktionieren?
[highlight=epc]
// Bei Systemstart das Array mit (x/y)-Wertepaaren belegen
// dabei gilt x0 muss kleiner oder gleich dem kleinsten im Betrieb
// für x zu erwartenden Wert sein, (sonst wird kein y berechnet)
// der letzte x-Wert xn muss größer oder gleich dem groeßten im
// Betrieb für x zu erwartenden Wert sein (sonst wird der Index
// ueber das Array-Ende hinaus inkrementiert), und die x-Werte
// muessen streng monoton steigen: x0<x1<x2<x3< ... <xn
// Die y-Werte duerfen beliebig sein.
if systemstart() then {
i=1u16
x=0.0f32
y=0.0f32
stringset(Array,x00,0u16)
stringset(Array,y00,4u16)
stringset(Array,x01,8u16)
stringset(Array,y01,12u16)
...
stringset(Array,x30,240u16)
stringset(Array,y30,244u16)
stringset(Array,x31,248u16)
stringset(Array,y31,252u16)
} endif
// Wenn sich x aendert wird der Array-Index auf 0 gesetzt
if change(x) then i=0u16 endif
// Wenn der Index sich ändert neue Wertepaare aus dem Array holen.
// Da es sein kann, das er beim letzten mal i mit 0 zurückgelassen wurde
// und event() bei Variablen nicht funktioniert,
// wird auch auf Aenderungen von x getriggert
if change(i) or change(x) then {
xu=stringcast(Array,x,i)
yu=stringcast(Array,y,i+4)
xo=stringcast(Array,x,i+8)
yo=stringcast(Array,y,i+12)
} endif
// Wenn sich x oder die Vergleichswerte ändern, dann
// wenn x innerhalb von xu und xo liegt, dann
// y neu berechnen sonst weiter mit den naechsten Wertepaaren
if change(x) or change(xu) or change(xo) then {
if ( xu <= x) and (x <= xo) then y = (yo-yu)*(x-xu)/(xo-xu)+yo else i = i+8 endif
} endif
[/highlight]
Kommentar