尝试做解决分配根的方法。但是,我的代码仅使用每个列表的第一个索引输出我的根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]
答案 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]