方程式を解くための問題ベースのワークフロー
メモ
Optimization Toolbox™ には、方程式を解くためのアプローチが 2 通りあります。このトピックでは、問題ベースのアプローチについて説明します。ソルバーベースの最適化問題の設定では、ソルバーベースのアプローチについて説明しています。
方程式系を解くには、以下の手順を実行します。
eqnproblem
を使用して、方程式問題オブジェクトを作成します。問題オブジェクトは、方程式を定義するコンテナーです。方程式問題オブジェクトは、問題と、問題変数に存在する範囲を定義します。例として、方程式問題を作成します。
prob = eqnproblem;
optimvar
を使用して、名前付き変数を作成します。最適化変数は、方程式を記述するために使用するシンボリック変数です。変数定義に範囲を含めます。たとえば、
'x'
という名前の変数の 15 行 3 列の配列を作成し、下限を0
、上限を1
とします。x = optimvar('x',15,3,'LowerBound',0,'UpperBound',1);
問題変数の方程式を定義します。以下に例を示します。
sumeq = sum(x,2) == 1; prob.Equations.sumeq = sumeq;
メモ
多項式、有理式、および初等関数 (
exp
など) で構成されていない非線形関数がある場合は、その関数をfcn2optimexpr
を使用して最適化式に変換します。詳細については、非線形関数から最適化式への変換と最適化変数および式でサポートされる演算を参照してください。必要に応じて、方程式にワークスペース変数として追加のパラメーターを含めます。問題ベースのアプローチでの追加パラメーターの受け渡しを参照してください。
非線形問題の場合、フィールドが最適化変数名となっている構造体として、初期点を設定します。以下に例を示します。
x0.x = randn(size(x)); x0.y = eye(4); % Assumes y is a 4-by-4 variable
solve
を使用して問題を解きます。sol = solve(prob); % Or, for nonlinear problems, sol = solve(prob,x0)
これらの基本的な手順に加え、show
または write
を使用して、問題を解く前に問題定義を確認することができます。既定のソルバーまたはオプションの変更で説明されているように、optimoptions
を使用して solve
のオプションを設定します。
警告
問題ベースのアプローチでは、目的関数、非線形等式、および非線形不等式における複素数値はサポートされていません。関数の計算に複素数値が含まれていると、それが中間値としてであっても、最終結果が不正確になる場合があります。
メモ
最適化問題に含まれるすべての名前は一意でなければなりません。特に、すべての変数名、目的関数名、および制約関数名は異なっている必要があります。
多項式を使用した基本的な方程式の解法の例については、非線形多項式系の解法、問題ベースを参照してください。一般的な非線形の例については、非線形方程式系の解法、問題ベースを参照してください。より広範囲な例については、非線形方程式系を参照してください。
参考
fcn2optimexpr
| optimvar
| solve
| optimoptions
| eqnproblem
| show
| write