| 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を使います。
| 最小化オプションの設定 | 実際の問題 | ![]() |