MySQL php线性插值表

时间:2015-03-26 15:09:18

标签: php mysql interpolation

我有一张名为" psytable_moist_air"如下所示: enter image description here

我正在尝试开发一个MySQL语句,它将插入一个可能在记录之间的值。 (编辑:如果在PHP中更容易进行数学运算,我也可以开放该解决方案!]

示例:我想知道" hda"价值在哪里" T" = 17.8。

请注意,没有记录" T" = 17.8。但是,因为这个表是线性相关的,所以我可以得到" hda"值" T" = 17和" hda"值" T" = 18并对值进行线性插值。

结果数学看起来像这样:
(得到" hda"值T = 17:hda = 17.102)
(获得" hda"值T = 18:hda = 18.108)

enter image description here

修改: 我能想到的唯一方法是使用两个MySQL语句来获取越来越小的值:

SELECT MAX(`T`), MAX(`hda`) FROM `psytable_moist_air` WHERE `T`<17.8
SELECT MIN(`T`), MIN(`hda`) FROM `psytable_moist_air` WHERE `T`>17.8

然后我会使用这两个值来进行插值。这有效但看起来效率很低。任何人都可以提出更好的解决方案吗?

如果有人有任何建议,我将不胜感激!

2 个答案:

答案 0 :(得分:1)

我认为最好的方法是使用地板功能。

见以下内容;

SET @x = 17.8;
SET @x0 = FLOOR(@x);
SET @x1 = FLOOR(@x) + 1;

SET @y0 = (SELECT `hda` FROM `psytable_moist_air` WHERE `T` = @x0);
SET @y1 = (SELECT `hda` FROM `psytable_moist_air` WHERE `T` = @x1);

SET @y = @y0 + (@y1 - @y0) * ((@x - @x0) / (@x1 - @x0));

Select @y ,@x0 ,@x1, @y0 ,@y1;

答案 1 :(得分:1)

我最近不得不这样做,因为没有PHP答案:

function CalcLinearInterpolation($x1, $y1, $x2, $y2, $t){
        $n = ($x2 - $x1);
        $j = ((($t - $x1) / ($n / 100)) / 100);
        $r = $y1 + ($j*($y2 - $y1));                
        return $r;
}

CalcLinearInterpolation(2, 5, 3, 9, 2.5)将返回7

要清楚;

  
      
  • 2 (x1) = 5 (y1)
  •   
  • 3 (x2) = 9 (y2)
  •   
  • 2.5 (t) = Result
  •   
     

所以:在这种情况下CalcLinearInterpolation($x1, $y1, $x2, $y2, $t);

     

CalcLinearInterpolation(2, 5, 3, 9, 2.5)