Main Content

EquationProblem

非線形方程式系

R2019b 以降

説明

最適化変数を使用して方程式系を指定し、solve を使用して解きます。

ヒント

完全なワークフローについては、方程式を解くための問題ベースのワークフローを参照してください。

作成

関数 eqnproblem を使用して、EquationProblem オブジェクトを作成します。OptimizationEquality オブジェクトを作成し、これを EquationProblem オブジェクトの Equations プロパティとして設定することにより、問題に方程式を追加します。

prob = eqnproblem;
x = optimvar('x');
eqn = x^5 - x^4 + 3*x == 1/2;
prob.Equations.eqn = eqn;

警告

問題ベースのアプローチでは、目的関数、非線形等式、および非線形不等式における複素数値はサポートされていません。関数の計算に複素数値が含まれていると、それが中間値としてであっても、最終結果が不正確になる場合があります。

プロパティ

すべて展開する

問題の方程式。OptimizationEquality 配列またはフィールドとして OptimizationEquality 配列をもつ構造体として指定します。

例: sum(x.^2,2) == 4

問題のラベル。string または文字ベクトルとして指定します。Description はソフトウェアでは計算に使用されません。Description は、あらゆる理由で自由に使用できるラベルです。たとえば、モデルまたは問題を共有、アーカイブ、または提示し、モデルまたは問題に関する説明情報を Description に保存できます。

例: "An iterative approach to the Traveling Salesman problem"

データ型: char | string

この プロパティ は読み取り専用です。

オブジェクトの最適化変数。OptimizationVariable オブジェクトの構造体として指定します。

データ型: struct

オブジェクト関数

optimoptions最適化オプションの作成
prob2struct最適化問題または方程式問題のソルバー形式への変換
show最適化オブジェクトの情報表示
solve最適化問題または方程式問題の求解
solvers最適化問題または方程式問題に対する既定のソルバーと有効なソルバーの決定
varindexソルバーベースの変数インデックスへの問題変数のマッピング
write最適化オブジェクトの説明の保存

すべて折りたたむ

次の非線形方程式系を解きます。

exp(-exp(-(x1+x2)))=x2(1+x12)x1cos(x2)+x2sin(x1)=12

問題ベースのアプローチを使用する場合は、まず x を 2 要素の最適化変数として定義します。

x = optimvar('x',2);

最初の方程式を最適化等式として作成します。

eq1 = exp(-exp(-(x(1) + x(2)))) == x(2)*(1 + x(1)^2);

同様に、2 番目の方程式も最適化等式として作成します。

eq2 = x(1)*cos(x(2)) + x(2)*sin(x(1)) == 1/2;

方程式問題を作成し、方程式を問題に配置します。

prob = eqnproblem;
prob.Equations.eq1 = eq1;
prob.Equations.eq2 = eq2;

問題を確認します。

show(prob)
  EquationProblem : 

	Solve for:
       x


 eq1:
       exp((-exp((-(x(1) + x(2)))))) == (x(2) .* (1 + x(1).^2))

 eq2:
       ((x(1) .* cos(x(2))) + (x(2) .* sin(x(1)))) == 0.5

[0,0] から始めて問題を解きます。問題ベースのアプローチの場合、初期点を構造体として指定します。変数名は構造体のフィールドとします。この問題の変数は x の 1 つしかありません。

x0.x = [0 0];
[sol,fval,exitflag] = solve(prob,x0)
Solving problem using fsolve.

Equation solved.

fsolve completed because the vector of function values is near zero
as measured by the value of the function tolerance, and
the problem appears regular as measured by the gradient.
sol = struct with fields:
    x: [2x1 double]

fval = struct with fields:
    eq1: -2.4070e-07
    eq2: -3.8255e-08

exitflag = 
    EquationSolved

解の点を表示します。

disp(sol.x)
    0.3532
    0.6061

fcn2optimexpr を必要とするサポートされていない関数

方程式の関数が初等関数で構成されていない場合、fcn2optimexprを使用して、その関数を最適化式に変換しなければなりません。次に例を示します。

ls1 = fcn2optimexpr(@(x)exp(-exp(-(x(1)+x(2)))),x);
eq1 = ls1 == x(2)*(1 + x(1)^2);
ls2 = fcn2optimexpr(@(x)x(1)*cos(x(2))+x(2)*sin(x(1)),x);
eq2 = ls2 == 1/2;

詳細については、最適化変数および式でサポートされる演算非線形関数から最適化式への変換を参照してください。

バージョン履歴

R2019b で導入