Main Content

eqnproblem

方程式問題の作成

R2019b 以降

説明

eqnproblem を使用して方程式問題を作成します。

ヒント

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

prob = eqnproblem は、既定のプロパティで方程式問題を作成します。

prob = eqnproblem(Name,Value) は、1 つ以上の名前と値のペアの引数を使用して追加オプションを指定します。たとえば、問題を作成する際に、Equations の名前を使用することで、方程式を指定できます。

すべて折りたたむ

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

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;

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

x が 2 行 2 列の行列である場合、方程式

x3=[1234]

は多項方程式系です。ここで、x3 は、行列乗算を使用した x*x*x を意味します。問題ベースのアプローチを使用して、この方程式系を容易に定式化し、解くことができます。

まず、変数 x を 2 行 2 列の行列変数として定義します。

x = optimvar('x',2,2);

x について解く方程式を定義します。

eqn = x^3 == [1 2;3 4];

この方程式を使用して、方程式問題を作成します。

prob = eqnproblem('Equations',eqn);

[1 1;1 1] から始めて問題を解きます。

x0.x = ones(2);
sol = 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: [2x2 double]

解を検証します。

disp(sol.x)
   -0.1291    0.8602
    1.2903    1.1612

解の 3 乗を表示します。

sol.x^3
ans = 2×2

    1.0000    2.0000
    3.0000    4.0000

入力引数

すべて折りたたむ

名前と値の引数

引数の任意のペアを Name1=Value1,...,NameN=ValueN のように指定します。Name は引数名、Value は対応する値です。名前と値の引数は、他の引数より後に指定されている必要があります。ただし、各ペアの順序は任意です。

R2021a 以前では、それぞれの名前と値をコンマで区切り、Name を引用符で囲みます。

例: prob = eqnproblem('Equations',eqn)

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

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

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

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

データ型: char | string

出力引数

すべて折りたたむ

方程式問題。EquationProblem オブジェクトとして返されます。通常、問題の説明を完了するには、prob.Equations を指定し、さらに非線形方程式の場合は初期点の構造体を指定します。solve を呼び出して、完全な問題を解きます。

警告

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

バージョン履歴

R2019b で導入