变量系数t变化时求解非线性方程组遇空列表问题求助
问题分析与解决
你的代码得到空列表的核心原因是缩进错误:fsolve调用以及向列表追加元素的代码被放在了equations函数内部,且位于return语句之后——函数执行到return就会直接退出,后续代码根本不会运行。循环每次只定义了函数却没有执行求解逻辑,自然列表b和n始终为空。
修正后的代码
from scipy.optimize import fsolve import numpy as np import math as m q0 = 0.0011 thetas, thetai, thetar = 0.43, 0.1, 0.05 ks = 0.0022 # m/hr psib = -0.15 # m lamda = 1 eta = 2 + 3 * lamda ki = 8.676 * 10**(-8) si = 0.13157 t = np.array([3, 18, 24]) S = 0.02 / 24 delta = -0.1001 b = [] n = [] for i in range(3): def equations(p): s, L = p f1 = ks * s**(3 + (2/lamda)) - (psib/(1-eta)) * ((ki * si**(-1/lamda) - ks * s**(3 + (1/lamda)))/L) - q0 f2 = L * (s * (thetas - thetar)) + S * t[i] * 0.5 * m.exp(-delta * psib * (-1 + s**(-1/lamda))) - (q0 - ki) * t[i] return (f1, f2) # 将求解和追加代码移到函数外部,与函数定义同缩进 s, L = fsolve(equations, [0.19, 0.001]) b.append(s) n.append(L) # 可选:打印每次求解结果,验证收敛情况 print(f"t={t[i]}时,s={s}, L={L}") print("s的结果列表:", b) print("L的结果列表:", n)
额外注意事项
- 初始值
[0.19, 0.001]的选择会影响fsolve的收敛性,如果某些t值下求解失败,可以尝试调整初始值范围。 - 可以添加收敛性检查,比如查看求解后的残差(即
equations([s, L])的输出是否接近0),确保解的合理性。
内容的提问来源于stack exchange,提问作者Mahesh
相关产品推荐
相关产品推荐

