我正在尝试解决 Python 中的根查找问题,这应该很容易,但到目前为止已被证明是一个棘手的问题。我已将以下方程呈现为函数:
def fullsol(x, DIC, QCharge):
return [x[3] - (DIC/((1 +(K1/x[0]) + (K1*K2/(x[0])**2)))),
x[1] - (DIC/((1 +(x[0]/K1) + (K2/(x[0]))))),
x[2] - (DIC/(1 +(x[0]/K2) + ((x[0]**2)/K1*K2))),
(x[0]*x[4]) - Kw,
2*QCharge - x[0] + x[1] + 2*x[2] + x[4] - (DIC/0.78)]
此函数返回 5 个具有 5 个未知数的方程(“DIC”和“QCharge”是常数),接下来我调用最小二乘优化(来自 scipy)来获得根,并带有初始猜测和界限(我知道所有参数都更大大于零):
x0 = ([0.1, 0.1, 0.1, 0.1, 0.1])
solution = optimize.least_squares(fullsol, x0, args=(0.0035, 0),bounds =(0,np.inf))
当我运行这段代码时,我得到一个我知道是错误的结果,因为在 Mathematica 中运行确切的问题(使用 NSolve)给出了不同的、更准确的答案。当我使用optimize.root
而不是最小二乘时,我在 Python 中得到了相同的(错误的)答案,所以就好像 Python 的优化包只是......不准确。
我很感激任何关于我是否做错了什么的指导、故障排除的建议和/或 Python 中最接近 NSolve 的近似值。
PS。我尝试在 Python 中使用 NSolve,但它在给定的容差范围内找不到根。下面的代码:
K1 = 10**-5.86
K2 = 10**-8.92
Kw = 10**-13.22
DIC = 0.0035
QCharge = 0
x0 = Symbol('x0')
x1 = Symbol('x1')
x2 = Symbol('x2')
x3 = Symbol('x3')
x4 = Symbol('x4')
f1 = x3 - DIC/((1 +(K1/x0) + (K1*K2/(x0)**2)))
f2 = x1 - DIC/((1 +(x0/K1) + (K2/(x0))))
f3 = x2 - DIC/(1 +(x0/K2) + ((x0**2)/K1*K2))
f4 = x0*x4 - Kw
f5 = -x0+ 2*QCharge + x1 + 2*x2+ x4 - (DIC/0.78)
solution = nsolve((f1,f2,f3,f4,f5),(x0,x1,x2,x3,x4),(0.1,0.1,0.1,0.1,0.1))