# reduceDAEIndex
将一阶微分代数方程组转换为等价的微分指数为 1 的系统
函数库: TySymbolicMath
# 语法
newEqs,newVars,R,oldIndex = reduceDAEIndex(eqs,vars)
# 说明
newEqs,newVars,R,oldIndex = reduceDAEIndex(eqs,vars) 将一阶微分代数方程组 eqs 转换为等价的微分指数为 1 的系统 newEqs。矩阵 R 将 newVars 中的新变量表示为原变量 vars 的导数。oldIndex 为原微分代数方程组 eqs 的微分指数。示例
reduceDAEIndex 保持原方程和原变量不同并引进新方程和新变量。转换之后,reduceDAEIndex 会通过调用 isLowIndexDAE 来检查新系统的微分指数。如果 newEqs 的指数大于等于 2,则 reduceDAEIndex 会报出警告。
# 示例
降低 DAE 系统的微分指数
检查下列的 DAE 系统具有小的(0 或 1)还是大的(大于 1)的微分指数。如果这个指数大于 1,则使用 reduceDAEIndex 降低。
构造由两个微分代数方程构成的系统。其中,x,y,z 表示系统的状态变量。使用两个符号向量指定方程和变量,方程用符号方程向量指定,变量用符号变量向量指定。
using TySymbolicMath
@variables t x(t) y(t) z(t) f(t)
dt = Differential(t)
eqs = [dt(x) == x+z,dt(y)==f,x==y]
vars = [x,y,z]
使用 isLowIndexDAE 检查这个系统的微分指数。对于这个系统,isLowIndexDAE 返回 false。这意味着这个系统的微分指数大于等于 2。
isLowIndexDAE(eqs,vars)
ans = false
使用 reduceDAEIndex 重写方程以使它的微分指数为 1。接收这个函数的全部四个输出,这样还能显示原系统的微分指数。新系统具有一个额外的状态变量,Dxt。
newEqs,newVars = reduceDAEIndex(eqs,vars)
newEqs = 4-element Vector{Num}:
-x(t) + Dxt(t) - z(t)
Differential(t)(y(t)) - f(t)
x(t) - y(t)
-Differential(t)(y(t)) + Dxt(t)
newVars = 4-element Vector{Num}:
x(t)
y(t)
z(t)
Dxt(t)
检查新系统的微分阶数是不是小于 2。
isLowIndexDAE(newEqs,newVars)
ans = true
降低指数并得到更多细节
降低包含二阶微分代数方程的系统的微分指数。因为这个方程是二阶方程,首先使用 reduceDifferentialOrder 把这个系统重写为一阶 DAEs 组成的系统。
构造由两个二阶 DAEs 组成的系统。其中,x,y,F 为系统的状态变量。使用两个符号向量指定方程和变量,方程用符号方程向量指定,变量用符号变量向量指定。
using TySymbolicMath
@variables t x(t) y(t) F(t) r g
dt2 = Differential(t)^2
eqs = [dt2(x)==-F*x,dt2(y)==-F*y-g,x^2+y^2==r^2]
vars = [x,y,F]
重写这个系统以使所有方程变成一阶微分方程。reduceDifferentialOrder 通过引入表示两个一阶新变量 Dxt 和 Dyt 来替换二阶 DAE 方式对方程组进行降阶。该函数还把一阶方程替换为了符号表达式。
eqs, vars = reduceDifferentialOrder(eqs,vars)
eqs = 5-element Vector{Num}:
Differential(t)(Dxt(t)) + x(t)*F(t)
g + Differential(t)(Dyt(t)) + y(t)*F(t)
-(r^2) + x(t)^2 + y(t)^2
Dxt(t) - Differential(t)(x(t))
-Differential(t)(y(t)) + Dyt(t)
vars = 5-element Vector{Num}:
x(t)
y(t)
F(t)
Dxt(t)
Dyt(t)
使用 reduceDAEIndex 将该系统进行重写以使其微分指数为 1。
eqs, vars, R, originalIndex = reduceDAEIndex(eqs,vars)
eqs = 10-element Vector{Num}:
Dxtt(t) + x(t)*F(t)
g + Dytt(t) + y(t)*F(t)
-(r^2) + x(t)^2 + y(t)^2
-Dxt1(t) + Dxt(t)
-Dyt1(t) + Dyt(t)
2Dxt1(t)*x(t) + 2Dyt1(t)*y(t)
2(Dxt1(t)^2) + 2(Dyt1(t)^2) + 2Differential(t)(Dyt1(t))*y(t) + 2x(t)*Dxt1t(t)
Dxtt(t) - Dxt1t(t)
-Differential(t)(Dyt1(t)) + Dytt(t)
Dyt1(t) - Differential(t)(y(t))
vars = 10-element Vector{Num}:
x(t)
y(t)
F(t)
Dxt(t)
Dyt(t)
Dxt1(t)
Dyt1(t)
Dxtt(t)
Dytt(t)
Dxt1t(t)
R = 5×2 Matrix{Num}:
Dxt1(t) Differential(t)(x(t))
Dyt1(t) Differential(t)(y(t))
Dxtt(t) Differential(t)(Dxt(t))
Dytt(t) Differential(t)(Dyt(t))
Dxt1t(t) Differential(t)(Differential(t)(x(t)))
originalIndex = 3
使用 reduceRedundancies 来降低方程数目。
eqs, vars= reduceRedundancies(eqs,vars)
eqs = 7-element Vector{Num}:
Dxtt(t) + x(t)*F(t)
g + Dytt(t) + y(t)*F(t)
-(r^2) + x(t)^2 + y(t)^2
2x(t)*Dxt(t) + 2Dyt(t)*y(t)
2Dxtt(t)*x(t) + 2(Dyt(t)^2) + 2y(t)*Dytt(t) + 2(Dxt(t)^2)
-Differential(t)(Dyt(t)) + Dytt(t)
-Differential(t)(y(t)) + Dyt(t)
vars = 7-element Vector{Num}:
x(t)
F(t)
Dxtt(t)
y(t)
Dytt(t)
Dxt(t)
Dyt(t)
# 输入参数
eqs - 一阶 DAEs 组成的方程组符号方程向量 | 符号表达式向量
一阶 DAEs 组成的方程组,指定为符号方程向量或符号表达式向量。
vars - 状态变量符号变量向量
状态变量,指定为符号变量向量。
# 输出参数
newEqs - 微分指数为 1 的一阶 DAEs 组成的方程组符号表达式向量
微分指数为 1 的一阶 DAEs 组成的方程组,以符号表达式向量形式返回。
newVars - 扩展的变量符号变量向量
扩展的变量,以符号变量向量形式返回。这个向量包含原状态变量 vars,后面是用来替代 eqs 中二阶或更高阶微分的生成的变量。
R - 新变量与原变量之间的关系符号矩阵
新变量与原变量之间的关系,以两列的符号矩阵形式返回。第一列包含新变量,第二列包含它们作为原变量 vars 的微分的定义。
oldIndex - 原 DAE 系统的微分指数整数
原 DAE 系统的微分指数,以整数形式返回。
# 算法
reduceDAEIndex 使用了 Pantelides 算法。该算法通过选择性地增加原方程的微分以将高指数系统降低为低指数系统。Pantelides 算法可能低估新系统的微分指数,因此可能无法将微分指数降低为 1。这种情况下,reduceDAEIndex 会报出警告,且将 oldIndex 返回为 -1。reduceDAEToODE 使用了更可靠的但也是更慢的高斯消元法。注意 reduceDAEToODE 需要 DAE 系统是半线性的。
# 另请参阅
decic | findDecoupledBlocks | incidenceMatrix | isLowIndexDAE | massMatrixForm | reduceDAEToODE | reduceDifferentialOrder | reduceRedundancies