Main Content

reduceDAEIndex

1 階微分代数方程式系の同等の微分指数 1 の系への変換

説明

[newEqs,newVars] = reduceDAEIndex(eqs,vars) は、高指数の 1 階微分代数方程式系 eqs を微分指数が 1 の同等の系 newEqs に変換します。

reduceDAEIndex は元の方程式と変数を保持し、新しい変数と方程式を生成します。変換後、reduceDAEIndexisLowIndexDAE を呼び出して新しい系の微分指数をチェックします。newEqs の指数が 2 以上であれば、reduceDAEIndex は警告を発します。

[newEqs,newVars,R] = reduceDAEIndex(eqs,vars) は、元の変数 newVars の導関数として新しい変数を vars に示す行列 R を返します。

[newEqs,newVars,R,oldIndex] = reduceDAEIndex(eqs,vars) は、元の DAE 系 eqs の微分指数 oldIndex を返します。

DAE 系の微分指数を減らす

次の DAE 系の微分指数が低い (0 または 1) か高い (>1) か調べます。指数が 1 よりも高い場合は、reduceDAEIndex を使用して減らします。

次の 2 つの微分代数方程式から成る系を作成します。ここで、シンボリック関数 x(t)y(t) および z(t) は系の状態変数を表します。方程式と変数を 2 つのシンボリック ベクトル (方程式をシンボリック方程式のベクトル、変数をシンボリック関数呼び出しのベクトル) として指定します。

syms  x(t) y(t) z(t) f(t)
eqs = [diff(x) == x + z, diff(y) == f(t), x == y];
vars = [x(t), y(t), z(t)];

isLowIndexDAE を使用して系の微分指数をチェックします。この系に対して isLowIndexDAE0 (false) を返します。これは系の微分指数が 2 以上であることを意味します。

isLowIndexDAE(eqs, vars)
ans =
  logical 
    0

reduceDAEIndex を使用して微分指数が 1 になるように系を書き換えます。新しい系には状態変数 Dyt(t) が追加されています。

[newEqs, newVars] = reduceDAEIndex(eqs, vars)
newEqs =
 diff(x(t), t) - z(t) - x(t)
               Dyt(t) - f(t)
                 x(t) - y(t)
      diff(x(t), t) - Dyt(t)
 
newVars =
   x(t)
   y(t)
   z(t)
 Dyt(t)

新しい系の微分の階数が 2 よりも低いことを確かめます。

isLowIndexDAE(newEqs, newVars)
ans =
  logical
     1

指数を減らし詳細を返す

2 つの 2 次微分代数方程式を含む系の微分指数を減らします。この方程式は 2 次方程式なので、まず reduceDifferentialOrder を使用してこの系を 1 階の DAE 系に書き換えます。

次の 2 つの 2 階 DAE から成る系を作成します。ここで、x(t)y(t) および F(t) は系の状態変数です。方程式と変数を 2 つのシンボリック ベクトル (方程式をシンボリック方程式のベクトル、変数をシンボリック関数呼び出しのベクトル) として指定します。

syms t x(t) y(t) F(t) r g
eqs = [diff(x(t), t, t) == -F(t)*x(t),...
       diff(y(t), t, t) == -F(t)*y(t) - g,...
       x(t)^2 + y(t)^2 == r^2 ];
vars = [x(t), y(t), F(t)];

この系を書き換えてすべての方程式が 1 階微分方程式になるようにします。関数 reduceDifferentialOrder は、新しい変数 Dxt(t)Dyt(t) を導入することにより、2 階 DAE を 2 つの 1 階式に置き換えます。また 1 次方程式をシンボリック式で置き換えます。

[eqs, vars] = reduceDifferentialOrder(eqs, vars)
eqs =
     diff(Dxt(t), t) + F(t)*x(t)
 diff(Dyt(t), t) + g + F(t)*y(t)
         - r^2 + x(t)^2 + y(t)^2
          Dxt(t) - diff(x(t), t)
          Dyt(t) - diff(y(t), t)
 
