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