Mathematics | ![]() ![]() |
関数のゼロの探索
関数fzero
は、1変数の関数のゼロを探索します。この関数は、最初の間隔を設定する2要素ベクトル、または、1要素のスタート点のどちらかと共に読み込まれます。初期値x0としてfzero
を設定すると、関数は符号の変わる部分を挟む区間を探します。この区間が見つからなければ、fzero
はNaN
を出力します。また、関数の符号が変化する2点が既知ならば、2要素ベクトルを使ってこの初期の区間を設定することができます。そして、fzero
は、区間を狭くしようとし、符号の変化する近傍の値を出力します。
-0.2
の近傍で、humps
関数のゼロ点を探すため、fzero
を使います。
a = fzero(@humps,-0.2) a = -0.1316
この初期値に対して、fzero
は-0.10949と-0.264の間で符号が変更するまで、-0.2の近傍を探索します。この区間は、-0.1316まで狭められます。-0.1316で関数は非常にゼロに近付くなることを確認しましょう。
humps(a) ans = 8.8818e -16
humps
の関数値が、x = 1
や x = -1
のように、符号の変わる2つの位置を知っていると仮定します。
humps(1) ans = 16 humps(-1) ans = -5.1378
そして、この区間からfzero
を始め、関数の符号が変化する点の近傍を出力しましょう。fzero
の処理過程を表示しましょう。
options = optimset('Display','iter'); a = fzero(@humps,[-1 1],options) Func-count x f(x) Procedure 1 -1 -5.13779 initial 1 1 16 initial 2 -0.513876 -4.02235 interpolation 3 0.243062 71.6382 bisection 4 -0.473635 -3.83767 interpolation 5 -0.115287 0.414441 bisection 6 -0.150214 -0.423446 interpolation 7 -0.132562 -0.0226907 interpolation 8 -0.131666 -0.0011492 interpolation 9 -0.131618 1.88371e-07 interpolation 10 -0.131618 -2.7935e-11 interpolation 11 -0.131618 8.88178e-16 interpolation 12 -0.131618 -9.76996e-15 interpolation a = -0.1316
アルゴリズムの進行に伴いProcedure
の列にbisectionとinterpolationのどちらも使われています。例題が最初の区間の代わりに1つのスカラの初期値を使って処理を始めようとすると、fzero
は符号の変化する区間を含んで探索を行なう一方、初期関数値を算出した後、最初のステップはいくつかの探索ステップを含んでいます
optimset
を使って、3番目の入力引数として、相対誤差の許容範囲を設定することができます。前に読み込んでいるように、空行列では、デフォルトの相対誤差許容範囲のeps
を使います。
![]() | 最小化オプションの設定 | 実際の問題 | ![]() |