我有一张名为" psytable_moist_air"如下所示:
我正在尝试开发一个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)
修改: 我能想到的唯一方法是使用两个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
然后我会使用这两个值来进行插值。这有效但看起来效率很低。任何人都可以提出更好的解决方案吗?
如果有人有任何建议,我将不胜感激!
答案 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)