Ankündigung

Einklappen

Serverwartung 21.2.



Am 21.2. im Laufe des späten Abends wird eine Serverwartung durchgeführt. Das Forum ist dadurch für gut zwei Stunden nicht erreichbar.
Es wird eine Wartungsseite geschaltet.

Mehr anzeigen
Weniger anzeigen

Lookuptabelle für lineare Approximation

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    [eibPC] Lookuptabelle für lineare Approximation

    [highlight=epc]
    //----------------------------------------------------------------------
    // Makros für den Enertex EiBPC
    //
    // Zweck : Makros um aus Stützstellen einen
    // linear interpolierten Wert zu ermitteln
    //
    // Version : V 1.3, März 2012
    //
    // Autor + Copyright : Bernd Meiners
    //
    //----------------------------------------------------------------------
    //
    // // Benutzung: NAME ist hier als eindeutiger Tabellenname gewählt
    //
    // // Zunächst das "Grundeinstellen" der Parameter, also Name, min und max
    // SetupStaticLookupTable( NAME, 0.0f32, 360.0f32 )
    //
    // // Dann pro Datenpunkt den man haben möchte ein XY-Paar anlegen.
    // // Dabei muß darauf Rücksicht genommen werden, das die Werte aufsteigen
    // // und keine negative Steigung entsteht.
    // AddStaticPoint(NAME, 0.0f32, 100.0f32 )
    // AddStaticPoint(NAME, 90.0f32, 100.0f32 )
    // AddStaticPoint(NAME, 95.0f32, 10.0f32 )
    // AddStaticPoint(NAME, 140.0f32, 10.0f32 )
    // AddStaticPoint(NAME, 150.0f32, 30.0f32 )
    // AddStaticPoint(NAME, 170.0f32, 40.0f32 )
    // AddStaticPoint(NAME, 190.0f32, 40.0f32 )
    // AddStaticPoint(NAME, 210.0f32, 30.0f32 )
    // AddStaticPoint(NAME, 220.0f32, 10.0f32 )
    // AddStaticPoint(NAME, 265.0f32, 10.0f32 )
    // AddStaticPoint(NAME, 270.0f32, 100.0f32 )
    // AddStaticPoint(NAME, 360.0f32, 100.0f32 )

    // // Der tatsächliche Vergleich erfolgt in diesem Makro, dort
    // // wir auch der Sonderfall x0 == x1 berücksichtigt.
    // DoStaticLookup(NAME)
    //
    // // Die Berechnung findet dann statt, wenn sich im vorigen Zyklus
    // // der Wert für NAME_xin geändert hat.
    // // Das Ergebnis findet sich direkt nach dem DoStaticLookup
    // // in NAME_yout

    :begin SetupStaticLookupTable( Name, XMin, XMax)
    :info $Legt die LookupTabelle mit den Grundvariablen an$
    // Die Werte für Eingabe und Ausgabe
    Name_xin = 0.0f32
    Name_yout = 0.0f32
    Name_NumPoints = 0u16
    Name_Index = 0u16
    Name_x0 = 0.0f32
    Name_x1 = 0.0f32
    Name_y0 = 0.0f32
    Name_y1 = 0.0f32

    // Bei Änderung immer für neue Berechnung sorgen
    if change( Name_xin ) then {
    Name_x0 = XMin;
    Name_x1 = XMax;
    Name_y0 = 0.0f32;
    Name_y1 = 0.0f32;
    Name_Index = 0u16;
    } endif
    :end

    :begin AddStaticPoint( Name, X0, Y0 )
    :info $Fügt ein Wertepaar an die Lookuptabelle an$
    :var NameX@
    :var NameY@
    :var NamePoint@
    NameX@ = X0
    NameY@ = Y0
    NamePoint@ = 0u16

    if systemstart() then NamePoint@ = Name_Index endif

    // nur neu berechnen, wenn sich der Eingangswert verändert hat
    if change( Name_xin ) and !systemstart() then {
    if Name_Index == 0u16 then {
    Name_x0 = NameX@;
    Name_y0 = NameY@;
    } endif;

    if Name_xin >= NameX@ then {
    if NameX@ > Name_x0 then {
    Name_x0 = NameX@;
    Name_y0 = NameY@;
    } endif;
    } endif;

    if Name_xin <= NameX@ then {
    if NameX@ < Name_x1 then {
    Name_x1 = NameX@;
    Name_y1 = NameY@;
    } endif;
    } endif;
    Name_Index = Name_Index + 1u16;
    } endif

    if systemstart() then {
    Name_NumPoints = max( Name_NumPoints, Name_Index);
    Name_Index = Name_Index + 1u16;
    } endif
    :return
    :end

    :begin DoStaticLookup( Name )
    :info $Führt die Approximation durch$
    // jetzt nur noch eine Lineare Approximation
    if change( Name_xin ) and !systemstart() then {
    if Name_x0 == Name_x1 then {
    Name_yout = Name_y0;
    } endif;

    if Name_x0 < Name_x1 then {
    Name_yout = Name_y0 + (Name_y1 - Name_y0) / (Name_x1 - Name_x0) * ( Name_xin - Name_x0);
    } endif;
    } endif
    :return
    :end
    [/highlight]

Lädt...
X