03/04/2011 21:40:38
Заморозки на почве и облысенье леса,
небо серого цвета кровельного железа.
Выходя во двор нечетного октября,
ежась, число округляешь до "ох ты б#я".
(Иосиф Бродский, 1976)
Интересную идею подсказал постоянный пользователь сайта Ставр. Он прислал ссылку на статью, в которой предлагается рассчитывать вероятность ночных заморозков. Такой расчет интересен дачникам, сельским жителям - одним словом, всем, кто имеет дело с землей. Как и в случае предсказателя погоды Zambretti на основании длительных наблюдений за природой было установлено, что вероятность заморозков зависит от скорости изменения температуры в промежутке между часом дня и 9 часами вечера. Графически эту зависимость представил профессор Броунов следующим образом.

График вероятности ночных заморозков
По вертикальной оси обозначена температура воздуха в 9 часов вечера.
По горизонтальной оси - разница между температурой воздуха в 9 вечера и час дня.
Пользоваться этой схемой просто. Необходимо только определить в какой точке лежит пересечение двух этих параметров.
Но поскольку у нас установлены температурные датчики на улице (1-wire или в наружном блоке метеостанции), было бы интересно делать расчет заморозков автоматически. Сделать это совсем нетрудно. Необходимо только вспомнишь школьные уроки математики.
На рисунке выше показаны прямые. Любую прямую можно описать в виде функции
y = ax + b, где a и b - параметры, определяющие направление/наклон прямой.
Осталось только найти значения этих параметров. Для этого снова обратимся к учебнику. У нас имеется графическое представление функции, а, значит, мы знаем значения x и y функции.
a = (y2 – y1)/(x2 – x1)
b = ( y1 x2 – x1 y2 )/(x2 – x1)
Используя формулы, для каждого графика, задающего область вероятности заморозков, рассчитаем значения a и b и напишем программу на PHP.
Ставр прислал имеющиеся у него варианты скриптов на Perl и PHP, но я написал свою версию программы, учитывающую только определенную область температурных значений, в которых алгоритм дает адекватный результат.
<?
if ( date('G') < 20 )
$z = "расчет возможен только после 21 часа";
else
{
// Считываем из БД или другим способом значение температуры в час дня
$t13 = 9;
// Считываем из БД или другим способом значение температуры в 21 час вечера
$t21 = 4;
$z = "0%";
$x = $t13 - $t21;
if ( $t21 >= $t13 )
$z = "расчет невозможен. Температура растет";
elseif ( $t21 < 0 )
$z = "расчет невозможен. Температура ниже нуля";
elseif ( $t21 < 11 && $x < 11 )
{
$t_graph = array(
0 => array(0.375, 11, 0),
1 => array(0.391, 8.7, 10),
2 => array(0.382, 6.7, 20),
3 => array(0.382, 4.7, 40),
4 => array(0.391, 2.7, 60),
5 => array(0.4, 1.6, 80));
$z = "100%";
for ( $i = 0; $i < count($t_graph); $i++ )
{
$y1 = $t_graph[$i][0] * $x + $t_graph[$i][1];
if ( $t21 > $y1)
{
$z = $t_graph[$i][2]."%";
break;
}
}
}
}
echo "Вероятность заморозков: $z";
?>
Попробовать расчет можно прямо на сайте:
Автор: Andrey_B
Любое использование материалов сайта возможно только с разрешения автора и с обязательным указанием источника.
2011-04-04 11:01:36 | Ставр
Вы как всегда все предельно четко и понятно обрисовали! Думаю, что мой пост можно и затереть, все равно он криво отобразился.
Кстати по ссылке, где описывается алгоритм вычисления, еще учитывается и точка росы. Там написано, что как правило температура не опускается ниже точки росы, поэтому о заморозке еще можно судить и по графику "Дью поинт".