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