Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 8, 2016 00:16:53

Lumenman
Зарегистрирован: 2016-10-08
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите разобрать алгоритм

Вот, есть часть кода. Если подставить значение “pressure”, ролучим F. А вот, как на основе этого F выбирается соответствующая буква? Пожалуйста, поясните мне на пальцах. Полностью код можно глянуть тут: https://github.com/jim-easterbrook/pywws/blob/master/src/pywws/ZambrettiCore.py

F = 0.1553 * (1029.95 - pressure)
LUT = ('B', ‘D’, ‘H’, ‘O’, ‘R’, ‘U’, ‘V’, ‘X’, ‘X’, ‘Z’)
# clip to range of lookup table
F = min(max(int(F + 0.5), 0), len(LUT) - 1)
# convert to letter code
return LUT

Офлайн

#2 Окт. 8, 2016 04:13:00

scidam
Зарегистрирован: 2016-06-15
Сообщения: 288
Репутация: +  35  -
Профиль   Отправить e-mail  

Помогите разобрать алгоритм

Данный код представляет собой реализацию “полуэмпирического” дерева решений, результатом прохода по которому будет “вербальное/художественное” заключение о вероятной погоде (будет ли сильный дождик, или будет ясно и т.п.).
Дерево строится в зависимости от 4-х входных параметров: давления, месяца, ветра и тренда. (условия для месяца и значения для тренда, вполне вероятно, специфичны для какой-то территории, для которой строится прогноз).

F - основа для вычисления индекса буквы, соответствующей определенному прогнозу погоды; для разных наборов давления, месяца, ветра и тренда используется своя формула для F и свой перечень возможных прогнозных исходов погоды LUT. LUT и F согласованы в каждом случае ( это, видимо, составляет “know-how” алгоритма прогнозирования).

Вот, есть часть кода. Если подставить значение “pressure”, ролучим F

Получает прогноз эта функция:
 ZambrettiCode(pressure, month, wind, trend)
Вам нужно еще указать месяц, ветер, тренд (кроме давления). В тестовых целях назначение этих параметров выполняет функция main и циклы в нее входящие

Офлайн

#3 Окт. 8, 2016 05:47:05

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Помогите разобрать алгоритм

Lumenman
А вот, как на основе этого F выбирается соответствующая буква?
В вашем коде никак.
Манипуляции с F никак не используются. Возвращается просто полный список букв. Почему вы решили что буква выбирается? Приведенный вами код вообще не является синтаксически корретным т.е не может быть выполнен питоном.



Офлайн

#4 Окт. 8, 2016 11:40:54

Lumenman
Зарегистрирован: 2016-10-08
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите разобрать алгоритм

scidam
Вам нужно еще указать месяц, ветер, тренд (кроме давления). В тестовых целях назначение этих параметров выполняет функция main и циклы в нее входящие

Да, там по скрипту производятся соответствующие расчеты. Я уже разобрался в большей части. Там рассчитывается по атм давлению, но перед финальным расчетом это давление корректируется в зависимости от ветра и тенденции, например, при СВ ветре к давлению, например 1006, нужно прибавить 3,2. Это следует из:
pressure += ( 5.2, 4.2, 3.2, 1.05, -1.1, -3.15, -5.2, -8.35,
-11.5, -9.4, -7.3, -5.25, -3.2, -1.15, 0.9, 3.05) wind
Тут приведено 16 значений по количеству направлений ветра. Если считать от Северного, то 4,2 - это ССВ, а наш СВ - это 3,2.

Далее, при падающем давлении в месяце № 9 от давления нужно отнять константу 3,2, т.к if north == (month >= 4 and month <= 9): pressure -= 3.2

На выходе получаем 1006. Теперь подставляем его в соотв формулу:

F = 0.1553 * (1029.95 - pressure)
LUT = ('B', ‘D’, ‘H’, ‘O’, ‘R’, ‘U’, ‘V’, ‘X’, ‘X’, ‘Z’)

получаем F = 3.7194

Что дальше происходит?

Меня интересует как работает вот эта функция: F = min(max(int(F + 0.5), 0), len(LUT) - 1)
Мне кажется именно она и отвечает за выбор буквы погоды из ряда LUT = ('B', ‘D’, ‘H’, ‘O’, ‘R’, ‘U’, ‘V’, ‘X’, ‘X’, ‘Z’).

