reduceDAEToODE
1 階半線形微分代数方程式系の同等の微分指数 0 の系への変換
構文
説明
例
DAE 系の陰的 ODE 系への変換
微分代数方程式 (DAE) 系を陰的常微分方程式 (ODE) 系に変換します。
次の 2 つの微分代数方程式から成る系を作成します。ここで、シンボリック関数 x(t)
、y(t)
および z(t)
は系の状態変数を表します。方程式と変数を 2 つのシンボリック ベクトル (方程式をシンボリック方程式のベクトル、変数をシンボリック関数呼び出しのベクトル) として指定します。
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]; vars = [x(t), y(t), z(t)];
reduceDAEToODE
を使用して微分指数が 0
になるように系を書き換えます。
newEqs = reduceDAEToODE(eqs, vars)
newEqs = x(t)*diff(y(t), t) - y(t) + diff(x(t), t) diff(x(t), t)*(cos(x(t)) - y(t)) - x(t)*diff(y(t), t) z(t) - 2*x(t)*diff(x(t), t) - 2*y(t)*diff(y(t), t) + t*diff(z(t), t)
系を簡約して、簡約結果の詳細を返す
次の DAE 系の微分指数が低い (0
または 1
) か高い (>1
) か調べます。指数が 1
よりも高い場合、これを下げるためにまず reduceDAEIndex
を、次に reduceDAEToODE
を使用します。
微分代数方程式系を作成します。ここで、関数 x1(t)
、x2(t)
および x3(t)
は系の状態変数を表します。また、系には関数 q1(t)
、q2(t)
および q3(t)
が含まれます。これらの関数は状態関数を表しません。方程式と変数を 2 つのシンボリック ベクトル (方程式をシンボリック方程式のベクトル、変数をシンボリック関数呼び出しのベクトル) として指定します。
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
を使用して系の微分指数をチェックします。この系に対して isLowIndexDAE
は 0
(false
) を返します。これは系の微分指数が 2
以上であることを意味します。
isLowIndexDAE(eqs, vars)
ans = logical 0
系をはじめて書き換えようとする場合は、reduceDAEIndex
を使用し、微分指数が 1
になるようにします。この系では、reduceDAEIndex
が系の微分指数を 0
または 1
まで減らせないため、警告が出されます。
[newEqs, newVars] = reduceDAEIndex(eqs, vars)
Warning: Index of reduced DAEs is larger than 1. newEqs = x1(t) - q1(t) + diff(x2(t), t) Dx3t(t) - q2(t) + 2*x2(t) + t*(q1(t) - x1(t)) q3(t) - x3(t) - t*x2(t) diff(q3(t), t) - x2(t) - t*diff(x2(t), t) - Dx3t(t) newVars = x1(t) x2(t) x3(t) Dx3t(t)
reduceDAEIndex
で半線形系の指数を 0
または 1
に簡約できない場合は、reduceDAEToODE
を試します。この関数の処理は大幅に遅い場合があるため、最初の選択としてはお勧めできません。2 つの出力引数をもつ構文の使用により拘束方程式も返されます。
[newEqs, constraintEqs] = reduceDAEToODE(eqs, vars)
newEqs = x1(t) - q1(t) + diff(x2(t), t) 2*x2(t) - q2(t) + t*q1(t) - t*x1(t) + diff(x3(t), t) diff(x1(t), t) - diff(q1(t), t) + diff(q2(t), t, t) - diff(q3(t), t, t, t) constraintEqs = x1(t) - q1(t) + diff(q2(t), t) - diff(q3(t), t, t) x3(t) - q3(t) + t*x2(t) x2(t) - q2(t) + diff(q3(t), t)
3 つの出力引数をもつ構文を使用して、新しい方程式、拘束方程式および元の系 eqs
の微分指数を返します。
[newEqs, constraintEqs, oldIndex] = reduceDAEToODE(eqs, vars)
newEqs = x1(t) - q1(t) + diff(x2(t), t) 2*x2(t) - q2(t) + t*q1(t) - t*x1(t) + diff(x3(t), t) diff(x1(t), t) - diff(q1(t), t) + diff(q2(t), t, t) - diff(q3(t), t, t, t) constraintEqs = x1(t) - q1(t) + diff(q2(t), t) - diff(q3(t), t, t) x3(t) - q3(t) + t*x2(t) x2(t) - q2(t) + diff(q3(t), t) oldIndex = 3
入力引数
出力引数
アルゴリズム
reduceDAEToODE
の実装はガウスの消去法に基づいています。このアルゴリズムは reduceDAEIndex
で使用される Pantelides アルゴリズムよりもより信頼性がありますが、大幅に時間がかかります。
バージョン履歴
R2014b で導入