MATLAB fzero 函式

Ammar Ali 2024年2月15日
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

clcclear 命令用於清除上述程式碼中的命令和工作區視窗。正如我們在輸出中看到的,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

fzero 函式圖

在上面的輸出中,我們可以看到找到零的區間,我們還可以看到當前點的圖和不同迭代的函式值圖。

顯示選項有四種型別 off 表示不輸出,iter 表示每次迭代輸出,final 表示僅最終輸出,僅當函式不收斂時才通知輸出。

我們可以將 FunValCheck 選項設定為 onoff,如果設定為 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() 函式的更多詳細資訊。

作者: Ammar Ali
Ammar Ali avatar Ammar Ali avatar

Hello! I am Ammar Ali, a programmer here to learn from experience, people, and docs, and create interesting and useful programming content. I mostly create content about Python, Matlab, and Microcontrollers like Arduino and PIC.

LinkedIn Facebook