根发现Python不准确?

时间:2018-07-18 00:52:37

标签: python optimization scipy wolfram-mathematica

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

0 个答案:

没有答案