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 引數檢查目標函式的值,使用 Display 引數。
要設定選項,我們必須使用 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() 函式的更多詳細資訊。
