Main Content

解析のための解の調整

問題ベースのアプローチを使用する場合は、さまざまなオプションと方法を試してソルバーを調整し、より迅速に結果を生成することができます。

微分オプションの試行

通常、関数 solve は最も効果的な自動微分法を使用します。しかし、別の方法を使用するか、または自動微分をまったく使用しないことで、問題をより速く実行できる場合があります。

より迅速に解を求めるには、solve のさまざまな自動微分オプションを試します。ObjectiveDerivative 名前と値の引数を既定以外の値に設定します。以下に例を示します。

[sol,fval] = solve(prob,x0,ObjectiveDerivative="auto-forward")

評価方法の試行

適用可能な場合は、fcn2optimexpr を使用せずに最適化式を直接評価してみます。次に、fcn2optimexpr を使用して式を評価し、結果を比較します。同様に、Analysis 引数を既定の設定 "on" にして fcn2optimexpr を使用し、さらに "off" にして使用してみます。既定の設定が最も効率的になりますが、既定以外の設定が問題に最適な場合があります。

fcn2optimexpr の式の分割

場合によっては、式を小さく分割し、その小さい式ごとに個別に fcn2optimexpr を呼び出すと、solve がより効果的に実行されます。このアプローチでは、fcn2optimexpr は各式のタイプを、含まれる式内で最も一般的なタイプとして解釈します。たとえば、2 次項と指数項が式に含まれる場合、fcn2optimexpr はこの式を一般的な非線形式としてラベル付けします。式を 2 次項のみの式と指数式とに分割した場合、fcn2optimexpr は最初の式を 2 次項、2 番目を一般的な非線形項として正しくラベル付けできます。

以下に例を示します。

expr1 = sum(x.^2 + y.^2,"all");
expr2 = sum(x.*exp(x).*(x.^2 + y.^2),"all");
express1 = fcn2optimexpr(expr1,x,y);
express2 = fcn2optimexpr(expr2,x);
prob.Objective = express1;
prob.Constraints.expconstr = express2 >= 1/10;

この例では、目的関数と制約関数に別々の式を設定することで、目的関数が純粋な二乗和であることをソルバーが認識できます。これに対し、次の定式化では、目的関数が二乗和であることをソルバーが認識できません。

expr1 = x.^2 + y.^2;
[express1,express2] = ...
    fcn2optimexpr([sum(expr1,"all),sum(x.*exp(x).*expr1,"all)],x,y);
prob.Objective = express1;
prob.Constraints.expconstr = express2 >= 1/10;

参考

| |

関連するトピック