Main Content

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)

Figure Optimization Plot Function contains an axes object. The axes object with title Current Function Value: -1, xlabel Iteration, ylabel Function value contains an object of type scatter.

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 などによって返されるオプション構造体

データ型: 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]を参照してください。

代替機能

アプリ

[最適化] ライブ エディター タスクは、fminbnd のビジュアル インターフェイスを提供します。

参照

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