[Сценарий] Метод расчета RealFeel/FeelsLike

Не требует установки программ или изменения файлов

Модераторы: immortal, newz20

Ответить
Аватара пользователя
Sandr
Сообщения: 126
Зарегистрирован: Пн ноя 16, 2015 5:10 pm
Благодарил (а): 19 раз
Поблагодарили: 29 раз

[Сценарий] Метод расчета RealFeel/FeelsLike

Сообщение Sandr » Чт апр 28, 2016 2:06 pm

Озадачился значениями ReelFeel FeelsLike уличной температуры
Многие погодные сайты предлагают такую опцию
Решил что считать надо "надому"

Как реализовал -
создал метод calculate_realfeel для объекта WeatherStations>ws

и прописал запуск этого метода при изменении свойств
ws.tempOutside и ws.relHumOutside
в которые у меня пишутся данные от уличного датчика Температуры/влажности
Данные ветра пока беру из прогноза (у меня из openWeather)
но если у вас есть данные по ветру от погодной станции то лучше брать ws.windAverage

А вот сам метод
СпойлерПоказать

Код: Выделить всё

$t = $this->getProperty('tempOutside '); // температура на улице
$h = $this->getProperty('relHumOutside'); // влажность на улице
//$w = $this->getProperty('windAverage'); // усредненное значение скорости ветра на улице
$w = gg('ow_day0.wind_speed'); // данные о ветре из прогноза OpenWeather
$tF = $t *1.8+32; // перевод температуры в Farenheit

if ($t > 26.6){
 // Считаем HeatIndex
 $_f=-42.379 + 2.04901523*$tF + 10.14333127*$h - 0.22475541*$tF*$h - 0.00683783*$tF*$tF - 0.05481717*$h*$h + 0.00122874*$tF*$tF*$h + 0.00085282*$tF*$h*$h -0.00000199*$tF*$tF*$h*$h;
}else if ($t <= 10){
 // Считаем фактор WindChild
 $_f = 35.74+(0.6215*$tF)-(35.75*($w*0.16))+((0.4275*$tF)*($w*0.16));
}else{
 //считаем по Rothfusz
 $_f = 0.5*($tF+61+(($tF-68)*1.2)+($h*0.094));
}
// переводим в цельсии
 $rf = round(($_f-32)/1.8,1);

//и пропишем значение
$this->setProperty('reelFeel',$rf);
Формулы взяты с http://www.wpc.ncep.noaa.gov/html/heati ... tion.shtml
HeatIndex считаем при Т более 26,6 градусов
WindChild при Т менее 10 градусов
а в диапазоне 10-26.6 считаем по Rothfusz


PS: Тестируем и комментируем.
PPS: Формулы нашел только в Farenheit поэтому просчеты веду в них и лишь потом обратно в C
Win Home Serv 2011 / Intel Core i3 / 32 GB ram /
Сцена погода (вертикальная)
mySensor скетчи ( 4х канальный димер | Оптимизация скетчей )
Ну и конечно моя маленькая фабрика - 3D печать / фрезеровка / литье
Аватара пользователя
xor
Сообщения: 1756
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 216 раз
Поблагодарили: 528 раз

Re: Метод расчета RealFeel/FeelsLike

Сообщение xor » Чт май 05, 2016 9:31 pm

Фактор WindChill, вроде, с ошибкой- там не умножение на 0.16, а возведение в степень, и скорость ветра- в mph, a openweather-зависит от настроек, у меня - в м/с.
http://www.nws.noaa.gov/om/winter/windchill.shtml

Upd Добавил свою версию расчета - возведение в степень, перевод м/с в мили в час, поправки с исходного сайта:
СпойлерПоказать

Код: Выделить всё

$t = gg('ow_fact.temperature'); // температура на улице С
$h = gg('ow_fact.humidity'); // влажность на улице %
$w = gg('ow_fact.wind_speed'); // данные о ветре из прогноза OpenWeather m/s
$w=$w*3.6/1.609;//m/s -> mph
$tF = $t *1.8+32; // перевод температуры в Farenheit

if ($t > 26.6){
 // Считаем HeatIndex по Rothfusz
 $_f=-42.379 + 2.04901523*$tF + 10.14333127*$h - 0.22475541*$tF*$h - 0.00683783*$tF*$tF - 0.05481717*$h*$h + 0.00122874*$tF*$tF*$h + 0.00085282*$tF*$h*$h -0.00000199*$tF*$tF*$h*$h;
   if(($tF<112)&&($h<13)){
   // If the RH is less than 13% and the temperature is between 80 and 112 degrees F, then the following adjustment is subtracted from HI: 
     $_f=$_f-((13-$h)/4)*sqrt((17-abs($tF-95.))/17);
   }
   if(($tF<88)&&($h>85)){
    // On the other hand, if the RH is greater than 85% and the temperature is between 80 and 87 degrees F, then the following adjustment is added to HI:
    //ADJUSTMENT = [(RH-85)/10] * [(87-T)/5]
    $_f=$_f+(($h-85)/10)*((87-$tF)/5);
   }
}else if ($t <= 10){
 // Считаем фактор WindChild
 $_f = 35.74+(0.6215*$tF)-(35.75*pow($w,0.16))+((0.4275*$tF)*pow($w,0.16));
}else{
 //считаем по упрощенной формуле
 $_f = 0.5*($tF+61+(($tF-68)*1.2)+($h*0.094));
}
// переводим в цельсии
 $rf = round(($_f-32)/1.8,1);
echo 't= '.$t.'C h= '.$h.'% w='.round($w,2).' mph -> realfeel t='.$rf.'C';

За это сообщение автора xor поблагодарили (всего 3):
Sandr (Пт май 13, 2016 2:05 pm) • GIV_59 (Ср янв 16, 2019 3:49 am) • Samir77 (Сб мар 28, 2020 4:52 pm)
Рейтинг: 3.53%
Аватара пользователя
xor
Сообщения: 1756
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 216 раз
Поблагодарили: 528 раз

Re: Метод расчета RealFeel/FeelsLike

Сообщение xor » Пт май 06, 2016 10:11 pm

Вот, воспользовавшись идеей, немного переписал в виде сценария
СценарийПоказать

Код: Выделить всё

$t = gg('ow_fact.temperature'); // температура на улице
$h = gg('ow_fact.humidity'); // влажность на улице %
$w = gg('ow_fact.wind_speed'); // данные о ветре из прогноза OpenWeather m/s
$w=$w*3.6/1.609;//m/s -> mph
$tF = $t *1.8+32; // перевод температуры в Farenheit

if ($t > 26.6){
 // Считаем HeatIndex по Rothfusz
 $_f=-42.379 + 2.04901523*$tF + 10.14333127*$h - 0.22475541*$tF*$h - 0.00683783*$tF*$tF - 0.05481717*$h*$h + 0.00122874*$tF*$tF*$h + 0.00085282*$tF*$h*$h -0.00000199*$tF*$tF*$h*$h;
   if(($tF<112)&&($h<13)){
   // If the RH is less than 13% and the temperature is between 80 and 112 degrees F, then the following adjustment is subtracted from HI: 
     $_f=$_f-((13-$h)/4)*sqrt((17-abs($tF-95.))/17);
   }
   if(($tF<88)&&($h>85)){
    // On the other hand, if the RH is greater than 85% and the temperature is between 80 and 87 degrees F, then the following adjustment is added to HI:
    //ADJUSTMENT = [(RH-85)/10] * [(87-T)/5]
    $_f=$_f+(($h-85)/10)*((87-$tF)/5);
   }
}else if ($t <= 10){
 // Считаем фактор WindChild
 $_f = 35.74+(0.6215*$tF)-(35.75*pow($w,0.16))+((0.4275*$tF)*pow($w,0.16));
}else{
 //считаем по упрощенной формуле
 $_f = 0.5*($tF+61+(($tF-68)*1.2)+($h*0.094));
}
// переводим в цельсии
 $rf = round(($_f-32)/1.8,1);
echo 't= '.$t.'C h= '.$h.'% w='.round($w,2).' mph realfeel t='.$rf.'C';
*** Сообщение запрещено. Сообщение похоже на спам. ***
За это сообщение автора xor поблагодарили (всего 3):
znachok88 (Ср июн 05, 2019 1:45 pm) • Samir77 (Вт мар 31, 2020 11:50 pm) • vitosmaxim80sad145 (Вс апр 12, 2020 8:36 pm)
Рейтинг: 3.53%
Ответить