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 < x2 において、fun に記述されたスカラー値関数の局所的最小値 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 で目的関数の値を表す実数スカラーを返します。

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

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

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

fminbnd が、0<x<2π の関数 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

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

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' により、目的関数が complex または NaN の値を返す場合に fminbnd は継続できます。'on' に設定すると、目的関数が complex または NaN の値を返すとエラーがスローされます。

MaxFunEvals

可能な関数評価の最大回数 (正の整数)。既定値は 500 です。詳細については、許容誤差と停止条件反復と関数カウントを参照してください。

MaxIter

可能な反復の最大数 (正の整数)。既定値は 500 です。詳細については、許容誤差と停止条件反復と関数カウントを参照してください。

OutputFcn

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

PlotFcns

アルゴリズム実行時における、進行状態の各種測定値のプロット。定義済みのプロットから選択するか、自身で記述します。関数名、関数ハンドル、または関数名か関数ハンドルの cell 配列を渡します。既定の設定はなし ([]) です。

  • @optimplotx — 現在の点をプロット

  • @optimplotfunccount — 関数カウントをプロット

  • @optimplotfval — 関数値をプロット

カスタムのプロット関数は、出力関数と同じ構文を使用します。詳細については、Optimization Toolbox の出力関数出力関数とプロット関数の構文を参照してください。

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 は解が区間の境界上にあるとき、遅い収束を示す可能性があります。そのような場合、fmincon はより高速でより正確な解を与える場合が多くあります。

アルゴリズム

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

最小値が実際に x1 または x2 で発生する場合、最小値の点に近い、区間 (x1,x2) の内部の点 xfminbnd によって返されます。この場合、最小点から 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 より前に導入