問題ベースの最適化アルゴリズム
関数 solve
は、内部的に以下のソルバーを呼び出して最適化問題を解きます。問題に対する既定のソルバーおよび問題でサポートされているソルバーについては、関数 solvers
を参照してください。solve
を呼び出すときに、'solver'
の名前と値のペアの引数を使用することで、この既定をオーバーライドできます。
solve
がソルバーを呼び出せるためには、solve
か、他のいくつかの関連付けられている関数やオブジェクトが事前に問題をソルバー形式に変換しなければなりません。この変換には、たとえば、最適化変数式ではなく行列表現をもつ線形制約が必要になります。
最適化式を問題に含めると、アルゴリズムの最初のステップが発生します。OptimizationProblem
オブジェクトは、その式で使用される変数の内部リストを保持しています。変数ごとに、式の線形インデックスとサイズが 1 つずつあります。そのため、問題変数は暗黙的に行列形式となります。関数 prob2struct
は、問題形式からソルバー形式への変換を実行します。例については、問題の構造体への変換を参照してください。
非線形最適化問題では、solve
が "自動微分" を使用して、目的関数と非線形制約関数の勾配を計算します。これらの導関数は、目的関数と制約関数が最適化変数および式でサポートされる演算で構成される場合に適用されます。自動微分が適用されない場合は、ソルバーが有限差分を使用して導関数を推定します。自動微分の詳細については、自動微分の背景を参照してください。solve
で自動微分がどのように使用されるかは、ObjectiveDerivative
名前と値の引数で制御できます。
intlinprog
が MILP 問題を解くために使用するアルゴリズムについては、レガシ intlinprog アルゴリズムを参照してください。linprog
が線形計画問題を解くために使用するアルゴリズムについては、線形計画法のアルゴリズムを参照してください。二次計画問題を解くために quadprog
が使用するアルゴリズムについては、二次計画法のアルゴリズムを参照してください。線形または非線形の最小二乗ソルバー アルゴリズムについては、最小二乗 (モデル当てはめ) アルゴリズムを参照してください。非線形ソルバー アルゴリズムについては、制約なし非線形最適化アルゴリズムおよび制約付き非線形最適化アルゴリズムを参照してください。Global Optimization Toolbox ソルバーのアルゴリズムについては、Global Optimization Toolboxのドキュメンテーションを参照してください。
非線形方程式を解く場合、solve
は内部的に、各方程式を左辺と右辺の差として表します。その後 solve
は、方程式の成分の二乗和を最小化しようと試みます。非線形方程式系を解くアルゴリズムについては、方程式を解くためのアルゴリズムを参照してください。問題に範囲もある場合、solve
は lsqnonlin
を呼び出して、方程式の成分の二乗和を最小化します。詳細については、最小二乗 (モデル当てはめ) アルゴリズムを参照してください。
メモ
目的関数が二乗和である場合に solve
にそのように認識させるには、expr'*expr
などの形式ではなく norm(expr)^2
または sum(expr.^2)
と記述します。内部パーサーは、ノルムの二乗または明示的な二乗和として表された場合にのみ二乗和を認識します。詳細については、問題ベースの最小二乗法の目的関数の記述を参照してください。例については、非負の線形最小二乗法、問題ベースを参照してください。
参考
linprog
| intlinprog
| prob2struct