fminunc
を使用した制約なし最小化
この例では、fminunc
を使用して次の非線形最小化問題を解く方法を説明します。
この 2 次元問題を解くには、 を返す関数を記述します。次に、初期点 x0 = [-1,1]
から開始する制約なし最小化ルーチン fminunc
を呼び出します。
補助関数 objfun
(この例の終わりに掲載) が、 を計算します。
の最小値を求めるには、初期点を設定して 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