使用 Python 的 fsolve 函数求解非线性方程组
Solving nonlinear systems of equations using Python's fsolve function
我正在使用 scipy.optimize 的函数 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)
结果 -6.06 和 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]
我正在使用 scipy.optimize 的函数 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)
结果 -6.06 和 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]