vars =
   x(t)
   y(t)
   F(t)
 Dxt(t)
 Dyt(t)

reduceDAEIndex を使用して微分指数が 1 になるように系を書き換えます。

[eqs, vars, R, originalIndex] = reduceDAEIndex(eqs, vars)
eqs =
                                                   Dxtt(t) + F(t)*x(t)
                                               g + Dytt(t) + F(t)*y(t)
                                               - r^2 + x(t)^2 + y(t)^2
                                                      Dxt(t) - Dxt1(t)
                                                      Dyt(t) - Dyt1(t)
                                       2*Dxt1(t)*x(t) + 2*Dyt1(t)*y(t)
 2*Dxt1t(t)*x(t) + 2*Dxt1(t)^2 + 2*Dyt1(t)^2 + 2*y(t)*diff(Dyt1(t), t)
                                                    Dxtt(t) - Dxt1t(t)
                                            Dytt(t) - diff(Dyt1(t), t)
                                               Dyt1(t) - diff(y(t), t)

vars =
     x(t)
     y(t)
     F(t)
   Dxt(t)
   Dyt(t)
  Dytt(t)
  Dxtt(t)
  Dxt1(t)
  Dyt1(t)
 Dxt1t(t)

R =
[  Dytt(t),  diff(Dyt(t), t)]
[  Dxtt(t),  diff(Dxt(t), t)]
[  Dxt1(t),    diff(x(t), t)]
[  Dyt1(t),    diff(y(t), t)]
[ Dxt1t(t), diff(x(t), t, t)]

originalIndex =
     3

reduceRedundancies を使用して系を短くします。

[eqs, vars] = reduceRedundancies(eqs, vars)
eqs =
                                       Dxtt(t) + F(t)*x(t)
                                   g + Dytt(t) + F(t)*y(t)
                                   - r^2 + x(t)^2 + y(t)^2
                             2*Dxt(t)*x(t) + 2*Dyt(t)*y(t)
 2*Dxtt(t)*x(t) + 2*Dytt(t)*y(t) + 2*Dxt(t)^2 + 2*Dyt(t)^2
                                 Dytt(t) - diff(Dyt(t), t)
                                    Dyt(t) - diff(y(t), t)

vars =
    x(t)
    y(t)
    F(t)
  Dxt(t)
  Dyt(t)
 Dytt(t)
 Dxtt(t)

入力引数

すべて折りたたむ

1 階 DAE 系。シンボリック方程式または式のベクトルとして指定します。

状態変数。x(t) など、シンボリックな関数または関数呼び出しのベクトルとして指定します。

例: [x(t),y(t)]

出力引数

すべて折りたたむ

微分指数が 1 の 1 階 DAE の系。シンボリック式の列ベクトルとして返されます。

拡張された変数のセット。シンボリック関数呼び出しの列ベクトルとして返されます。このベクトルには元の状態変数 vars に続き、eqs の 2 階以上の導関数に置き換わる、生成された変数が含まれます。

新しい変数と元の変数の関係。2 列のシンボリック行列として返されます。1 列目には新しい変数が含まれます。2 列目にはそれらの定義が元の変数 vars の導関数として含まれます。

元の DAE 系の微分指数。整数または NaN として返されます。

アルゴリズム

reduceDAEIndex の実装では Pantelides アルゴリズムが使用されます。このアルゴリズムは元の方程式の微分形を選択的に加算することにより、高指数の系を低指数系に簡約します。Pantelides アルゴリズムは新しい系の微分指数を低く見積もることがあり、その場合は微分指数を 1 まで減らせません。この場合、reduceDAEIndex は警告を発し、4 つの出力引数をもつ構文に oldIndex の値を NaN として返します。関数 reduceDAEToODE はより信頼性が高いが、時間の掛かるガウスの消去法を使用します。reduceDAEToODE では DAE 系が半線形でなければならない点に注意してください。

バージョン履歴

R2014b で導入