このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
reduceDAEIndex
連立 1 階微分代数方程式の同等の微分指数 1 の方程式への変換
構文
説明
例
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 を使用して方程式の微分指数をチェックします。この方程式に対して isLowIndexDAE は 0 (false) を返します。これは方程式の微分指数が 2 以上であることを意味します。
isLowIndexDAE(eqs, vars)
ans =
logical
0reduceDAEIndex を使用して微分指数が 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 =
3reduceRedundancies を使用して方程式を短くします。
[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)入力引数
出力引数
アルゴリズム
reduceDAEIndex の実装では Pantelides アルゴリズムが使用されます。このアルゴリズムは元の方程式の微分形を選択的に加算することにより、高指数の方程式を低指数方程式に簡約します。Pantelides アルゴリズムは新しい方程式の微分指数を低く見積もることがあり、その場合は微分指数を 1 まで減らせません。この場合、reduceDAEIndex は警告を発し、4 つの出力引数をもつ構文に oldIndex の値を NaN として返します。関数 reduceDAEToODE はより信頼性が高いが、時間の掛かるガウスの消去法を使用します。reduceDAEToODE では DAE 系が半線形でなければならない点に注意してください。
バージョン履歴
R2014b で導入