Main Content

fminunc

制約なし多変数関数の最小値を求める

説明

非線形計画法ソルバーです。

以下で指定された問題の最小値を見つけます。

minxf(x)

ここで、f(x) はスカラーを返す関数です。

x はベクトルまたは行列です。行列引数を参照してください。

x = fminunc(fun,x0) は、点 x0 を開始点として、fun に記述されている関数の局所的最小値 x を求めようとします。点 x0 は、スカラー、ベクトル、または行列です。

メモ

追加パラメーターの受け渡し は、必要に応じて他のパラメーターを目的関数と非線形制約関数に渡す方法を説明します。

fminunc は、制約なしの非線形問題に使用します。問題に制約がある場合、一般的に fmincon を使用します。詳細については、最適化の意思決定表を参照してください。

x = fminunc(fun,x0,options) は、options で指定された最適化オプションを使って fun を最小化します。optimoptions を使用してこれらのオプションを設定してください。

x = fminunc(problem) は、problem で説明されている構造体 problem の最小値を求めます。

[x,fval] = fminunc(___) は、どの構文でも、解 x での目的関数 fun の値を返します。

[x,fval,exitflag,output] = fminunc(___) は上記に加え、fminunc の終了条件を記述する値 exitflag および最適化プロセスに関する情報を含む構造体 output を返します。

[x,fval,exitflag,output,grad,hessian] = fminunc(___) は、さらに次のものを返します。

  • grad — 解 x での fun の勾配。

  • hessian — 解 x での fun のヘッシアン。詳細については、fminunc ヘッシアンを参照してください。

すべて折りたたむ

関数 f(x)=3x12+2x1x2+x22-4x1+5x2 を最小化します。

これを行うには、目的関数を計算する無名関数 fun を記述します。

fun = @(x)3*x(1)^2 + 2*x(1)*x(2) + x(2)^2 - 4*x(1) + 5*x(2);

fminunc を呼び出し、[1,1] に近い fun の最小値を求めます。

x0 = [1,1];
[x,fval] = fminunc(fun,x0)
Local minimum found.

Optimization completed because the size of the gradient is less than
the value of the optimality tolerance.
x = 1×2

    2.2500   -4.7500

fval = 
-16.3750

fminunc は、導関数を与えると、速度および信頼性が向上する場合があります。

勾配と関数値を返す目的関数を記述します。勾配とヘッシアンを含める で説明するように、条件付きの形式を使用します。この目的関数は Rosenbrock 関数になります。

f(x)=100(x2-x12)2+(1-x1)2,

ここで勾配は

f(x)=[-400(x2-x12)x1-2(1-x1)200(x2-x12)].

勾配のある目的関数のコードは、この例の終わりに掲載しています。

目的関数の勾配を使用するオプションを作成します。また、アルゴリズムを 'trust-region' に設定します。

options = optimoptions('fminunc','Algorithm','trust-region','SpecifyObjectiveGradient',true);

初期点を [-1,2] に設定します。その後、fminunc を呼び出します。

x0 = [-1,2];
fun = @rosenbrockwithgrad;
x = fminunc(fun,x0,options)
Local minimum found.

Optimization completed because the size of the gradient is less than
the value of the optimality tolerance.
x = 1×2

    1.0000    1.0000

次のコードは、関数 rosenbrockwithgrad を作成します。この関数には、2 番目の出力として勾配が含まれます。

function [f,g] = rosenbrockwithgrad(x)
% Calculate objective f
f = 100*(x(2) - x(1)^2)^2 + (1-x(1))^2;

if nargout > 1 % gradient required
    g = [-400*(x(2)-x(1)^2)*x(1) - 2*(1-x(1));
        200*(x(2)-x(1)^2)];
end
end

個別の引数の代わりに問題構造体を使用して勾配の指定 と同じ問題を解きます。

勾配と関数値を返す目的関数を記述します。勾配とヘッシアンを含める で説明するように、条件付きの形式を使用します。この目的関数は Rosenbrock 関数になります。

f(x)=100(x2-x12)2+(1-x1)2,

ここで勾配は

f(x)=[-400(x2-x12)x1-2(1-x1)200(x2-x12)].

勾配のある目的関数のコードは、この例の終わりに掲載しています。

目的関数の勾配を使用するオプションを作成します。また、アルゴリズムを 'trust-region' に設定します。

