メインコンテンツ

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

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

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 以上であることを意味します。

tf = isLowIndexDAE(eqs,vars)
tf = logical
   0

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

[newEqs,newVars] = reduceDAEIndex(eqs,vars)
newEqs = 

(t x(t)-x(t)-z(t)Dyt(t)-f(t)x(t)-y(t)t x(t)-Dyt(t))

newVars = 

(x(t)y(t)z(t)Dyt(t))

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

tf = isLowIndexDAE(newEqs, newVars)
tf = logical
   1

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

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

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 = 

(t Dxt(t)+F(t)x(t)t Dyt(t)+g+F(t)y(t)-r2+x(t)2+y(t)2Dxt(t)-t x(t)Dyt(t)-t y(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)-r2+x(t)2+y(t)2Dxt(t)-Dxt1(t)Dyt(t)-Dyt1(t)2Dxt1(t)x(t)+2Dyt1(t)y(t)2y(t)t Dyt1(t)+2Dxt1(t)2+2Dyt1(t)2+2Dxt1t(t)x(t)Dxtt(t)-Dxt1t(t)Dytt(t)-t Dyt1(t)Dyt1(t)-t y(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)t Dyt(t)Dxtt(t)t Dxt(t)Dxt1(t)t x(t)Dyt1(t)t y(t)Dxt1t(t)2t2 x(t))

originalIndex = 
3

reduceRedundancies を使用して方程式を短くします。

[eqs,vars] = reduceRedundancies(eqs,vars)
eqs = 

(Dxtt(t)+F(t)x(t)g+Dytt(t)+F(t)y(t)-r2+x(t)2+y(t)22Dxt(t)x(t)+2Dyt(t)y(t)2Dxt(t)2+2Dyt(t)2+2Dxtt(t)x(t)+2Dytt(t)y(t)Dytt(t)-t Dyt(t)Dyt(t)-t y(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 で導入