MATLAB fzero 関数

Ammar Ali 2024年2月15日
MATLAB fzero 関数

このチュートリアルでは、MATLAB の fzero() 関数を使用して非線形関数のルートを見つける方法について説明します。

MATLAB fzero() 関数

fzero() 関数は、非線形関数のルートを見つけるために使用されます。この関数は、secant メソッドや bisection メソッドなどのさまざまな補間メソッドを使用して、指定された非線形関数のルートを見つけます。

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 の間隔でコサイン関数のルートを見つけましょう。

以下のコードを参照してください。

clc
clear

f = @cos;
x0 = [1 3];
value = fzero(f,x0)

出力:

value = 1.5708

間隔の端点での関数の値は符号が異なる必要があることに注意してください。そうしないと、エラーが発生し、エラーが表示された場合は、間隔値の 1つの符号を変更する必要があります。cos(1)cos(3) の符号はすでに異なるため、上記のコードでは符号が異なる間隔値を使用しませんでした。

ルートを検索する入力関数には 1つのパラメーターのみが必要であり、複数のパラメーターがある場合は、ルートを検索する前に他のパラメーターの値を渡す必要があることに注意してください。たとえば、2つのパラメータを使用して関数を作成し、1つのパラメータの値を渡してから、関数のルートを見つけましょう。

以下のコードを参照してください。

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

上記の出力では、f 関数に 2つのパラメーターが含まれているため、fzero() 関数内に f_1 関数を渡しました。1つのパラメーターの値を渡さない限り、そのルートは評価されません。

PlotFcns 引数を使用して現在のポイントまたは関数値のプロットとして fzero() 関数内に他のいくつかのオプションを設定し、を使用してデフォルトで 2.2e-16 に設定されている許容値を設定することもできます。TolX 引数、OutputFcn 引数を使用して fzero() 関数の各反復で呼び出される出力関数、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 関数プロット

上記の出力では、ゼロが検出された間隔を確認できます。また、現在のポイントのプロットと、さまざまな反復での関数値のプロットも確認​​できます。

表示オプションには、出力なしの場合は iter、各反復での出力の場合は iter、最終出力のみの場合は final、関数が収束しない場合にのみ出力の場合は通知の 4つのタイプがあります。

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() 関数の詳細については、このリンクを確認してください。

著者: 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