options = optimoptions('fminunc','Algorithm','trust-region','SpecifyObjectiveGradient',true);

初期点 x0 = [-1,2] を含む問題構造体を作成します。この構造体に必須のフィールドについては、problemを参照してください。

problem.options = options;
problem.x0 = [-1,2];
problem.objective = @rosenbrockwithgrad;
problem.solver = 'fminunc';

問題を解きます。

x = fminunc(problem)
Local minimum found.

Optimization completed because the size of the gradient is less than
the value of the optimality tolerance.
x = 1×2

    1.0000    1.0000

次のコードは、関数 rosenbrockwithgrad を作成します。この関数には、2 番目の出力として勾配が含まれます。

function [f,g] = rosenbrockwithgrad(x)
% Calculate objective f
f = 100*(x(2) - x(1)^2)^2 + (1-x(1))^2;

if nargout > 1 % gradient required
    g = [-400*(x(2)-x(1)^2)*x(1)-2*(1-x(1));
        200*(x(2)-x(1)^2)];
end
end

非線形関数の最小値の位置と、その最小値での関数値の両方を求めます。目的関数は次のとおりです。

f(x)=x(1)e-x22+x22/20.

fun = @(x)x(1)*exp(-(x(1)^2 + x(2)^2)) + (x(1)^2 + x(2)^2)/20;

x0 = [1,2] を開始点とする最小化関数の位置および目的関数値を求めます。

x0 = [1,2];
[x,fval] = fminunc(fun,x0)
Local minimum found.

Optimization completed because the size of the gradient is less than
the value of the optimality tolerance.
x = 1×2

   -0.6691    0.0000

fval = 
-0.4052

fminunc のオプションおよび出力を選択して、解法プロセスを検証します。

反復表示を取得して 'quasi-newton' アルゴリズムを使用するようにオプションを設定します。

options = optimoptions(@fminunc,'Display','iter','Algorithm','quasi-newton');

目的関数は次のとおりです。

f(x)=x(1)e-x22+x22/20.

fun = @(x)x(1)*exp(-(x(1)^2 + x(2)^2)) + (x(1)^2 + x(2)^2)/20;

x0 = [1,2] から最小化を開始して、解の質と解法プロセスを検証できる出力を取得します。

x0 = [1,2];
[x,fval,exitflag,output] = fminunc(fun,x0,options)
                                                        First-order 
 Iteration  Func-count       f(x)        Step-size       optimality
     0           3         0.256738                         0.173
     1           6         0.222149              1          0.131  
     2           9          0.15717              1          0.158  
     3          18        -0.227902       0.438133          0.386  
     4          21        -0.299271              1           0.46  
     5          30        -0.404028       0.102071         0.0458  
     6          33        -0.404868              1         0.0296  
     7          36        -0.405236              1        0.00119  
     8          39        -0.405237              1       0.000252  
     9          42        -0.405237              1       7.97e-07  

Local minimum found.

Optimization completed because the size of the gradient is less than
the value of the optimality tolerance.
x = 1×2

   -0.6691    0.0000

fval = 
-0.4052
exitflag = 
1
output = struct with fields:
       iterations: 9
        funcCount: 42
         stepsize: 2.9343e-04
     lssteplength: 1
    firstorderopt: 7.9721e-07
        algorithm: 'quasi-newton'
          message: 'Local minimum found....'

  • 終了フラグ 1 は、解が局所的最適解であることを示します。

  • output 構造体は、反復の回数、関数評価の回数、およびその他の情報を示します。

  • 反復表示は、反復および関数評価の回数も示します。

問題の変数の数が多い場合、HessianApproximation を既定値にすると fminunc が大量のメモリを使用して実行が遅くなる可能性があります。メモリの使用を抑えて実行を高速化するには、HessianApproximation="lbfgs" を指定します。

たとえば、既定のパラメーターを使用して、1e5 個の変数を持つ関数 multirosenbrock (下記を参照) を最小化しようとすると、fminunc でエラーが発生します。

N = 1e5;
x0 = -2*ones(N,1);
x0(2:2:N) = 2;
[x,fval] = fminunc(@multirosenbrock,x0)
Error using eye
Requested 100000x100000 (74.5GB) array exceeds maximum array size preference (63.9GB). This might cause MATLAB to become
unresponsive.

