Main Content

fzero

説明

x = fzero(fun,x0) は、fun(x) = 0 となる点 x を求めようとします。この解は、fun(x) が符号を変える場所です。fzero は、x^2 のような関数の根は求められません。

x = fzero(fun,x0,options) は、options を使用して解法プロセスを変更します。

x = fzero(problem) は、problem で指定された、根の探索問題を解きます。

[x,fval,exitflag,output] = fzero(___) は、出力 fvalfun(x) を返し、fzero が停止した理由をエンコードした exitflag と、解法プロセスについての情報を格納する出力構造体も返します。

すべて折りたたむ

3 の近傍で正弦関数の零点を求めることにより π を計算します。

fun = @sin; % function
x0 = 3; % initial point
x = fzero(fun,x0)
x = 3.1416

12 の間にある余弦の零点を求めます。

fun = @cos; % function
x0 = [1 2]; % initial interval
x = fzero(fun,x0)
x = 1.5708

cos(1)cos(2) の符号が異なることに注意してください。

関数 f(x) = x3 – 2x – 5. の零点を求めます。

最初に、ファイル f.m を記述します。

function y = f(x)
y = x.^3 - 2*x - 5;

MATLAB® パス上に f.m を保存します。

2 の近傍の f(x) の零点を求めます。

fun = @f; % function
x0 = 2; % initial point
z = fzero(fun,x0)
z =
    2.0946

f(x) は多項式なので、roots コマンドを使用して、同じ実数零点と零点の複素共役対を検出できます。

roots([1 0 -2 -5])
   ans =
   2.0946          
  -1.0473 + 1.1359i
  -1.0473 - 1.1359i

追加パラメーターをもつ関数の根を求めます。

myfun = @(x,c) cos(c*x);  % parameterized function
c = 2;                    % parameter
fun = @(x) myfun(x,c);    % function of x alone
x = fzero(fun,0.1)
x = 0.7854

いくつかのプロット関数を設定することによって解法プロセスをプロットします。

関数と初期点を定義します。

fun = @(x)sin(cosh(x));
x0 = 1;

プロット関数を含むオプションを設定することによって解法プロセスを調べます。

options = optimset('PlotFcns',{@optimplotx,@optimplotfval});

options を含めて fzero を実行します。

x = fzero(fun,x0,options)

Figure Optimization Plot Function contains 2 axes objects. Axes object 1 with title Current Point, xlabel Variable number, ylabel Current point contains an object of type bar. Axes object 2 with title Current Function Value: -3.21625e-16, xlabel Iteration, ylabel Function value contains an object of type scatter.

x = 1.8115

問題の構造体で定義される問題を解きます。

根の探索問題をエンコードする構造体を定義します。

problem.objective = @(x)sin(cosh(x));
problem.x0 = 1;
problem.solver = 'fzero'; % a required part of the structure
problem.options = optimset(@fzero); % default options

問題を解きます。

x = fzero(problem)
x = 1.8115

exp(-exp(-x)) = x である点を求め、解法プロセスに関する情報を表示します。

fun = @(x) exp(-exp(-x)) - x; % function
x0 = [0 1]; % initial interval
options = optimset('Display','iter'); % show iterations
[x fval exitflag output] = fzero(fun,x0,options)
 
 Func-count    x          f(x)             Procedure
    2               1     -0.307799        initial
    3        0.544459     0.0153522        interpolation
    4        0.566101    0.00070708        interpolation
    5        0.567143  -1.40255e-08        interpolation
    6        0.567143   1.50013e-12        interpolation
    7        0.567143             0        interpolation
 
Zero found in the interval [0, 1]
x = 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]'

fval = 0 は、想定どおり fun(x) = 0 であることを意味します。

入力引数

すべて折りたたむ

解を求める関数。スカラー値関数のハンドルまたはそのような関数の名前として指定します。fun は、スカラー x を受け入れ、スカラー fun(x) を返します。

fzerofun(x) = 0 を解きます。方程式 fun(x) = c(x) を解くには、代わりに fun2(x) = fun(x) - c(x) = 0 を解きます。

関数に追加のパラメーターを含めるには、追加パラメーターをもつ関数の根の例および関数のパラメーター化の節を参照してください。

例: 'sin'

例: @myFunction

例: @(x)(x-a)^5 - 3*x + a - 1

データ型: char | function_handle | string

