For循环只迭代列表的第一个索引

For loop only iterating first index of list

正在尝试执行求解作业根的方法。但是,我的代码使用每个列表的第一个索引仅输出我的根 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]

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

您想解决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]