【发布时间】:2014-02-18 06:39:15
【问题描述】:
我正在将旧的伪 Fortran 代码转换为 python,并且正在努力创建一个框架,我可以在其中执行一些复杂的迭代计算。
作为初学者,我的第一直觉是使用列表,因为我发现它们更容易使用,但我知道数组可能是更合适的方法。
我已经将所有输入通道作为列表,希望能很好地解释如何为此类计算设置循环。
这是我正在复制的伪 Fortran 示例。每个 (t) 表示我当前存储为列表的“时间序列通道”(即 ECART2(t) 和 NNNN(t) 是列表)所有列表都有相同数量的条目。
do while ( ecart2(t) > 0.0002 .and. nnnn(t) < 2000. ) ;
mmm(t)=nnnn(t)+1.;
if YRPVBPO(t).ge.0.1 .and. YRPVBPO(t).le.0.999930338 .and. YAEVBPO(t).ge.0.000015 .and. YAEVBPO(t).le.0.000615 then do;
YM5(t) = customFunction(YRPVBPO,YAEVBPO);*
end;
YUEVBO(t) = YU0VBO(t) * YM5(t) ;*m/s
YHEVBO(t) = YCPEVBO(t)*TPO_TGETO1(t)+0.5*YUEVBO(t)*YUEVBO(t);*J/kg
YAVBO(t) = ddnn2(t)*(YUEVBO(t)**2);*
YDVBO(t) = YCPEVBO(t)**2 + 4*YHEVBO(t)*YAVBO(t) ;*
YTSVBPO(t) = (sqrt(YDVBO(t))-YCPEVBO(t))/2./YAVBO(t);*K
YUSVBO(t) = ddnn(t)*YUEVBO(t)*YTSVBPO(t);*m/s
YM7(t) = YUSVBO(t)/YU0VBO(t);*
YPHSVBPOtot(t) = (YPHEVBPO(t) - YPDHVBPO(t))/(1.+((YGAMAEVBO(t)-1)/2)*(YM7(t)**2))**(YGAMAEVBO(t)/(1-YGAMAEVBO(t)));*bar
YPHEVBPOtot(t) = YPHEVBPO(t) / (1.+rss0(t)*YM5(t)*YM5(t))**rss1(t);*bar
YDPVBPOtot(t) = YPHEVBPOtot(t) - YPHSVBPOtot(t) ;*bar
iter(t) = (YPHEVBPOtot(t) - YDPVBPOtot(t))/YPHEVBPOtot(t);*
ecart2(t)= ABS(iter(t)-YRPVBPO(t));*
aa(t)=YRPVBPO(t)+0.0001;
YRPVBPO(t)=aa(t);*
nnnn(t)=mmm(t);*
end;
理解伪 fortran:对于“时间序列数据”,有一个隐式循环遍历每个列表中的各个值 - 以及遍历这些值中的每一个,直到满足条件。 em>
它将对第一个列表值进行循环计算,直到满足条件。然后它移动到列表中的第二个值并执行相同的循环计算,直到满足条件...
ECART2 = [2,0,3,5,3,4]
NNNN = [6,7,5,8,6,7]
do while ( ecart2(t) > 0.0002 .and. nnnn(t) < 2000. )
MMM = NNNN + 1
这会查看每个列表中的第一个值(2 和 6)。因为条件都满足了,所以后续的计算都是对新列表中的第一个值进行计算,比如MMM = [6+1,...]
一旦执行了其余的计算(如果不满足条件,则循环多次),然后才考虑每个列表中的第二个值。第二个值(0 和 7)不满足条件,因此 MMM 的第二个条目为 0。
MMM=[6+1, 0...]
由于不满足条件必须输入 0,所以我正在考虑提前设置所有“新列表”并用 0 填充它们。
注意:'customFunction()' 是一个被调用的单独函数,从两个输入值返回一个值
【问题讨论】:
-
看看 numpy 它是处理这类事情的工具。也值得一看 Pandas。
-
我意识到 numpy 数组将是最好的解决方案,但对它们还不够熟悉 - 因此我更喜欢列表以及为什么我提出这个问题;)感谢“熊猫”的建议,绝对是让我进行调查,因为我只使用时间序列数据...
标签: python arrays list loops while-loop