我正在尝试解决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))