簡體   English   中英

使用 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 - 3fsolve給出一個有效的數值解:

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]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM