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

fminbnd

固定区間上で 1 変数からなる関数の最小値を見つける

説明

fminbnd は、以下で指定される問題の最小値を求める 1 次元最小化関数です。

minxf(x) such that x1<x<x2.

x、x1、x2 は有限スカラーであり、f(x) はスカラーを返す関数です。

x = fminbnd(fun,x1,x2) は、区間 x1 < x < x2fun に記述されたスカラー値関数の局所的最小点 x を返します。

x = fminbnd(fun,x1,x2,options) は、options で指定された最適化オプションを使用して最小化します。これらのオプションを設定するには、optimset を使用します。

x = fminbnd(problem) は、problem の最小値を求めます。problem は構造体です。

[x,fval] = fminbnd(___) は、任意の入力引数について、解 x において fun で計算された目的関数の値を返します。

[x,fval,exitflag] = fminbnd(___) は、終了条件を記述する値 exitflag も返します。

[x,fval,exitflag,output] = fminbnd(___) は、最適化の情報を含む構造体 output も返します。

すべて折りたたむ

関数 sin(x) が範囲 0<x<2π で最小値を取る点を求めます。

fun = @sin;
x1 = 0;
x2 = 2*pi;
x = fminbnd(fun,x1,x2)
x = 4.7124

精度を表示すると、これは正しい値 x=3π/2 と同じです。

3*pi/2
ans = 4.7124

個別の関数ファイルで指定されている関数を最小化します。関数は点 x を受け入れ、x における目的関数の値を表す実数スカラーを返します。

次の関数をファイルとして記述し、そのファイルを scalarobjective.m として MATLAB® パス上に保存します。

function f = scalarobjective(x)
f = 0;
for k = -10:10
    f = f + (k+1)^2*cos(k*x)*exp(-k^2/2);
end

区間 1 <= x <= 3 で scalarobjective が最小になる x を求めます。

x = fminbnd(@scalarobjective,1,3)
x =

    2.0061

追加パラメーターがある場合に関数を最小化します。関数 sin(x-a) の最小値は、パラメーター a の値に依存します。パラメーター a の値を含む、x の無名関数を作成します。区間 0<x<2π でこの関数を最小化します。

a = 9/7;
fun = @(x)sin(x-a);
x = fminbnd(fun,1,2*pi)
x = 5.9981

この解は正しく、理論値は次のとおりです。

3*pi/2 + 9/7
ans = 5.9981

追加パラメーターを含める方法の詳細については、関数のパラメーター化を参照してください。

0<x<2πfminbnd が関数 sin(x) を最小化するステップを監視します。

fun = @sin;
x1 = 0;
x2 = 2*pi;
options = optimset('Display','iter');
x = fminbnd(fun,x1,x2,options)
 
 Func-count     x          f(x)         Procedure
    1        2.39996      0.67549        initial
    2        3.88322     -0.67549        golden
    3        4.79993    -0.996171        golden
    4        5.08984    -0.929607        parabolic
    5        4.70582    -0.999978        parabolic
    6         4.7118           -1        parabolic
    7        4.71239           -1        parabolic
    8        4.71236           -1        parabolic
    9        4.71242           -1        parabolic
 
Optimization terminated:
 the current x satisfies the termination criteria using OPTIONS.TolX of 1.000000e-04 
x = 4.7124

0<x<2πsin(x) が最小になる位置とその最小値を求めます。

fun = @sin;
[x,fval] = fminbnd(fun,1,2*pi)
x = 4.7124
fval = -1.0000

すべての出力を要求して、fminbnd 解法プロセスに関するすべての情報を返します。また、プロット関数を使用して解法プロセスを監視します。

fun = @sin;
x1 = 0;
x2 = 2*pi;
options = optimset('PlotFcns',@optimplotfval);
[x,fval,exitflag,output] = fminbnd(fun,x1,x2,options)

x = 4.7124
fval = -1.0000
exitflag = 1
output = struct with fields:
    iterations: 8
     funcCount: 9
     algorithm: 'golden section search, parabolic interpolation'
       message: 'Optimization terminated:...'

入力引数

すべて折りたたむ

最小化する関数。関数ハンドルまたは関数名として指定します。fun は、実数スカラー x を受け入れ、実数スカラー f (x で評価される目的関数) を返す関数です。

