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(___)fval 出力で fun(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 要素ベクトル — fzerofun(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 は関数値をプロットします。

カスタムのプロット関数は、出力関数と同じ構文を使用します。詳細については、Optimization Toolbox の出力関数出力関数とプロット関数の構文を参照してください。

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 より前に導入