メインコンテンツ

reduceDAEToODE

連立 1 階半線形微分代数方程式の同等の微分指数 0 の方程式への変換

説明

newEqs = reduceDAEToODE(eqs,vars) は、高指数の連立 1 階半線形代数方程式 eqs を同等の連立常微分方程式 newEqs に変換します。新しい方程式の微分指数は 0 です。つまり、vars の変数の導関数に対し newEqs のヤコビアンは可逆です。

[newEqs,constraintEqs] = reduceDAEToODE(eqs,vars) は拘束方程式のベクトルを返します。

[newEqs,constraintEqs,oldIndex] = reduceDAEToODE(eqs,vars) は元の半線形 DAE の系 eqs の微分指数 oldIndex を返します。

すべて折りたたむ

連立微分代数方程式 (DAE) を陰的な連立常微分方程式 (ODE) に変換します。

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

syms x(t) y(t) z(t)
eqs = [diff(x,t) + x*diff(y,t) == y;
    x*diff(x, t) + x^2*diff(y) == sin(x);
    x^2 + y^2 == t*z]
eqs(t) = 

(x(t)t y(t)+t x(t)=y(t)x(t)2t y(t)+x(t)t x(t)=sin(x(t))x(t)2+y(t)2=tz(t))

vars = [x(t), y(t), z(t)]
vars = (x(t)y(t)z(t))

reduceDAEToODE を使用して微分指数が 0 になるように方程式を書き換えます。

newEqs = reduceDAEToODE(eqs,vars)
newEqs = 

(σ1-y(t)+t x(t)cos(x(t))-y(t)t x(t)-σ1z(t)-2x(t)t x(t)-2y(t)t y(t)+tt z(t))where  σ1=x(t)t y(t)

次の DAE 系の微分指数が低い (0 または 1) か高い (>1) か調べます。指数が 1 よりも高い場合、これを下げるためにまず reduceDAEIndex を、次に reduceDAEToODE を使用します。

連立微分代数方程式を作成します。ここで、関数 x1(t)x2(t) および x3(t) は方程式の状態変数を表します。また、方程式には関数 q1(t)q2(t) および q3(t) が含まれます。これらの関数は状態関数を表しません。方程式をシンボリック方程式のベクトル、変数をシンボリック関数呼び出しのベクトルとして指定します。

syms x1(t) x2(t) x3(t) q1(t) q2(t) q3(t)
eqs = [diff(x2) == q1 - x1;
       diff(x3) == q2 - 2*x2 - t*(q1-x1);
       q3 - t*x2 - x3];
vars = [x1(t), x2(t), x3(t)];

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

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

方程式をはじめて書き換えようとする場合は、reduceDAEIndex を使用し、微分指数が 1 になるようにします。この方程式では、reduceDAEIndex が方程式の微分指数を 0 または 1 まで減らせないため、警告が出されます。

[newEqs,newVars] = reduceDAEIndex(eqs,vars)
Warning: Index of reduced DAEs is larger than 1.
newEqs = 

(t x2(t)-q1(t)+x1(t)Dx3t(t)-q2(t)+2x2(t)+tq1(t)-x1(t)q3(t)-x3(t)-tx2(t)t q3(t)-x2(t)-tt x2(t)-Dx3t(t))

newVars = 

(x1(t)x2(t)x3(t)Dx3t(t))

reduceDAEIndex で半線形方程式の指数を 0 または 1 に簡約できない場合は、reduceDAEToODE を試します。この関数の処理は大幅に遅い場合があるため、最初の選択としてはお勧めできません。2 つの出力引数をもつ構文の使用により拘束方程式も返されます。

[newEqs,constraintEqs] = reduceDAEToODE(eqs,vars)
newEqs = 

(t x2(t)-q1(t)+x1(t)t x3(t)-q2(t)+2x2(t)+tq1(t)-tx1(t)t x1(t)-t q1(t)+2t2 q2(t)-3t3 q3(t))

constraintEqs = 

(t q3(t)-q2(t)+x2(t)x3(t)-q3(t)+tx2(t)-2t2 q3(t)+t q2(t)-q1(t)+x1(t))

3 つの出力引数をもつ構文を使用して、新しい方程式、拘束方程式および元の方程式 eqs の微分指数を返します。

[newEqs,constraintEqs,oldIndex] = reduceDAEToODE(eqs,vars)
newEqs = 

(t x2(t)-q1(t)+x1(t)t x3(t)-q2(t)+2x2(t)+tq1(t)-tx1(t)t x1(t)-t q1(t)+2t2 q2(t)-3t3 q3(t))

constraintEqs = 

(t q3(t)-q2(t)+x2(t)x3(t)-q3(t)+tx2(t)-2t2 q3(t)+t q2(t)-q1(t)+x1(t))

oldIndex = 
3

入力引数

すべて折りたたむ

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

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

例: [x(t),y(t)] または [x(t);y(t)]

出力引数

すべて折りたたむ

陰的な連立常微分方程式。シンボリック式の列ベクトルとして返されます。この方程式の微分指数は 0 です。

方程式の簡約化時に発生する拘束方程式。シンボリック式の列ベクトルとして返されます。これらの式は変数 vars に依存しますが、その導関数には依存しません。制約は newEqs の微分方程式の保存量です。つまり各制約の時間微分は newEqs の方程式の剰余を消滅させます。

これらの方程式を使用して DAE 系に整合する初期条件を決定できます。

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

アルゴリズム

reduceDAEToODE の実装はガウスの消去法に基づいています。このアルゴリズムは reduceDAEIndex で使用される Pantelides アルゴリズムよりもより信頼性がありますが、大幅に時間がかかります。

バージョン履歴

R2014b で導入