Python,带有列表或数组的复杂循环计算

时间:2014-01-27 12:14:25

标签: python arrays list loops while-loop

我正在将旧的伪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()'是一个单独的函数,被调用,从两个输入值返回一个值

1 个答案:

答案 0 :(得分:0)

我当前的解决方案

设置所有空列表

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数组(我计划在不久的将来学习)