MATLAB解方程組中 solve 和 fsolve 的細節比較
阿新 • • 發佈:2018-12-12
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 函式的侷限性
- 對於非多項式方程,只能求出一個解
- 對於稍許複雜的方程,求解結果出現很大誤差
- 求解複雜的多項式方程時,可能會產生錯誤的求解結果
- 求解複雜的多項式方程時,可能無法求解,且非常耗時
- 求解超越方程時,只能返回一個解;
- 求解超越方程時,可能返回錯誤解;
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函式總結
- fsolve可以求解方程(組) 的實數根和複數根
- fsolve採用迭代的數值演算法,速度快
- 給定不同的初值,可以求得不同的根(區域性尋根)
- 初值給的不好,可能導致求解失敗
- 關於初值如何給定的問題
a) 一元/ 二元方程(組),通過圖解法,可以得到根的個數,並粗略地估計出根的值,用做fsolve的初值
b) 根據方程組中變數的實際意義,合適地給出初值。例如,時間/ 長度/ 質量等物理量,應該大於0
c) 通過更多的練習和經驗積累,自然會見多識廣
總結:
儘量避免使用solve函式
儘可能使用fsolve求解數值解