Python调用scipy.root求解自定义非线性方程输出为空问题求助
问题排查与修复方案
核心错误点
- 初始值
x0生成错误:np.ones(range(ngrid))会生成空数组,因为range(ngrid)会被解析为多维数组的形状,维度长度乘积为0,传入空初始值求解自然得到空结果。且你求解的是单变量方程,仅需传入标量初始值(如x0=1)即可。 - 结果存储逻辑错误:每次循环直接覆盖
q0变量,而非追加存储结果,若求解失败会直接得到空值。 - 缺少必要的库导入:代码中使用了
numpy和scipy.optimize.root,未提前导入会直接运行报错。 - 可选优化:求解单变量方程更适合用
scipy.optimize.root_scalar,收敛性和效率更高,不需要传入数组形式的初始值。
修复后可运行代码
import numpy as np from scipy.optimize import root_scalar def fun(x, y, z, v, b): Y = (z*(np.sign(x) * (np.abs(x))**(y-1))) - (v*np.sign(b) * (np.abs(b))**(v-1))/(1-b**v) return Y.flatten() Z0 = [1.2, 5, 3, 2.5, 4.2] SS = [2, 3, 2.2, 3.5, 5] ngrid = 10 kv = np.linspace(0.05, 2, ngrid) av = np.linspace(1.5, 4, ngrid) q0 = [] for z in range(len(Z0)): zz = Z0[z] ss = SS[z] for i in range(ngrid): for j in range(ngrid): kappa = kv[i] alpha = av[j] # 单变量方程用root_scalar求解,初始值设为1 res0 = root_scalar(lambda x: fun(x, alpha, zz, kappa, ss), x0=1) if res0.converged: q0.append(res0.root) print(res0.root) else: print(f"参数组合z={zz}, ss={ss}, kappa={kappa}, alpha={alpha}求解未收敛")
额外注意事项
- 你的方程右边第二项的分母
1 - b**v,由于SS所有取值都大于1,kappa为正数,因此b**v恒大于1,分母为负数不会出现除零问题,可正常计算。 - 若需要按参数分组存储结果,可调整
q0的存储结构为嵌套列表,方便后续对应参数查询。
内容的提问来源于stack exchange,提问作者Ostrich
相关产品推荐
相关产品推荐

