Преобразование цикла Fortran DO WHILE в Python

Я пытаюсь преобразовать следующий цикл Fortran в python. Цель состоит в том, чтобы установить abs(ETP-ET)=0.0. Однако мое решение не сходится к 0,0. Что не так в моем подходе?

код Фортран

ET(I)   =  TDEW_F
  TSTAR   = (ET(I)+TDEW_F)*0.5
  BETA    =  0.255-(8.5E-3*TSTAR)+(2.04E-4*TSTAR*TSTAR)
  FW      =  ACONV*AFW(JW)+BCONV*BFW(JW)*WIND2M**CFW(JW)
  CSHE(I) =  15.7+(0.26+BETA)*FW
  RA      =  3.1872E-08*(TAIR_F+459.67)**4
  ETP     = (SRO_BR+RA-1801.0)/CSHE(I)+(CSHE(I)-15.7)*(0.26*TAIR_F+BETA*TDEW_F)/(CSHE(I)*(0.26+BETA))
  J       =  0
  DO WHILE (ABS(ETP-ET(I)) > 0.05 .AND. J < 10)
    ET(I)   =  ETP
    TSTAR   = (ET(I)+TDEW_F)*0.5
    BETA    =  0.255-(8.5E-3*TSTAR)+(2.04E-4*TSTAR*TSTAR)
    CSHE(I) =  15.7+(0.26+BETA)*FW
    ETP     = (SRO_BR+RA-1801.0)/CSHE(I)+(CSHE(I)-15.7)*(0.26*TAIR_F+BETA*TDEW_F)/(CSHE(I)*(0.26+BETA))
    J       =  J+1
  END DO

RETURN

Код Python

ET = TDEW_F
TSTAR = (ET+TDEW_F)*0.5
BETA  =  0.255-(8.5E-3*TSTAR)+(2.04E-4*TSTAR*TSTAR)
FW = ACONV*AFW(JW)+BCONV*BFW(JW)*WIND2M**CFW(JW)
CSHE = 15.7+(0.26+BETA)*FW
RA = 3.1872E-08*(AirT_F+459.67)**4
ETP = (SRO_BR+RA-1801.0)/CSHE+(CSHE-15.7)*(0.26*AirT_F+BETA*DewPt_F)/(CSHE*(0.26+BETA))

j = 0
while True:
    ET = ETP
    TSTAR = (ET+TDEW_F)*0.5
    BETA = 0.255-(8.5E-3*TSTAR)+(2.04E-4*TSTAR*TSTAR)
    CSHE = 15.7+(0.26+BETA)*FW
    ETP = (SRO_BR+RA+RA-1801.0)/CSHE+(CSHE-15.7)*(0.26*AirT_F+BETA*TDEW_F)/(CSHE*(0.26+BETA))

    j+=1
    if abs(ETP-ET) < 0.05 and j>10:
        break

    OUT = (ET-ETP)
    return OUT
while True не может быть эквивалентен циклу с условной проверкой (если только ваше условие не является тупым и никогда не может быть выполнено)
roganjosh 02.03.2019 15:12
return OUT в цикле безоговорочно не работает
Jean-François Fabre 02.03.2019 15:48

Я не вижу причин, почему бы просто не следовать Фортрану как можно ближе. Все это while True кажется мне ненужным, запутанным. Если в цикле Fortran есть условное выражение, просто сделайте то же самое в Python while (condition):. Кроме того, в Фортране, даже если вы не видите необходимых объявлений, ET выглядит как массив. Почему бы вам не сохранить массив в Python? На самом деле, просто следуйте оригиналу как можно ближе. Это должно быть довольно просто, в этом коде нет ничего сложного. То же самое во многих языках программирования.

Vladimir F 02.03.2019 15:51
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
3
165
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Замените if abs(ETP-ET) < 0.05 and j>10: на if abs(ETP-ET) < 0.05 or j>10: и удалите отступ в return OUT, чтобы он не попал в цикл while.

Другие вопросы по теме