[Сценарий] Метод расчета 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
Сообщения: 2038
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 285 раз
Поблагодарили: 629 раз

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.49%
Аватара пользователя
xor
Сообщения: 2038
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 285 раз
Поблагодарили: 629 раз

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.49%
Logrus
Сообщения: 2083
Зарегистрирован: Пт апр 07, 2017 12:20 pm
Благодарил (а): 313 раз
Поблагодарили: 457 раз

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

Сообщение Logrus » Чт июл 13, 2023 3:53 pm

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

function myRealFell($t, $h, $w = 0) {
	$w = $w*3.6/1.609; //m/s->mph
	$tF = $t*1.8+32;
	//Расчет температуры "По ощущениям"
	if ($tF >= 80) { //Heat Index
		$_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 )) {
			$_f = $_f-((13-$h)/4)*sqrt((17-abs($tF-95))/17);
		}
		if(($tF < 87) && ($h > 85)) {
			$_f = $_f+(($h-85)/10)*((87-$tF)/5);
		}
	}
	elseif ($t <= 10 && $w) { //считаем фактор WindChild
		$_f = 35.74+(0.6215*$tF)-(35.75*pow($w, 0.16))+((0.4275*$tF)*pow($w, 0.16));
	} else { //считаем по упрощенной формуле Heat Index
		$_f = 0.5*($tF+61+(($tF-68)*1.2)+($h*0.094));
	}

	$realFell = round(($_f-32)/1.8, 1); //переводим в цельсии
	return $realFell;
}
выше в считаем фактор WindChild неточность, он только при наличии ветра
ну и т.к. здесь объединено несколько расчетных факторов, то в оригинале Heat Index считают по упрощенной и если он (сам индекс) вышел за рамки то расчет по более сложной, здесь и выше реализовано несколько не так
Telegram | Блог
Raspberry Pi3, с образа от Сергея 3.31, PHP 7, флешка 16 Гб работает с 10.09.2017
Почти всё время уходит на исправление ошибок, оставшееся - на их повторение. (с) ))) Спасибо
Аватара пользователя
xor
Сообщения: 2038
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 285 раз
Поблагодарили: 629 раз

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

Сообщение xor » Чт июл 13, 2023 9:00 pm

Logrus писал(а):
Чт июл 13, 2023 3:53 pm
выше в считаем фактор WindChild неточность, он только при наличии ветра
Wind Chill в профи-программах погодных и без ветра выдается, только равен текущей температуре, что и следует из формулы расчёта
2023-07-13_20-54-16.png
2023-07-13_20-54-16.png (63.64 КБ) 991 просмотр
Logrus
Сообщения: 2083
Зарегистрирован: Пт апр 07, 2017 12:20 pm
Благодарил (а): 313 раз
Поблагодарили: 457 раз

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

Сообщение Logrus » Чт июл 13, 2023 9:49 pm

в здешнем примере он расчитывается не отдельно и проверь что выдаст эта формула при нулевом ветре
о чем спор?
https://en.m.wikipedia.org/wiki/Wind_chill
Windchill temperature is defined only for temperatures at or below 10 °C (50 °F) and wind speeds above 4.8 km/h (3.0 mph).
по ссылке и эта канадская и другие примеры
Telegram | Блог
Raspberry Pi3, с образа от Сергея 3.31, PHP 7, флешка 16 Гб работает с 10.09.2017
Почти всё время уходит на исправление ошибок, оставшееся - на их повторение. (с) ))) Спасибо
Аватара пользователя
xor
Сообщения: 2038
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 285 раз
Поблагодарили: 629 раз

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

Сообщение xor » Пт июл 14, 2023 4:38 pm

Logrus писал(а):
Чт июл 13, 2023 9:49 pm
в здешнем примере он расчитывается не отдельно и проверь что выдаст эта формула при нулевом ветре
о чем спор?
https://en.m.wikipedia.org/wiki/Wind_chill
Windchill temperature is defined only for temperatures at or below 10 °C (50 °F) and wind speeds above 4.8 km/h (3.0 mph).
по ссылке и эта канадская и другие примеры
а я теперь не считаю, а пользуюсь от станции уже рассчитанным
Logrus
Сообщения: 2083
Зарегистрирован: Пт апр 07, 2017 12:20 pm
Благодарил (а): 313 раз
Поблагодарили: 457 раз

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

Сообщение Logrus » Пт июл 14, 2023 6:45 pm

молодец )))
но в здешнем скрипте увы есть ошибки, как в коде, так и в реализации всех факторов :?
Telegram | Блог
Raspberry Pi3, с образа от Сергея 3.31, PHP 7, флешка 16 Гб работает с 10.09.2017
Почти всё время уходит на исправление ошибок, оставшееся - на их повторение. (с) ))) Спасибо
Аватара пользователя
xor
Сообщения: 2038
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 285 раз
Поблагодарили: 629 раз

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

Сообщение xor » Пт июл 14, 2023 10:11 pm

Logrus писал(а):
Пт июл 14, 2023 6:45 pm
молодец )))
но в здешнем скрипте увы есть ошибки, как в коде, так и в реализации всех факторов :?
температура 9,9 C, ветер 0,1 м/с
$t <= 10 && $w можно считать виндчил по твоей формуле же?
2023-07-14_21-58-01.png
2023-07-14_21-58-01.png (27.71 КБ) 805 просмотров
а если ветер 1 м/с, то 10,1>9.9 получается, тогда уж правь ограничение на 4,8 км/ч, как у канадцев
собственно, и из-за этого перешёл на готовенькое, чтобы башку ерундой не занимать
Logrus
Сообщения: 2083
Зарегистрирован: Пт апр 07, 2017 12:20 pm
Благодарил (а): 313 раз
Поблагодарили: 457 раз

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

Сообщение Logrus » Пт июл 14, 2023 10:50 pm

она не моя, но выше ж ее пределы температура ниже 10 цельсия и ветер выше 3 миль/час
там не только это о чем упомянул тоже
а до без учета штиля было еще хуже
Telegram | Блог
Raspberry Pi3, с образа от Сергея 3.31, PHP 7, флешка 16 Гб работает с 10.09.2017
Почти всё время уходит на исправление ошибок, оставшееся - на их повторение. (с) ))) Спасибо
Ответить