我正在将旧的伪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:使用“时间序列数据”,有一个impicit循环遍历每个列表中的单个值,并遍历每个值直到满足条件。
它将对第一个列表值执行循环计算,直到满足条件为止。然后,它移动到列表中的第二个值,并执行相同的循环计算,直到满足条件。
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()‘是一个单独的函数,它被调用,从两个输入值返回一个值
发布于 2014-01-27 13:37:59
我目前的解决方案
设置所有空列表
nPts = range(ECART2)
MMM = [0]*nPts
YM5 = [0]*nPts
etc...然后开始执行计算
for i in ECART2:
while (ECART2[i] > 0.0002) and (NNNN[i] < 2000):
MMM[i] = NNNN[i]+1
if YRPVBPO[i]>=0.1 and YRPVBPO[i]<=0.999930338 and YAEVBPO[i]>=0.000015 and YAEVBPO[i]<=0.000615:
YM5[i] = MACH_LBP_DIA30(YRPVBPO[i],YAEVBPO[i])
YUEVBO[i] = YU0VBO[i]*YM5[i]
YHEVBO[i] = YCPEVBO[i]*TGETO1[i] + 0.5*YUEVBO[i]^2
YAVBO[i] = DDNN2[i]*YUEVBO[i]^2
YDVBO[i] = YCPEVBO[i]^2 + 4*YHEVBO[i]*YAVBO[i]
etc etc...但我猜想有更好的方法来做到这一点,比如建议使用numpy数组(我计划在不久的将来学习)。
https://stackoverflow.com/questions/21380617
复制相似问题