ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

スカラー関数の根

1 変数の非線形方程式を解く

関数 fzero は、1 変数の方程式の根を探索します。この関数は、1 要素の初期点または初期区間を設定する 2 要素ベクトルのいずれかで呼び出すことができます。関数 fzero に初期値 x0 を指定すると、関数 fzero はこの点の周辺で符号の変わる区間を最初に探索します。区間が見つかると、関数 fzero から関数値の符号が変わる場所の近傍の値が返されます。この区間が見つからない場合、関数 fzeroNaN を返します。また関数値の符号が変化する 2 点が既にわかっている場合は、2 要素ベクトルを使ってこの初期区間を指定できます。関数 fzero はこの区間を狭く絞り込み、符号の変化する近傍の値を返します。

次の節では、初期区間と初期点を使って関数のゼロ点を見つける方法を説明する 2 つの例を示します。例では、MATLAB® に提供されている関数 humps.m を使用します。次の図は humps のグラフを示しています。

x = -1:.01:2;
y = humps(x);
plot(x,y)
xlabel('x');
ylabel('humps(x)')
grid on

fzero のオプションを設定

オプションを設定することで、fzero の一部を制御することができます。optimset を使用してオプションを設定します。オプションは次のとおりです。

初期区間の使用

humps のグラフは関数の値が x = -1 で負となり、x = 1 で正となることを示します。これは、これら 2 点で humps を計算すると確認できます。

humps(1)
ans = 16
humps(-1)
ans = -5.1378

したがって、関数 fzero に対する初期区間として [-1 1] が使用できます。

fzero に使用される反復のアルゴリズムは、[-1 1] 内の部分区間を徐々に小さくして結果を求めるというものです。各部分区間で humps の値は、両端点で符号が異なります。部分区間の両端が近づくということは、その両端点が humps のゼロ点に収束しつつあるということを意味します。

各反復で fzero の進行状況を表示するには、関数 optimset を使用して、iterDisplay にオプションを設定します。

options = optimset('Display','iter');

そして、次のように関数 fzero を呼び出します。

a = fzero(@humps,[-1 1],options)
 
 Func-count    x          f(x)             Procedure
    2              -1      -5.13779        initial
    3       -0.513876      -4.02235        interpolation
    4       -0.513876      -4.02235        bisection
    5       -0.473635      -3.83767        interpolation
    6       -0.115287      0.414441        bisection
    7       -0.115287      0.414441        interpolation
    8       -0.132562    -0.0226907        interpolation
    9       -0.131666    -0.0011492        interpolation
   10       -0.131618   1.88371e-07        interpolation
   11       -0.131618   -2.7935e-11        interpolation
   12       -0.131618   8.88178e-16        interpolation
   13       -0.131618   8.88178e-16        interpolation
 
Zero found in the interval [-1, 1]
a = -0.1316

各値 x は、それまでの最良の端点を表します。Procedure は、アルゴリズムの各ステップが 2 分法と内挿法のどちらを使用しているかを示しています。

a の関数値が 0 に近いことは、次のように入力することで確認することができます。

humps(a)
ans = 8.8818e-16

初期点の利用

humps の関数値の符号の異なる 2 点が未知であると仮定します。この場合、関数 fzero の初期点としてスカラー x0 を選択することができます。関数 fzero は、まず初期点周辺で両端での humps 関数の値の符号が異なる区間を探します。関数 fzero がその区間を検出すると、前の節で説明したアルゴリズムを使用して計算します。この区間が見つからない場合、関数 fzeroNaN を返します。

たとえば、開始点を -0.2Display オプションを Iter に設定して、次のように関数 fzero を実行します。

options = optimset('Display','iter');
a = fzero(@humps,-0.2,options)
 
Search for an interval around -0.2 containing a sign change:
 Func-count    a          f(a)             b          f(b)        Procedure
    1            -0.2      -1.35385          -0.2      -1.35385   initial interval
    3       -0.194343      -1.26077     -0.205657      -1.44411   search
    5          -0.192      -1.22137        -0.208       -1.4807   search
    7       -0.188686      -1.16477     -0.211314      -1.53167   search
    9          -0.184      -1.08293        -0.216      -1.60224   search
   11       -0.177373     -0.963455     -0.222627      -1.69911   search
   13          -0.168     -0.786636        -0.232      -1.83055   search
   15       -0.154745      -0.51962     -0.245255      -2.00602   search
   17          -0.136     -0.104165        -0.264      -2.23521   search
   18        -0.10949      0.572246        -0.264      -2.23521   search
 
Search for a zero in the interval [-0.10949, -0.264]:
 Func-count    x          f(x)             Procedure
   18        -0.10949      0.572246        initial
   19       -0.140984     -0.219277        interpolation
   20       -0.132259    -0.0154224        interpolation
   21       -0.131617   3.40729e-05        interpolation
   22       -0.131618  -6.79505e-08        interpolation
   23       -0.131618  -2.98428e-13        interpolation
   24       -0.131618   8.88178e-16        interpolation
   25       -0.131618   8.88178e-16        interpolation
 
Zero found in the interval [-0.10949, -0.264]
a = -0.1316

各反復での部分区間の端点は、見出し ab の下に表示されています。端点での関数 humps の値は、それぞれ f(a)f(b) の下に表示されています。

メモ

端点 ab は、特定の順序で表示されていません。a>b という場合もあれば、a<b という場合もあります。

最初の 9 ステップにおいて、humps の符号は、各時点の部分区間の両端で負です。これは出力にリストされています。ステップ 10 で、humps の値の符号は端点 -0.10949 では正ですが、端点 -0.264 では負です。この先、アルゴリズムは -0.1316 に到達するまで、前の節で説明したように区間 [-0.10949 -0.264] を狭めていきます。

関連するトピック