使用 Python 的解函数求解非线性方程组



我使用scipy。优化函数fsolve求解两个方程中的两个未知数。我最后要解的方程要复杂得多,但我已经很难理解下面的基本例子了。

import scipy.optimize as scopt
def fun(variables) :
(x,y) = variables
eqn_1 = x ** 2 + y - 4
eqn_2 = x + y ** 2 +3
return [eqn_1, eqn_2]
result = scopt.fsolve(fun, (0.1, 1)) 
print(result)

这给出了结果[-2.08470396 -0.12127194],但是当我将这些数字插入函数时(一次假设第一个是x,一次假设第一个是y),我得到的结果与零非常不同。

print((-2.08470396)**2 - 0.12127194 - 4)
print((-2.08470396) + (- 0.12127194) ** 2 + 3)

结果0.22、0.93。

print((-0.12127194)**2 -2.08470396 - 4)
print((-0.12127194) + (-2.08470396) ** 2 + 3)

Result -6.06 and 7.22.

我在这里错过了什么?

您注意到运行result = scopt.fsolve(fun, (0.1, 1))时生成的警告了吗?该警告告诉您某些操作失败了:

In [35]: result = scopt.fsolve(fun, (0.1, 1))
/Users/warren/a202111/lib/python3.9/site-packages/scipy/optimize/minpack.py:175: RuntimeWarning: The iteration is not making good progress, as measured by the 
improvement from the last ten iterations.
warnings.warn(msg, RuntimeWarning)

问题是fun(variables) = (0, 0)没有解。第一个方程给出y = 4-x**2,然后第二个方程可以写成x + (4-x**2)**2 + 3 = 0,它没有真正的解(你可以画出左边或做一些代数来说服自己)。

如果你使用eqn_2 = x + y ** 2 - 3,fsolve给出一个有效的数值解:

In [36]: def fun(variables) :
...:     (x,y) = variables
...:     eqn_1 = x ** 2 + y - 4
...:     eqn_2 = x + y ** 2 - 3
...:     return [eqn_1, eqn_2]
...: 
In [37]: result = scopt.fsolve(fun, (0.1, 1))
In [38]: result
Out[38]: array([-1.38091841,  2.09306436])
In [39]: fun(result)
Out[39]: [0.0, 0.0]

最新更新