MySQL php Table 的线性插值
MySQL php Linear Interpolation of Table
我有一个名为 "psytable_moist_air" 的 table,如下所示:
我正在尝试开发一个 MySQL 语句,该语句将在记录之间插入一个值。 (编辑:如果在 PHP 中更容易进行数学运算,我也愿意接受该解决方案!]
示例: 我想知道 "hda" 值 "T" = 17.8。
注意 "T"=17.8 没有记录。但是,因为这个 table 是线性相关的,所以我可以获得 "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
然后我将使用这两个值进行插值。这有效,但似乎效率很低。谁能想出更好的解决方案??
如果有人有任何建议,将不胜感激!
.
我认为最好的方法是使用 floor 函数。
见下文;
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;
我最近不得不这样做,因为没有 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)
会 return 7
说清楚;
2 (x1) = 5 (y1)
3 (x2) = 9 (y2)
2.5 (t) = Result
So: CalcLinearInterpolation($x1, $y1, $x2, $y2, $t)
in this scenario;
CalcLinearInterpolation(2, 5, 3, 9, 2.5)
我有一个名为 "psytable_moist_air" 的 table,如下所示:
我正在尝试开发一个 MySQL 语句,该语句将在记录之间插入一个值。 (编辑:如果在 PHP 中更容易进行数学运算,我也愿意接受该解决方案!]
示例: 我想知道 "hda" 值 "T" = 17.8。
注意 "T"=17.8 没有记录。但是,因为这个 table 是线性相关的,所以我可以获得 "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
然后我将使用这两个值进行插值。这有效,但似乎效率很低。谁能想出更好的解决方案??
如果有人有任何建议,将不胜感激!
.
我认为最好的方法是使用 floor 函数。
见下文;
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;
我最近不得不这样做,因为没有 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)
会 return 7
说清楚;
2 (x1) = 5 (y1)
3 (x2) = 9 (y2)
2.5 (t) = Result
So:
CalcLinearInterpolation($x1, $y1, $x2, $y2, $t)
in this scenario;
CalcLinearInterpolation(2, 5, 3, 9, 2.5)