Main Content

有理目的関数、問題ベース

最適化に対する問題ベースのアプローチでは、最適化変数を作成し、これらの変数で目的関数と制約を表現します。

有理関数は多項式の商です。目的関数が最適化変数の有理関数またはその他のサポートされている関数の場合は、目的関数の式を変数から直接作成できます。これに対して、目的関数がサポートされている関数でない場合は、目的関数を表す MATLAB® 関数を作成し、fcn2optimexpr を使用して関数を式に変換しなければなりません。詳細については、最適化変数および式でサポートされる演算非線形関数から最適化式への変換を参照してください。

たとえば、次の目的関数を記述します。

f=(x-y)24+(x+y)4x+y21+y2

2 つの最適化変数 x および y で記述します。

x = optimvar('x');
y = optimvar('y');
f = (x-y)^2/(4+(x+y)^4)*(x+y^2)/(1+y^2);

この目的関数の最小値を求めるには、f を目的関数として最適化問題を作成し、初期点を設定して solve を呼び出します。

prob = optimproblem('Objective',f);
x0.x = -1;
x0.y = 1;
[sol,fval,exitflag,output] = solve(prob,x0)
Solving problem using fminunc.

Local minimum found.

Optimization completed because the size of the gradient is less than
the value of the optimality tolerance.
sol = struct with fields:
    x: -2.1423
    y: 0.7937

fval = -1.0945
exitflag = 
    OptimalSolution

output = struct with fields:
             iterations: 9
              funcCount: 10
               stepsize: 1.7073e-06
           lssteplength: 1
          firstorderopt: 1.4999e-07
              algorithm: 'quasi-newton'
                message: 'Local minimum found....'
    objectivederivative: "reverse-AD"
                 solver: 'fminunc'

終了フラグは、報告された解が局所的最小値であることを示しています。出力構造体は、ソルバーが関数評価を 30 回行っただけで最小値に到達していることを示しています。

参考

関連するトピック