Найти - Пользователи
Полная версия: Помогите разобрать алгоритм
Начало » Python для новичков » Помогите разобрать алгоритм
1
Lumenman
Вот, есть часть кода. Если подставить значение “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
scidam
Данный код представляет собой реализацию “полуэмпирического” дерева решений, результатом прохода по которому будет “вербальное/художественное” заключение о вероятной погоде (будет ли сильный дождик, или будет ясно и т.п.).
Дерево строится в зависимости от 4-х входных параметров: давления, месяца, ветра и тренда. (условия для месяца и значения для тренда, вполне вероятно, специфичны для какой-то территории, для которой строится прогноз).

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

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

Получает прогноз эта функция:
 ZambrettiCode(pressure, month, wind, trend)
Вам нужно еще указать месяц, ветер, тренд (кроме давления). В тестовых целях назначение этих параметров выполняет функция main и циклы в нее входящие
doza_and
Lumenman
А вот, как на основе этого F выбирается соответствующая буква?
В вашем коде никак.
Манипуляции с F никак не используются. Возвращается просто полный список букв. Почему вы решили что буква выбирается? Приведенный вами код вообще не является синтаксически корретным т.е не может быть выполнен питоном.
Lumenman
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
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, то каков результат?

Что бы вы поняли, я хочу математику кода перевести в обычную математику с калькулятором. Для этого мне нужно разобраться, как сей код работает, потому и спросил.
scidam
Меня интересует как работает вот эта функция: 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).

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






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

Благодарю. Вы очень помогли
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB