解析のための解の調整
問題ベースのアプローチを使用する場合は、さまざまなオプションと方法を試してソルバーを調整し、より迅速に結果を生成することができます。
微分オプションの試行
通常、関数 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;
参考
fcn2optimexpr
| solve
| prob2struct