初期値。実数スカラーまたは 2 要素実数ベクトルとして指定します。

  • スカラー — fzerox0 から開始し、fun(x1)fun(x0) の逆の符号をもつ点 x1 を見つけようとします。その後、fzero は、解に到達するまで、fun が符号を変える区間を反復して縮小します。

  • 2 要素ベクトル — fzero は、fun(x0(1))fun(x0(2)) が逆の符号をもっているかをチェックし、それらが逆の符号をもっていない場合はエラーになります。その後、解に到達するまで、fun が符号を変える区間を反復して縮小します。区間 x0 は有限である必要があります。すなわち、±Inf は含めません。

ヒント

区間 (2 つの要素をもつ x0) を伴った fzero を呼び出すと、スカラー x0 を呼び出すより高速になる場合があります。

例: 3

例: [2,17]

データ型: double

解法プロセスのオプション。構造体として指定します。optimset を使用して構造体 options を作成または変更します。fzero は以下の options 構造体フィールドを使用します。

Display

表示レベル:

  • 'off' は出力を表示しません。

  • 'iter' は各反復の出力を表示します。

  • 'final' は最終出力のみを表示します。

  • 'notify' (既定) は、関数が収束しない場合にのみ出力を表示します。

FunValCheck

目的関数値が正しいかどうかチェックします。

  • 'on' は、目的関数が返す値が complexInf または NaN である場合にエラーを表示します。

  • 既定の 'off' ではエラーを表示しません。

OutputFcn

各反復で最適化関数が呼び出すユーザー定義の関数を 1 つか複数指定します (関数ハンドルか関数ハンドルの cell 配列として)。既定の設定はなし ([]) です。最適化ソルバーの出力関数を参照してください。

PlotFcns

アルゴリズムを実行しながら、進行中のさまざまな測定値をプロットします。事前定義済みのプロットから選択するか、自身で記述します。関数名、関数ハンドル、または、関数名か関数ハンドルの cell 配列を渡します。既定は [] (なし) です。

  • @optimplotx は現在の点をプロットします。

  • @optimplotfval は関数値をプロットします。

カスタム プロット関数の記述については、「最適化ソルバーのプロット関数」を参照してください。

TolX

x に関する許容誤差 (正のスカラー)。既定値は eps、2.2204e-16 です。

例: options = optimset('FunValCheck','on')

データ型: struct

根の探索問題。以下のすべてのフィールドを含む構造体として指定します。

objective

目的関数

x0

x の初期点、実数スカラーまたは 2 要素ベクトル

solver

'fzero'

options

オプション構造体 (通常、optimset を使用して作成)

例については、問題の構造体を解くを参照してください。

データ型: struct

出力引数

すべて折りたたむ

根または符号変化の場所。スカラーとして返されます。

x での関数値。スカラーとして返されます。

終了条件をエンコードした整数。fzero がその反復を停止した理由を意味します。

1

関数が解 x に収束したことを示します。

-1

アルゴリズムが出力関数またはプロット関数によって停止されたことを示します。

-3

符号変化を含む区間の探索中に、関数値 NaN または Inf があったことを示します。

-4

符号変化を含む区間の探索中に、複素関数値があったことを示します。

-5

アルゴリズムは、特異点に収束した可能性があります。

-6

fzero が符号変化を検出しなかったことを示します。

根の探索プロセスに関する情報。構造体として返されます。構造体のフィールドは、次のとおりです。

intervaliterations

根を含む区間を見つけるための反復数

iterations

零点を見つける反復数

funcCount

関数評価の回数

algorithm

'bisection, interpolation'

message

終了メッセージ

アルゴリズム

fzero コマンドは関数ファイルです。T. Dekker が作成したこのアルゴリズムは、二分法、正割、および逆 2 次内挿法を組み合わせて使用します。いくつかの改良がなされた Algol 60 バージョンは[1]にあります。fzero が基づいている Fortran 版は[2]にあります。

代替機能

アプリ

[最適化] ライブ エディター タスクは、fzero のビジュアル インターフェイスを提供します。

参照

[1] Brent, R., Algorithms for Minimization Without Derivatives, Prentice-Hall, 1973.

[2] Forsythe, G. E., M. A. Malcolm, and C. B. Moler, Computer Methods for Mathematical Computations, Prentice-Hall, 1976.

拡張機能

バージョン履歴

R2006a より前に導入