1. 程式人生 > >MATLAB解方程組中 solve 和 fsolve 的細節比較

MATLAB解方程組中 solve 和 fsolve 的細節比較

MATLAB作為科研工作者的忠實夥伴,解各種複雜方程的效能與其他工具相比,自然不逞多讓。本期盤點MATLAB中solve和fsolve兩個函式在解方程中的優劣。

1. solve函式

語法:

S = solve(eqn,var)
S = solve(eqn,var,Name,Value)
Y = solve(eqns,vars)
Y = solve(eqns,vars,Name,Value)
[y1,...,yN] = solve(eqns,vars)
[y1,...,yN] = solve(eqns,vars,Name,Value)
[y1,...,yN,parameters,conditions] = solve(eqns,vars,'ReturnConditions',true)

描述:

S = solve(eqn,var) 求解變數var的方程eqn 。如果未指定var, symvar 函式將確定要為其求解的變數。例如, solve(x + 1 == 2, x)解決等式 x + 1 = 2為x .
例子
S = solve(eqn,var,Name,Value) 使用由一個或多個Name,Value對引數指定的附加選項。
例子
Y = solve(eqns,vars) 解決了方程組eqns的變數vars , 並返回一個結構, 包含解決方案。如果不指定vars, 則solve使用 symvar 查詢要解決的變數。在這種情況下, symvar發現的變數數等於等式的個數eqns.
例子
Y = solve(eqns,vars,Name,Value) 使用由一個或多個Name,Value對引數指定的附加選項.
例子
[y1,...,yN] = solve(eqns,vars) 解決了變數vars的eqns方程組。解決方案被分配給y1,...,yN的變數。如果不指定變數, solve使用symvar查詢要解決的變數。在這種情況下, symvar發現的變數數等於輸出引數的個數N.
[y1,...,yN] = solve(eqns,vars,Name,Value) 使用由一個或多個名稱指定的附加選項Name,Value對引數。
例子
[y1,...,yN,parameters,conditions] = solve(eqns,vars,'ReturnConditions',true) 返回指定解決方案中的引數和解決方案條件的附加引數parameters和conditions。

solve 函式的侷限性

  1. 對於非多項式方程,只能求出一個解
  2. 對於稍許複雜的方程,求解結果出現很大誤差
  3. 求解複雜的多項式方程時,可能會產生錯誤的求解結果
  4. 求解複雜的多項式方程時,可能無法求解,且非常耗時
  5. 求解超越方程時,只能返回一個解;
  6. 求解超越方程時,可能返回錯誤解;

2. fsolve函式

語法(僅列出兩種)

x = fsolve(fun,x0)
[x,fval,exitflag] = fsolve(fun,x0,options)
fun: 函式,用於定義方程(組)
x0: 計算初值
x: 求解結果(方程的根)
fval: 將求解結果x 帶入方程(組) fun,對應的值,即fun(x)
exitflag: 返回方程組求解結果的狀態(詳見help 文件)
options: 方程的求解設定

MATLAB fsolve函式總結

  1. fsolve可以求解方程(組) 的實數根和複數根
  2. fsolve採用迭代的數值演算法,速度快
  3. 給定不同的初值,可以求得不同的根(區域性尋根)
  4. 初值給的不好,可能導致求解失敗
  5. 關於初值如何給定的問題
    a) 一元/ 二元方程(組),通過圖解法,可以得到根的個數,並粗略地估計出根的值,用做fsolve的初值
    b) 根據方程組中變數的實際意義,合適地給出初值。例如,時間/ 長度/ 質量等物理量,應該大於0
    c) 通過更多的練習和經驗積累,自然會見多識廣

總結:
儘量避免使用solve函式
儘可能使用fsolve求解數值解