对于循环仅迭代列表的第一个索引

时间:2019-12-16 08:11:44

标签: python python-3.x list math numerical-methods

尝试做解决分配根的方法。但是,我的代码仅使用每个列表的第一个索引输出我的根v。

error = 1
temp = [273,313,353,373]
pressure = [1,2,3]
v = 23000 # initial guess
a = 0.7278
b = 0.08664
r = 83.14

roots = []

for p in pressure:
    for T in temp:
        while error > 0.01:
            rk = p - r*T/(v-b) + a/(v*(v-b)*T**(1/2))
            rk_prime = r*T/(v-0.08664)**2 + 0.7278*(T**(1/2)*(2*v-0.08664))/(T**(1/2)*v*(v-0.08664))**2
            v_old = v
            v = v - rk/rk_prime
            error = (v-v_old)/v
        roots.append(v)

print (roots)

但是,输出始终与仅使用每个列表的第一个索引相同。有什么建议吗?

[22693.269876331964, 22693.269876331964, 22693.269876331964, 22693.269876331964, 22693.269876331964, 22693.269876331964, 22693.269876331964, 22693.269876331964, 22693.269876331964, 22693.269876331964, 22693.269876331964, 22693.269876331964]

2 个答案:

答案 0 :(得分:0)

您至少有两个基本错误: 1)变量“错误”收敛到1,而不是0 2)rk-> + infinity和rk_prime-> -infinity,结果rk / rk_prime增长到最快。 您需要再次重新分析数学部分。

答案 1 :(得分:0)

您要解决0 = p - r*T/(v-b) + a/(v*(v-b)*T**(1/2))。如果不确定会发生什么,通常很难拥有一个可变的分母。对方程进行变换,使其仅是二次多项式(问题:为什么不求解为二次方程?)

0=p*v*(v-b) - r*T*v + a/T**0.5

然后使用“ do ... while”构造来评估错误

for p in pressure:
    for T in temp:
        while True:
            rk = p*v*(v-b) - r*T*v + a/T**0.5
            rk_prime = p*(2*v-b) - r*T
            v_old = v
            v = v - rk/rk_prime
            error = (v-v_old)/v
            if abs(error) < 0.01: break
        roots.append(v)

print (roots)

给出解决方案

[22697.30731894559,  26022.912165815087, 29348.508726500764, 31011.62618837772, 
 11348.701921344335, 13011.4994019666,   14674.297682565719, 15505.85641214106, 
  7565.9957164322,    8674.361811545235,  9782.894001254053, 10337.266486728855]