MATLAB fzero 函式
本教程將討論使用 MATLAB 中的 fzero()
函式查詢非線性函式的根。
MATLAB fzero()
函式
fzero()
函式用於查詢非線性函式的根。該函式使用不同的插值方法,如割線法和二等分法來找到給定非線性函式的根。
fzero()
函式的基本語法如下。
roots = fzero(fun, x0);
上面的語法將返回從點 x0
開始的 fun
的根。例如,讓我們通過在 3 附近找到 sine
函式的根來找到 pi 的值。
請參閱下面的程式碼。
clc
clear
f = @sin;
x0 = 3;
value = fzero(f,x0)
輸出:
value = 3.1416
clc
和 clear
命令用於清除上述程式碼中的命令和工作區視窗。正如我們在輸出中看到的,fzero()
函式返回的值大約等於 pi 的值。
除了傳遞單個點作為起點,我們還可以傳遞一個區間來找到給定非線性函式的根。例如,讓我們在 1 到 3 的區間內找到 cosine
函式的根。
請參閱下面的程式碼。
clc
clear
f = @cos;
x0 = [1 3];
value = fzero(f,x0)
輸出:
value = 1.5708
請注意,函式在區間端點處的值應在符號上有所不同;否則,將出現錯誤,如果出現錯誤,我們必須更改區間值之一的符號。在上面的程式碼中,我們沒有使用具有不同符號的區間值,因為 cos(1)
和 cos(3)
符號已經不同。
請注意,我們要查詢其根的輸入函式應該只有一個引數,如果它有多個引數,我們必須在找到根之前傳遞其他引數的值。例如,讓我們建立一個有兩個引數的函式,傳遞一個引數的值,然後找到函式的根。
請參閱下面的程式碼。
clc
clear
f = @(x,c) cos(c*x);
c = 3;
f_1 = @(x) f(x,c);
x = fzero(f_1,0.1)
輸出:
x = 0.5236
在上面的輸出中,我們在 fzero()
函式中傳遞了 f_1
函式,因為 f
函式包含兩個引數,除非我們傳遞一個引數的值,否則它的根不會被計算。
我們還可以使用 PlotFcns
引數在 fzero()
函式內設定一些其他選項作為當前點或函式值的圖,使用 PlotFcns
設定預設設定為 2.2e-16
的容差值 TolX引數,將在
fzero()函式的每次迭代中使用
OutputFcn引數呼叫的輸出函式,使用
FunValCheck 引數檢查目標函式的值,使用
顯示`引數。
要設定選項,我們必須使用 optimset()
函式建立所有選項的結構。例如,讓我們為非線性函式設定上述選項。
請參閱下面的程式碼。
clc
clear
f = @(x,c) cos(c*x);
c = 3;
f_1 = @(x) f(x,c);
options = optimset('PlotFcns',{@optimplotx,@optimplotfval},'Display','final','FunValCheck','on','TolX',1.1e-16);
x = fzero(f_1,0.1,options)
輸出:
Zero found in the interval [-0.412, 0.612]
x = 0.5236
在上面的輸出中,我們可以看到找到零的區間,我們還可以看到當前點的圖和不同迭代的函式值圖。
顯示選項有四種型別 off 表示不輸出,iter
表示每次迭代輸出,final
表示僅最終輸出,僅當函式不收斂時才通知輸出。
我們可以將 FunValCheck
選項設定為 on
或 off
,如果設定為 on
,如果輸出為無窮大、NaN
或複數,函式將顯示錯誤,如果是設定為 off
,將不會顯示錯誤。
我們還可以通過使用 problem
引數將函式定義為問題結構來找到函式的根。
我們將使用 problem.objective
命令來定義函式。我們將使用 problem.x0
命令來初始化起點或間隔。
我們將使用 problem.solver
命令來定義求解方法。我們可以使用 problem.options
命令來設定選項。
名稱問題可以更改為任何字元或字串。例如,讓我們使用問題結構來找到非線性函式的根。
請參閱下面的程式碼。
clc
clear
p.objective = @(x)sin(cosh(x));
p.x0 = 1;
p.solver = 'fzero';
p.options = optimset(@fzero);
root = fzero(p)
輸出:
root =
1.8115
我們還可以從 fzero()
函式中獲取其他資訊,例如函式值、指示退出條件的退出標誌以及有關尋根過程的資訊。
退出標誌可以返回 1
(表示函式收斂)、-1
(表示演算法由於輸出或繪圖函式而終止)、-3
(表示無窮大或 NaN
值是遇到)、-4
(表示遇到複數)、-5
(表示演算法收斂到奇異點)和 -6
(表示函式未檢測到符號的變化)。
例如,讓我們找到一個非線性函式的根並獲取有關該過程的所有資訊。請參閱下面的程式碼。
clc
clear
Myfun = @(x) exp(-exp(-x)) - x;
x0 = [0 1];
[root fval exitflag output] = fzero(Myfun,x0)
輸出:
root =
0.5671
fval =
0
exitflag =
1
output =
struct with fields:
intervaliterations: 0
iterations: 5
funcCount: 7
algorithm: 'bisection, interpolation'
message: 'Zero found in the interval [0, 1]'
該函式還返回迭代之間的間隔、迭代總數以及用於查詢非線性函式根的演算法。檢視此連結瞭解有關 fzero()
函式的更多詳細資訊。