Отредактировано Lumenman (Окт. 8, 2016 12:17:13)

Офлайн

#5 Окт. 8, 2016 11:51:23

Lumenman
Зарегистрирован: 2016-10-08
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите разобрать алгоритм

doza_and
Возвращается просто полный список букв. Почему вы решили что буква выбирается?

Я просто привел часть кода, которая, как мне показалось, отвечает за выбор буквы. В действительности, буква должна выбираться. В первом сообщении я привел ссылку на полный код. Это, типо, расчет погоды по атмосферному давлению, его тенденции (падает, стабильно, растет) и направлению ветра. В зависимости от переменных, выводится состояние погоды. Например, при падающем Летом давлении 1006 и ветре NE должно выдать U. Я пытался ручками посчитать по формулам из кода, но у меня не получается и я не пойму как именно работает функция выбора этой буквы.
Может, это она - F = min(max(int(F + 0.5), 0), len(LUT) - 1) ? А выбирает из ряда LUT = ('B', ‘D’, ‘H’, ‘O’, ‘R’, ‘U’, ‘V’, ‘X’, ‘X’, ‘Z’) ? К примеру, если F= 3.7194, то каков результат?

Что бы вы поняли, я хочу математику кода перевести в обычную математику с калькулятором. Для этого мне нужно разобраться, как сей код работает, потому и спросил.

Отредактировано Lumenman (Окт. 8, 2016 12:11:53)

Офлайн

#6 Окт. 8, 2016 14:15:16

scidam
Зарегистрирован: 2016-06-15
Сообщения: 288
Репутация: +  35  -
Профиль   Отправить e-mail  

Помогите разобрать алгоритм

Меня интересует как работает вот эта функция: F = min(max(int(F + 0.5), 0), len(LUT) - 1)

Эта “функция” преобразует значение F в валидный индекс, чтобы потом использоваться для выбора буквы прогноза. Валидный означает из интервала .

Лучше переписать эту формулу так:
 ind = min(max(int(F+0.5), 0), len(LUT)-1)
return LUT[ind]
Так понятней, что целью этих minmax преобразований получить индекс для LUT.
Просто автор кода предпочел переназначить вычисленное вещественное значение, сохранив при этом обозначение. Но смысл его поменялся F стало по смыслу индексом для LUT.

К примеру, если F= 3.7194, то каков результат?
F+0.5 => 4.2194 (на int подается это значение
int(4.2129) => 4 (int преобразует в целое, отбрасывает все, что после “точки”; на max подается это значение, вычисляется max(4,0)
max(4,0) => 4 (максимальное значение между текущим 4 и нулем есть 4)
далее min(4, 9) т.к. len(LUT)=10, a 10-1=9 (единица отнимается т.к. в списках и кортежах питона нумерация идет от 0 индекса), это для LUT = ('B', ‘D’, ‘H’, ‘O’, ‘R’, ‘U’, ‘V’, ‘X’, ‘X’, ‘Z’) (len - длина массива или кортежа)
min(4,9)=4
Таким образом, отсчитываем до 4-го элемента в LUT полагая, что нумерация начинается с 0.
B
D
H
O
R
Наш прогноз для F 3.7194 - это R

Важно! LUT в каждом случае разный (в зависимости от условий по какой ветке if мы прошли ранее)

Вычисления по формуле ind = min(max(int(F + 0.5), 0), len(LUT) - 1) не могут привести к неправильному индексу.
LUT - это кортеж, и если его длина N, то возможные индексы для обращения к его элементам это 0,1,…N-1.
Пусть F отрицательно, тогда
int(F) - отрицательно
max(отриц, 0) =0
min(0, len(LUT)-1)
ind = 0

Если F очень большое положительное, то
int(F) - тоже большое положительное и целое
max(int(F), 0) - большое положительное и целое
min(большое положит, len(LUT)-1) = len(LUT)-1
ind = len(LUT)-1

Таким образом, вычисленный индекс зависит от F, но всегда принадлежит интервалу (0, len(LUT)-1).

Постарался изложить очень подробно…






Отредактировано scidam (Окт. 8, 2016 14:28:41)

Офлайн

#7 Окт. 9, 2016 19:04:47

Lumenman
Зарегистрирован: 2016-10-08
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите разобрать алгоритм

scidam
Постарался изложить очень подробно…

Благодарю. Вы очень помогли

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version