Jörg Reinholz: Lineare Interpolation mit Zacken - Eine Lösung in PHP

Beitrag lesen

Moin!

1.) United hat recht und von mir sein [+] bekommen.

2.) So. Jetzt der Spaß mit dem Interpolieren zwischen den Messpunkten, diese bleiben also als Stützen und dazwischen wird linear interpoliert. Hat also Zacken, die "Linie".

Ist ein Kindrspiel wenn man array_shift() kennt.

array_shift liefert den Wert und löscht das erste Elemnt des Arrays, setzt danach aber das erste auf den Index 0!) So wie ich das gelöst habe ist das aber egal ... denn die Arrays dienen zum Wegwerfen.

In der Schleife wird geprüft, ob x einem der Unterstützungspunkte entspricht, wenn ja wird der Wert (y) zurückgeliefert. Schlagen diese Fehl, dann wird geprüft, ob x zwischen dem kleinsten noch bekannten Untertützungspunkt und dem nächsten liegt.

Wenn ja: interpolieren. wenn nein: bisheriger nächster Punkt wir früherer Punkt, neuer nächster Punkt wird aus Arrays geholt und in den Arrays gelöscht, das spart Schleifen und Speicher. Danach wird natürlich interpoliert, denn einer der Messpunkte kann es logisch nicht sein:

<?php
# Eingangsdaten:
$ar[strtotime("2015-01-01T06:00:00")]=1224.167;
$ar[strtotime("2015-01-01T06:15:00")]=1344.207;
$ar[strtotime("2015-01-01T06:30:00")]=1524.367;
$ar[strtotime("2015-01-01T06:45:00")]=1555.707;


$arKeys = array_keys($ar);
$start  = $arKeys[0];
$ende   = $arKeys[count($arKeys)-1];
$step=60; # Sekunden


$step=60; # Sekunden

# die zuletzt gesehenen Punkte (x0,y0 ; x1,y1) weren für den Start definiert
# außerhalb vin diesen ist eine INTERpolation unzulässig, sonst wäre es eine
# Extrapolation ...

$x0 = array_shift($arKeys);
$y0 = array_shift($ar);
$x1 = array_shift($arKeys);
$y1 = array_shift($ar);


for ($x=$start; $x<=$ende; $x=$x+60) {
   $y=false;
   if ($x == $x0) {
      $y=$y0;
   } elseif ($x == $x1) {
      $y=$y1;
   } elseif ( $x > $x0 && $x < $x1 ) {
     $y = lineareInterpolation ($x, $x0, $y0, $x1, $y1);
   } else {
     # Löschen des jeweils kleinsten (ersten) ArrayElements:
     $x0 = $x1;
     $y0 = $y1;
     $x1 = array_shift($arKeys);
     $y1 = array_shift($ar);
     $y = lineareInterpolation ($x, $x0, $y0, $x1, $y1);
  }

   echo $x, "\t", $y, "\n";
}

function lineareInterpolation ($x, $x0, $y0, $x1, $y1) {
     return ($y0 * ($x1-$x) / ($x1-$x0)) + ($y1 * ($x-$x0) / ($x1-$x0));
}

Ergebnis:

1420088400      1224.167
1420088460      1232.1696666667
1420088520      1240.1723333333
1420088580      1248.175
1420088640      1256.1776666667
1420088700      1264.1803333333
1420088760      1272.183
1420088820      1280.1856666667
1420088880      1288.1883333333
1420088940      1296.191
1420089000      1304.1936666667
1420089060      1312.1963333333
1420089120      1320.199
1420089180      1328.2016666667
1420089240      1336.2043333333
1420089300      1344.207
1420089360      1356.2176666667
1420089420      1368.2283333333
1420089480      1380.239
1420089540      1392.2496666667
1420089600      1404.2603333333
1420089660      1416.271
1420089720      1428.2816666667
1420089780      1440.2923333333
1420089840      1452.303
1420089900      1464.3136666667
1420089960      1476.3243333333
1420090020      1488.335
1420090080      1500.3456666667
1420090140      1512.3563333333
1420090200      1524.367
1420090260      1526.4563333333
1420090320      1528.5456666667
1420090380      1530.635
1420090440      1532.7243333333
1420090500      1534.8136666667
1420090560      1536.903
1420090620      1538.9923333333
1420090680      1541.0816666667
1420090740      1543.171
1420090800      1545.2603333333
1420090860      1547.3496666667
1420090920      1549.439
1420090980      1551.5283333333
1420091040      1553.6176666667
1420091100      1555.707

Jörg Reinholz

0 45

Lineare Interpolation

Casalblanca
  • c#
  1. 0
    Student07.05.2015
    1. 0
      Casalblanca
      1. 0
        Tabellenkalk
        • c#
        • programmiertechnik
        • statistik
  2. 1
    Jörg Reinholz
    1. 0
      Casalblanca
      1. 0
        Jörg Reinholz
        1. 0
          Casalblanca
          1. 0
            Jörg Reinholz
            1. 0
              Casalblanca
              1. 0
                Jörg Reinholz
                • c#
                • programmiertechnik
        2. 0
          dedlfix
      2. 0
        bernd
  3. 0
    Student26.05.15
    1. 0
      Jörg Reinholz
      1. 0
        Student27.05
        1. 0
          Jörg Reinholz
          1. 0
            Student27.05
            1. 0

              Lineare Interpolation - Eine Lösung in PHP

              Jörg Reinholz
              • php
              • statistik
              1. 4
                1unitedpower
                1. 0

                  Lineare Interpolation mit Zacken - Eine Lösung in PHP

                  Jörg Reinholz
                  1. 0

                    Mann, sind die Rechner schnell geworden...

                    Jörg Reinholz
                    1. 0
                      1unitedpower
                      1. 0
                        Jörg Reinholz
                        1. 0

                          lösung mit lagrange...

                          Student29.05
                          1. 1
                            Christian Kruse
                            1. 0
                              Student29.05
                              1. 5
                                Christian Kruse
                                1. 0
                                  Student29.05
                                  1. 1
                                    Christian Kruse
                                    1. 1
                                      Der Martin
                                      • programmiertechnik
                                      • software
                                  2. 3
                                    Camping_RIDER
                                    1. 0
                                      Student29.05
                                      1. 0
                                        Student29.05
                                        1. 0
                                          Der Martin
                                      2. 0
                                        Der Martin
                                        • software
                                        1. 0
                                          Student29.05
                          2. 0
                            1unitedpower
                            1. 0
                              Student29.05
                              1. 1
                                unkown
                              2. 0
                                1unitedpower
                          3. 0
                            Jörg Reinholz
                        2. 0
                          1unitedpower
                          1. 0
                            Christian Kruse
                          2. 0

                            PHP, Ausgabe- Pufferung. Performance

                            Jörg Reinholz