Error in optim.internal.fminunc.AbstractDenseHessianApproximation (line 21)
        this.Value = eye(nVars);

Error in optim.internal.fminunc.BFGSHessianApproximation (line 14)
        this = this@optim.internal.fminunc.AbstractDenseHessianApproximation(nVars);

Error in fminusub (line 73)
    HessApprox = optim.internal.fminunc.BFGSHessianApproximation(sizes.nVar);

Error in fminunc (line 488)
   [x,FVAL,GRAD,HESSIAN,EXITFLAG,OUTPUT] = fminusub(funfcn,x, ...

この問題を解くには、HessianApproximation オプションを "lbfgs" に設定します。解を迅速に得るには、指定された勾配を使用するオプションを設定します。

N = 1e5;
x0 = -2*ones(N,1);
x0(2:2:N) = 2;
options = optimoptions("fminunc",HessianApproximation="lbfgs",...
    SpecifyObjectiveGradient=true);
[x,fval] = fminunc(@multirosenbrock,x0,options);
Local minimum found.

Optimization completed because the size of the gradient is less than
the value of the optimality tolerance.

理論解は、すべての i について x(i) = 1 です。返された解の精度を確認します。

max(abs(x-1))
ans =

   1.3795e-04

このコードは関数 multirosenbrock を作成します。

function [f,g] = multirosenbrock(x)
% Get the problem size
n = length(x);  
if n == 0, error('Input vector, x, is empty.'); end
if mod(n,2) ~= 0
   error('Input vector, x ,must have an even number of components.');
end
% Evaluate the vector function
odds  = 1:2:n;
evens = 2:2:n;
F = zeros(n,1);
F(odds,1)  = 1-x(odds);
F(evens,1) = 10.*(x(evens)-x(odds).^2); 
f = sum(F.^2);
if nargout >= 2 % Calculate gradient
    g = zeros(n,1);
    g(evens) = 200*(x(evens)-x(odds).^2);
    g(odds) = -2*(1 - x(odds)) - 400*(x(evens)-x(odds).^2).*x(odds);
end
end

入力引数

すべて折りたたむ

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

fminunc は、x0 引数の形式で x を目的関数に渡します。たとえば、x0 が 5 行 3 列の配列の場合、fminunc は 5 行 3 列の配列として xfun に渡します。

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

x = fminunc(@myfun,x0)

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

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

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

x = fminunc(@(x)norm(x)^2,x0);

fun の勾配を計算することができ、"さらに" 次のように SpecifyObjectiveGradient オプションが true に設定されている場合、

options = optimoptions('fminunc','SpecifyObjectiveGradient',true)
fun は 2 番目の出力引数に勾配ベクトル g(x) を出力しなければなりません。

ヘッセ行列を計算することもでき、"さらに" HessianFcn オプションが options = optimoptions('fminunc','HessianFcn','objective') によって 'objective' に設定されており、"かつ" Algorithm オプションが 'trust-region' に設定されている場合、fun は、3 番目の出力引数に対称行列であるヘッセ値 H(x) を返さなければなりません。fun はスパース ヘッシアンを返すことができます。詳細については、fminunc の信頼領域法アルゴリズムまたは fmincon の信頼領域 Reflective 法アルゴリズムのヘッシアンを参照してください。

trust-region アルゴリズムではヘッセ乗算関数を指定できます。この関数はヘッシアンを直接計算せずに、ベクトルとヘッシアンの積を返します。これによってメモリを節約できます。詳細については、ヘッセ乗算関数を参照してください。

例: fun = @(x)sin(x(1))*cos(x(2))

データ型: char | function_handle | string

初期点。実数ベクトルまたは実数配列として指定されます。ソルバーは、x0 の要素数および x0 のサイズを使用して、fun が受け入れる変数の数およびサイズを決定します。

例: x0 = [1,2,3,4]

データ型: double

最適化オプション。optimoptions の出力、または optimset などによって返される構造体として指定されます。

いくつかのオプションはすべてのアルゴリズムに適用することができ、その他のオプションは特定のアルゴリズムに関連します。詳細については、最適化オプション リファレンスを参照してください。

一部のオプションは、optimoptions に表示されません。このようなオプションは、次の表ではイタリックで示されています。詳細については、最適化オプションの表示を参照してください。

すべてのアルゴリズム

Algorithm

fminunc アルゴリズムを選択します。選択肢は、'quasi-newton' (既定の設定) または 'trust-region' です。

'trust-region' アルゴリズムでは勾配を与えなければなりません (fun の説明を参照)。勾配を与えないと、fminunc では 'quasi-newton' アルゴリズムが使用されます。アルゴリズムの選択の詳細については、アルゴリズムの選択を参照してください。

CheckGradients

ユーザー設定の導関数 (目的関数の勾配) と有限差分による導関数とを比較します。選択肢は、false (既定の設定) または true です。

optimset の場合、名前は DerivativeCheck で、値は 'on' または 'off' です。詳細については、新旧のオプション名を参照してください。

CheckGradients オプションは将来のリリースで削除される予定です。導関数を確認するには、関数 checkGradients を使用します。

Diagnostics

最小化または計算する関数に関する情報を表示します。選択肢は、'off' (既定の設定) または 'on' です。

DiffMaxChange

有限差分勾配を計算する場合に変数内で生じる最大変化量です (正のスカラー)。既定値は Inf です。

DiffMinChange

有限差分勾配を計算する場合に変数内で生じる最小変化量です (正のスカラー)。既定値は 0 です。

Display

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

  • 'off' または 'none' — 出力を表示しない。

  • 'iter' — 各反復の出力を表示し、既定の終了メッセージを与える。

  • 'iter-detailed' — 各反復の出力を表示し、技術的な終了メッセージを与える。

  • 'notify' — 関数が収束しない場合にのみ出力を表示し、既定の終了メッセージを与える。

  • 'notify-detailed' — 関数が収束しない場合にのみ出力を表示し、技術的な終了メッセージを与える。

  • 'final' (既定の設定) — 最終出力のみを表示し、既定の終了メッセージを与える。

  • 'final-detailed' — 最終出力のみを表示し、技術的な終了メッセージを与える。

FiniteDifferenceStepSize

有限差分のスカラーまたはベクトルのステップ サイズ ファクター。FiniteDifferenceStepSize をベクトル v に設定すると、前方有限差分 delta

delta = v.*sign′(x).*max(abs(x),TypicalX);

ここで、sign′(0) = 1 を除き sign′(x) = sign(x) です。中心有限差分法では

delta = v.*max(abs(x),TypicalX);

スカラー FiniteDifferenceStepSize はベクトルに拡張します。既定値は、前進有限差分法では sqrt(eps)、中心有限差分法では eps^(1/3) です。

信頼領域法アルゴリズムでは、CheckGradientstrue に設定されている場合にのみ FiniteDifferenceStepSize が使用されます。

optimset の場合、名前は FinDiffRelStep です。詳細については、新旧のオプション名を参照してください。

FiniteDifferenceType

勾配推定に使用される有限差分は 'forward' (既定の設定) または 'central' (中心) のいずれかです。'central' では 2 倍の関数評価が必要になりますが、正確性が増します。信頼領域法アルゴリズムでは、CheckGradientstrue に設定されている場合にのみ FiniteDifferenceType が使用されます。

optimset の場合、名前は FinDiffType です。詳細については、新旧のオプション名を参照してください。

FunValCheck

目的関数値が正しいかどうかチェックします。既定の設定 'off' ではチェックが実行されません。'on' に設定すると、目的関数が complexInf、または NaN の値を返すとエラーが表示されます。

MaxFunctionEvaluations

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

optimset の場合、名前は MaxFunEvals です。詳細については、新旧のオプション名を参照してください。

MaxIterations

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

optimset の場合、名前は MaxIter です。詳細については、新旧のオプション名を参照してください。

OptimalityTolerance

1 次の最適性に関する終了許容誤差 (非負のスカラー)。既定値は 1e-6 です。詳細については、1 次の最適性の尺度を参照してください。

optimset の場合、名前は TolFun です。詳細については、新旧のオプション名を参照してください。

OutputFcn

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

PlotFcn

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

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

  • 'optimplotfunccount' は関数カウントをプロットします。

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

  • 'optimplotstepsize' はステップ サイズをプロットします。

  • 'optimplotfirstorderopt' は 1 次の最適性尺度をプロットします。

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

optimset の場合、名前は PlotFcns です。詳細については、新旧のオプション名を参照してください。

SpecifyObjectiveGradient

ユーザーが定義する目的関数の勾配。fun の勾配の定義方法については、fun の説明を参照してください。true に設定すると、fminunc は目的関数のユーザー定義の勾配を使用します。既定の false の場合、fminunc は有限差分を使用して勾配を推定します。信頼領域法アルゴリズムを使用するには、勾配を与え、SpecifyObjectiveGradienttrue に設定しなければなりません。準ニュートン アルゴリズムの場合、このオプションは必要ありません。

optimset の場合、名前は GradObj で、値は 'on' または 'off' です。詳細については、新旧のオプション名を参照してください。

StepTolerance

x に関する終了許容誤差 (非負のスカラー)。既定値は 1e-6 です。詳細については、許容誤差と停止条件を参照してください。

optimset の場合、名前は TolX です。詳細については、新旧のオプション名を参照してください。

TypicalX

典型的な x の値です。TypicalX の要素数は、開始点 x0 の要素数と等しくなります。既定値は ones(numberofvariables,1) です。fminunc では TypicalX を使用して勾配推定の有限差分をスケーリングします。

trust-region アルゴリズムは CheckGradients オプションに対してのみ TypicalX を使用します。

trust-region アルゴリズム
FunctionTolerance

関数値に関する終了許容誤差 (非負のスカラー)。既定値は 1e-6 です。詳細については、許容誤差と停止条件を参照してください。

optimset の場合、名前は TolFun です。詳細については、新旧のオプション名を参照してください。

HessianFcn

[] (既定の設定) に設定されている場合、fminunc は有限差分を使用してヘッシアンを近似します。

'objective' に設定されている場合、fminunc は目的関数のユーザー定義のヘッシアンを使用します。ヘッシアンは目的関数の 3 番目の出力です (fun を参照)。

optimset の場合、名前は HessFcn です。詳細については、新旧のオプション名を参照してください。

HessianMultiplyFcn

ヘッセ乗算関数。関数ハンドルとして指定されます。大規模構造問題に対して、この関数は実際に H を作らずにヘッセ行列の乗数 H*Y を計算します。この関数は次の形式を取ります。

W = hmfun(Hinfo,Y)

ここで Hinfo は、H*Y を計算するために使われる行列を含んでいます。

最初の引数は目的関数 fun で返される 3 番目の引数と同じにします。次に例を示します。

[f,g,Hinfo] = fun(x)

Y は問題の次元と同じ行数をもつ行列です。H が明示的に形成されていない場合でも行列 W = H*Y を満たします。fminunc は前提条件子を計算するために Hinfo を使用します。hmfun が必要とする追加のパラメーターを与える方法については、追加パラメーターの受け渡し を参照してください。

メモ:

HessianMultiplyFcn オプションを使用するには、HessianFcn[] に設定しなければなりません。

例については、密に構造化されたヘッシアンと線形等式を使用した最小化を参照してください。

optimset の場合、名前は HessMult です。詳細については、新旧のオプション名を参照してください。

HessPattern

有限差分に対するヘッシアンのスパース パターン。∂2fun/∂x(i)x(j) ≠ 0 をもつことができる場合は、HessPattern(i,j) = 1 を設定します。それ以外の場合は、HessPattern(i,j) = 0 を設定します。

fun でヘッセ行列 H を計算するのが不便な場合は HessPattern を使用します。しかし fun の勾配の i 番目の成分が x(j) によって異なる場合は、見ただけで判断できます。H"スパース構造"HessPattern の値として提供できる場合は、fminunc は (勾配の) スパース有限差分を使って H を近似することができます。つまり、非ゼロの位置を指定します。

構造が不明であれば、HessPattern を設定しないでください。既定では、HessPattern は 1 からなる密行列のように動作します。その後 fminunc は、非スパース状態の有限差分近似を反復ごとに計算します。大規模な問題では、この計算には多大なリソースが必要となる場合があり、通常はスパース構造を決定するのが妥当です。

MaxPCGIter

前処理付き共役勾配法 (PCG) の反復の最大回数 (正のスカラー)。既定値は max(1,floor(numberOfVariables/2)) です。詳細については、信頼領域法アルゴリズムを参照してください。

PrecondBandWidth

PCG に対する前提条件子の帯域幅の上限 (非負の整数)。既定の設定では、fminunc は対角型をした前提条件を使用します (帯域幅の上限 0)。一部の問題では、帯域幅を上げることで、PCG 法の反復回数を減らします。PrecondBandWidthInf に設定すると、共役勾配 (CG) ではなく、直接因子分解 (コレスキー因子) が使用されます。直接因子分解では CG より計算量が増加しますが、解を求めるためのステップの質が向上します。

SubproblemAlgorithm

反復ステップの計算方法を定義します。既定の設定である 'cg' のステップは 'factorization' より高速ですが、精度の点で劣ります。詳細については、fminunc trust-region アルゴリズムを参照してください。

TolPCG

PCG 反復に関する終了許容誤差 (正のスカラー)。既定値は 0.1 です。

quasi-newton アルゴリズム
HessianApproximation

どのように fminunc がヘッシアンを計算するかを指定します。選択肢は以下になります。

  • "bfgs" (既定の設定)

  • "lbfgs"

  • {"lbfgs",Positive Integer}

"lbfgs" を選択することは {"lbfgs",10} と同じです。つまり、既定の "lbfgs" メモリ値は 10 です。多くの変数を含む問題では、"lbfgs" を使用します。詳細については、多くの変数を使用した非線形問題の求解を参照してください。

optimset の場合、オプションの名前は "HessUpdate" で、値は "bfgs""lbfgs"{"lbfgs",Positive Integer}"dfp"、および "steepdesc" です。詳細については、新旧のオプション名を参照してください。

メモ

通常、"dfp" および "steepdesc" の値は正常に動作しません。これらの値は教育目的で使用できます。バナナ関数の最小化を参照してください。

ObjectiveLimit

スカラーの許容誤差 (停止条件) です。反復の目的関数値が ObjectiveLimit 以下になった場合、問題が非有界であると推定されるため、その反復は中止されます。既定値は -1e20 です。

UseParallel

true の場合、fminunc は並列で勾配を推定します。既定の false に設定すると、無効になります。trust-region は目的関数に勾配を必要とするので、UseParallel は適用されません。詳細については、並列計算を参照してください。

例: options = optimoptions('fminunc','SpecifyObjectiveGradient',true)

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

フィールド名エントリ

objective

目的関数

x0

x の初期点

solver

'fminunc'

options

optimoptions で作成されたオプション

データ型: struct

出力引数

すべて折りたたむ

実数ベクトルまたは実数配列として返される解です。x のサイズは、x0 のサイズと同じです。通常、exitflag が正の場合、x は問題に対する局所的な解になります。解の質の詳細については、ソルバーが成功する場合を参照してください。

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

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

1

勾配の大きさは、OptimalityTolerance の許容誤差より小さくなります。

2

x の変位が StepTolerance 許容誤差より小さくなったことを示します。

3

目的関数値の変化が FunctionTolerance 許容誤差より小さくなったことを示します。

5

目的関数値の予測減少が FunctionTolerance 許容誤差より小さかったことを示します。

0

反復回数が MaxIterations を超過、または関数評価の回数が MaxFunctionEvaluations を超過しています。

-1

アルゴリズムが出力関数により停止したことを示します。

-3

現在の反復の目的関数が ObjectiveLimit を下回ることを示します。

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

iterations

実行した反復回数

funcCount

関数評価の回数

firstorderopt

1 次の最適性の尺度

algorithm

使用される最適化アルゴリズム

cgiterations

PCG 法の合計反復回数 ('trust-region' アルゴリズムのみ)

lssteplength

探索方向の直線探索ステップ サイズ ('quasi-newton'アルゴリズムのみ)

stepsize

x の最終変位

message

終了メッセージ

解での勾配。実数ベクトルとして返されます。grad は、点 x(:) における fun の勾配を返します。

ヘッシアンの近似。実数行列として返されます。hessian の意味については、ヘッシアン出力 を参照してください。

HessianApproximation オプションが "lbfgs" または {"lbfgs" n} の場合、返される hessian[] です。

データ型: double

詳細

すべて折りたたむ

より詳細な終了メッセージ

次のいくつかの項目は、fminunc から表示される可能性がある、より詳細な終了メッセージをリストしたものです。より詳細な終了メッセージでは、詳細な情報のリンクがメッセージの最初の文として提供されます。

局所的最小値が見つかりました

1 次の最適性の尺度OptimalityTolerance 許容誤差より小さいため、局所的最小値と思われる点がソルバーで見つかりました。

作業の進め方については、ソルバーが成功する場合を参照してください。

初期点は局所的最小値です

1 次の最適性の尺度OptimalityTolerance 許容誤差より小さいため、初期点は局所的最小値と思われます。

作業の進め方については、最終点が初期点と等しいを参照してください。

局所的最小値の可能性

ソルバーが局所的最小値に到達した可能性がありますが、1 次の最適性の尺度OptimalityTolerance 許容誤差より小さくないため、確実ではありません。

作業の進め方については、局所的最小値の可能性を参照してください。

ソルバーが途中で停止しました

目的関数が要求された "許容誤差" に最小化される前に、反復または関数評価の回数が上限に達したため、ソルバーは停止しました。

作業の進め方については、過剰な反復または関数評価を参照してください。

問題が非有界です

ソルバーが達した実行可能点は、目的関数値が ObjectiveLimit "許容誤差" 以下になっています。問題が非有界か、適切にスケール化されていないか、または ObjectiveLimit オプションが高すぎます。

作業の進め方については、非有界な問題を参照してください。

競合

'trust-region' アルゴリズムでは、目的関数に勾配を与え、SpecifyObjectiveGradient オプションを true に設定する必要があります。

先に進むには、次のいずれかを行います。

  • Algorithm オプションを 'quasi-newton' に設定します。

  • 目的関数に勾配があり、SpecifyObjectiveGradient オプションが true に設定されていることを確認します。詳細については、勾配とヘッシアンを含めるを参照してください。

終了メッセージの定義

次のいくつかの項目は、fminunc の終了メッセージに含まれる用語の定義を示したものです。

許容誤差

許容誤差は、一般的に、それを超えた場合にソルバーの反復を停止するしきい値です。許容誤差の詳細については、許容誤差と停止条件を参照してください。

局所的最小値

関数の "局所的" 最小値は、近傍の点の中ではその関数値が最小であっても、離れた点よりも大きい可能性があります。

"大域的" 最小値は、その関数値が他のすべての実行可能点よりも小さい点です。

Local vs. global minimum

ソルバーは局所的最小値を探索しようとします。結果は大域的最小値となる可能性があります。詳細については、大域的最適解と局所的最適解を参照してください。

1 次の最適性の尺度

1 次の最適性の尺度は、勾配ベクトルの要素の最大絶対値 (勾配の無限大ノルムとも呼ばれる) です。これは最小化点ではゼロになります。

詳細については、1 次の最適性の尺度を参照してください。

勾配のサイズ

勾配のサイズは、勾配ベクトルの要素の最大絶対値 (無限大ノルムとも呼ばれる) です。これは最小化点ではゼロになります。

詳細については、1 次の最適性の尺度を参照してください。

OptimalityTolerance

OptimalityTolerance と呼ばれる許容誤差は 1 次の最適性の尺度に対応します。反復計算は、1 次の最適性の尺度が OptimalityTolerance 未満の場合に終了します。

制約なしの問題における 1 次の最適性の尺度は、勾配ベクトルの成分の最大絶対値 (勾配の無限大ノルムとも呼ばれる) です。これは最小化点ではゼロになります。

詳細については、1 次の最適性の尺度を参照してください。

FunctionTolerance

FunctionTolerance は、目的関数値の直近の変化のサイズに対する許容誤差です。

StepTolerance

StepTolerance は、最後のステップのサイズの許容誤差、つまり、目的関数が評価された位置での変化のサイズを表します。

現在のステップのノルム

現在のステップのノルムは、目的関数が評価された位置での変化のサイズです。

詳細については、許容誤差と停止条件を参照してください。

目的制限

ソルバーが達した実行可能点は、目的関数値が ObjectiveLimit "許容誤差" 以下になっています。問題が非有界か、適切にスケール化されていないか、または ObjectiveLimit オプションが高すぎます。

作業の進め方については、非有界な問題を参照してください。

直線探索区間

直線探索区間は、ソルバーが目的関数の最小化をしようとする探索方向に沿った線分です。この区間が小さすぎると、ソルバーは終了します。ソルバーは、制約なし非線形最適化アルゴリズムで説明されているさまざまなアルゴリズムを使用して、探索方向とこの区間のサイズを計算します。

出力関数またはプロット関数

出力関数 (またはプロット関数) は、ソルバーの反復ごとに 1 回評価されます。これは、ソルバーの進行の過程で多数の最適化量を報告できますが、ソルバーを停止する可能性もあります。

詳細については、Optimization Toolbox の出力関数またはプロット関数を参照してください。

MaxIterations

MaxIterations は、ソルバーが実行する反復回数に関する "許容誤差" です。ソルバーが MaxIterations 回の反復を実行すると、反復は終了します。

詳細については、反復と関数カウントまたは許容誤差と停止条件を参照してください。

MaxFunctionEvaluations

MaxFunctionEvaluations は、ソルバーが目的関数および/または制約関数を評価する点数に関する "許容誤差" です。ソルバーが MaxFunctionEvaluations 個の点で関数を評価すると、反復は終了します。

詳細については、反復と関数カウントまたは許容誤差と停止条件を参照してください。

探索方向

探索方向とは、ソルバーが改良点を探す方向を示す、現在の点からのベクトルです。Optimization Toolbox™ ソルバーは、制約なし非線形最適化アルゴリズムで説明されているように、さまざまなアルゴリズムを使用して探索方向を計算します。

アルゴリズム

すべて折りたたむ

準ニュートン アルゴリズム

既定では、quasi-newton アルゴリズムは 3 次直線探索手法で BFGS 準ニュートン法を使用します。この準ニュートン法はヘッセ行列の近似を更新するために、BFGS ([1],[5],[8][9]) を使用します。HessianApproximation オプションとして、メモリ消費の少ない BFGS アルゴリズム ("lbfgs") を指定することもできます。推奨はされませんが、オプションを 'dfp' に設定することで、逆ヘッセ行列を近似する DFP ([4][6]、および [7]) の公式を指定できます。オプションを 'steepdesc' に設定することで最急降下法を指定できますが、通常、この設定は効率的ではありません。詳細については、fminunc quasi-newton アルゴリズムを参照してください。

信頼領域法アルゴリズム

trust-region アルゴリズムでは、optimoptions を使用して、fun に勾配を指定し SpecifyObjectiveGradienttrue に設定する必要があります。このアルゴリズムは部分空間の信頼領域法であり、[2][3] で説明する interior-reflective ニュートン法に基づいています。各反復は、前処理付き共役勾配 (PCG) 法を使用する大型線形システムの近似解を伴います。fminunc trust-region アルゴリズム非線形最小化に対する信頼領域法、および前処理付き共役勾配法 を参照してください。

代替機能

アプリ

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

参照

[1] Broyden, C. G. “The Convergence of a Class of Double-Rank Minimization Algorithms.” Journal Inst. Math. Applic., Vol. 6, 1970, pp. 76–90.

[2] Coleman, T. F. and Y. Li. “An Interior, Trust Region Approach for Nonlinear Minimization Subject to Bounds.” SIAM Journal on Optimization, Vol. 6, 1996, pp. 418–445.

[3] Coleman, T. F. and Y. Li. “On the Convergence of Reflective Newton Methods for Large-Scale Nonlinear Minimization Subject to Bounds.” Mathematical Programming, Vol. 67, Number 2, 1994, pp. 189–224.

[4] Davidon, W. C. “Variable Metric Method for Minimization.” A.E.C. Research and Development Report, ANL-5990, 1959.

[5] Fletcher, R. “A New Approach to Variable Metric Algorithms.” Computer Journal, Vol. 13, 1970, pp. 317–322.

[6] Fletcher, R. “Practical Methods of Optimization.” Vol. 1, Unconstrained Optimization, John Wiley and Sons, 1980.

[7] Fletcher, R. and M. J. D. Powell. “A Rapidly Convergent Descent Method for Minimization.” Computer Journal, Vol. 6, 1963, pp. 163–168.

[8] Goldfarb, D. “A Family of Variable Metric Updates Derived by Variational Means.” Mathematics of Computing, Vol. 24, 1970, pp. 23–26.

[9] Shanno, D. F. “Conditioning of Quasi-Newton Methods for Function Minimization.” Mathematics of Computing, Vol. 24, 1970, pp. 647–656.

拡張機能

バージョン履歴

R2006a より前に導入

すべて展開する