MySQL PHP Линейная интерполяция таблицы

У меня есть таблица с названием «psytable_moist_air», показанная ниже:
введите описание изображения здесь

Я пытаюсь разработать оператор MySQL, который будет интерполировать значение, которое может быть между записями. (РЕДАКТИРОВАТЬ: Если легче сделать математику в PHP, я тоже открыт для этого решения!]

Пример: Я хотел бы знать значение «hda», где «T» = 17.8.

Обратите внимание, что нет записи, где «Т» = 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

Тогда я бы использовал эти два значения для интерполяции. Это работает, но кажется довольно неэффективным. Может кто-нибудь придумать лучшее решение ??

Если у кого-нибудь есть какие-либо советы, мы будем очень признательны!

.

3

Решение

Я считаю, что лучший способ сделать это — использовать функцию 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;
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)

1

По вопросам рекламы [email protected]