问题
我正在尝试使用 数值求解代数方程的非线性系统scipy.optimize.fsolve
。
我解决了系统的几个不同参数值(k1, k2, k3
如下)。对于某些参数值fsolve
可以找到正确的解决方案,而对于其他参数值会出现以下警告
RuntimeWarning: The iteration is not making good progress, as measured by the
improvement from the last five Jacobian evaluations.
warnings.warn(msg, RuntimeWarning)
从这些情况下的结果来看,很明显出现了问题,因为h(result)
它不是一个零向量。毫无疑问,解决方案确实存在,并且它与找到正确解决方案的情况在性质上没有什么不同。
在这些情况下通常推荐什么?是初始条件的问题吗?
例子
下面我将展示我如何求解方程组的想法:
import numpy as np
from scipy.optimize import fsolve
# Parameters for the system of equations
k1, k2, k3 = 2., 4.5, 0.1
# Function for evaluating the residual of the system
def h(x):
x1, x2, x3=x
eqn1 = k1*x1 + k2*x2**2 - x3
eqn2 = x1 - 2.*x2 + k3*x3
eqn3 = x1 + x2 + x3 - 1.
return eqn1, eqn2, eqn3
# An initial guess
x0 = np.array([1., 0.5, 1.])
# Get the solution of the system of equations
result = fsolve(h, x0=x0, xtol=1e-5)
# Now, verify that the solution is correct
print(h(result)) # Should be near (0,0,0)
这有时很好用,但是对于它的某些值k1, k2, k3
会引发上述RuntimeWarning
讨论并返回错误的结果
# Bad parameters
k1, k2, k3 = 2., 4.5, -1.
# Bad result
result = fsolve(h, x0=x0, xtol=1e-5)
# Verification shows the residual is not near (0,0,0)
print(h(result))