fun をファイルの関数ハンドルとして指定します。

x = fminbnd(@myfun,x1,x2)

ここで myfun は次のような MATLAB® 関数です。

function f = myfun(x)
f = ...            % Compute function value at x

fun は、無名関数の関数ハンドルとして指定することもできます。

x = fminbnd(@(x)norm(x)^2,x1,x2);

例: fun = @(x)-x*exp(-3*x)

データ型: char | function_handle | string

下限。有限実数スカラーとして指定します。

例: x1 = -3

データ型: double

上限。有限実数スカラーとして指定します。

例: x2 = 5

データ型: double

最適化オプション。optimset などによって返される構造体として指定します。オプション構造体のこれらのフィールドの値を設定または変更するために、optimset を使用できます。詳細については、オプションの設定を参照してください。

Display

表示レベル (反復表示を参照)。

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

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

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

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

FunValCheck

目的関数値が正しいかどうかチェックします。既定の 'off' の場合、fminbnd は、目的関数が値 complex または NaN を返したときに続行できます。'on' の設定の場合、目的関数が値 complex または NaN を返したときにエラーをスローします。

MaxFunEvals

可能な関数評価の最大回数 (正の整数)。既定値は 500 です。許容誤差と停止条件を参照してください。

MaxIter

可能な反復の最大数 (正の整数)。既定値は 500 です。許容誤差と停止条件を参照してください。

OutputFcn

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

PlotFcns

アルゴリズムが実行中のさまざまな進行状況の測定値をプロットします。事前定義されたプロットから選択するか、独自のコードを記述してください。関数ハンドルか、関数ハンドルの cell 配列を渡します。既定の設定はなし ([]) です。

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

  • @optimplotfunccount は関数計算をプロットします。

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

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

TolX

x に関する許容誤差 (正のスカラー)。既定値は 1e-4 です。許容誤差と停止条件を参照してください。

例: options = optimset('Display','iter')

データ型: struct

問題の構造体。次のフィールドをもつ構造体として指定します。

フィールド名要素

objective

目的関数

x1

左の端点

x2

右の端点

solver

'fminbnd'

options

optimset などによって返されるオプション構造体

problem 構造体を取得する最も簡単な方法は、最適化アプリから問題をエクスポートすることです。

データ型: struct

出力引数

すべて折りたたむ

解。実数スカラーとして返されます。一般的に、exitflag が正の場合、x は問題の局所解です。

解における目的関数値。実数として返されます。一般的に、fval = fun(x) です。

fminbnd の停止理由。整数として返されます。

1

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

0

反復回数が options.MaxIter を超過したか、関数評価の回数が options.MaxFunEvals を超過しました。

-1

出力関数またはプロット関数によって停止しました。

-2

範囲に整合性がありません。つまり、x1 > x2 です。

最適化プロセスに関する情報。次のフィールドをもつ構造体として返されます。

iterations

実行した反復回数

funcCount

関数評価の回数

algorithm

'golden section search, parabolic interpolation'

message

終了メッセージ

制限

  • 最小化する関数は、連続でなければなりません。

  • fminbnd は局所解のみを返す場合があります。

  • 関数 fminbnd は、解が区間の境界上にあるときに遅い収束を示すことがあります。

アルゴリズム

fminbnd は関数ファイルです。そのアルゴリズムは黄金分割探索と放物線内挿に基づいています。左の端点 x1 が右の端点 x2 と極めて近接している場合を除き、fminbnd はこれらの端点で fun を評価しません。したがって、区間 x1 < x < x2 における x に対して fun を定義するだけですみます。

最小値が実際に x1 または x2 で発生する場合、fminbnd は区間 (x1,x2) の内側にあり最小点に近い点 x を返します。この場合、最小点から x までの距離は 2*(TolX + 3*abs(x)*sqrt(eps)) 以下です。アルゴリズムの詳細については、[1]または[2]を参照してください。

参照

[1] Forsythe, G. E., M. A. Malcolm, and C. B. Moler. Computer Methods for Mathematical Computations. Englewood Cliffs, NJ: Prentice Hall, 1976.

[2] Brent, Richard. P. Algorithms for Minimization without Derivatives. Englewood Cliffs, NJ: Prentice-Hall, 1973.

拡張機能

R2006a より前に導入