Main Content

fminunc を使用した制約なし最小化

この例では、fminunc を使用して次の非線形最小化問題を解く方法を説明します。

minxf(x)=ex1(4x12+2x22+4x1x2+2x2+1).

この 2 次元問題を解くには、f(x) を返す関数を記述します。次に、初期点 x0 = [-1,1] から開始する制約なし最小化ルーチン fminunc を呼び出します。

補助関数 objfun (この例の終わりに掲載) が、f(x) を計算します。

f(x) の最小値を求めるには、初期点を設定して fminunc を呼び出します。

x0 = [-1,1];
[x,fval,exitflag,output] = fminunc(@objfun,x0);
Local minimum found.

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

output 構造体の 1 次の最適性の尺度を含む結果を表示します。

disp(x)
    0.5000   -1.0000
disp(fval)
   3.6609e-15
disp(exitflag)
     1
disp(output.firstorderopt)
   1.2284e-07

exitflag 出力は、アルゴリズムが収束しているかどうかを示します。exitflag = 1 であれば、fminunc が局所的最小値を検出したという意味になります。

output 構造体には、最適化に関する詳細が与えられています。fminunc では、構造体に次が含まれます。

  • output.iterations。反復回数

  • output.funcCount。関数評価の回数

  • output.stepsize。最後のステップ サイズ

  • output.firstorderopt。1 次の最適性の尺度 (制約なしの場合、解での勾配の無限大ノルム)

  • output.algorithm。使用するアルゴリズム タイプ

  • output.message。アルゴリズムが停止した理由

補助関数

次のコードは、補助関数 objfun を作成します。

function f = objfun(x)
f = exp(x(1)) * (4*x(1)^2 + 2*x(2)^2 + 4*x(1)*x(2) + 2*x(2) + 1);
end

関連する例

詳細