# decic
为带有代数约束的一阶隐式常微分方程组求得一致的初始条件
函数库: TySymbolicMath
# 语法
y0, yp0 = decic(eqs,vars,constraintEqs,t0,y0_est,fixedVars,yp0_est,options)
# 说明
y0, yp0 = decic(eqs,vars,constraintEqs,t0,y0_est,fixedVars,yp0_est,options) 为带有代数约束的一阶隐式常微分方程组(即 reduceDAEToODE 的结果)求得一致的初始条件。示例
使用 eqs,constraintEqs = reduceDAEToODE(DA_eqs,vars) 将微分代数方程组 DA_eqs 化为隐式常微分方程组 eqs。该函数同时也返回在转换过程中的约束方程。decic 为这个常微分方程组以及其导数找到在 t0 处一致的初始条件 y0 和 yp0。
把 y0 和 yp0 的值带入微分方程以及约束方程会得到全零向量。
y0_est 提供了对变量 vars 在时间 t0 处的估计值,fixedVars 表示 y0_est 中的哪些值在数值搜索中不应该被修改。可选参数 yp0_est 提供了变量 vars 在时间 t0 处的导数的估计值。
# 示例
为常微分方程组求得一致的初始条件
将微分代数方程转化为隐式常微分方程组。然后对生成的常微分方程组的变量及其一阶导数求得一致的初始条件。
创建一个微分代数方程。
using TySymbolicMath
using TyMath
@variables t x(t) y(t)
dt = Differential(t)
DA_eqs = [dt(x) == cos(t)+y,x^2+y^2==1]
vars=[x,y]
使用 reduceDAEToODE 将这个方程转为隐式常微分方程组。
eqs, constraintEqs = reduceDAEToODE(DA_eqs,vars)
eqs = 2-element Vector{Num}:
-cos(t) - y(t) + Differential(t)(x(t))
-2Differential(t)(y(t))*y(t) - 2x(t)*Differential(t)(x(t))
constraintEqs = 1-element Vector{Number}:
1 - (x(t)^2) - (y(t)^2)
为数值搜索创建指定数值容差的选项。
options = odeset(reltol=1e-7,abstol=1e-7)
固定时间 t0 = 0,指定变量及其倒数的数值估计。
t0 = 0
y0_est = [0.1,0.9]
yp0_est = [0,0]
如果把约束认为是带有固定参数 y 的关于变量 x 的代数方程,那么可以指定 fixedVars = [0,1]。反之,则可以指定 fixedVars = [1,0]。
提供初始值为 x(t0) = y0_est[1] = 0.1。
fixedVars = [1,0]
y0,yp0 = decic(eqs,vars,constraintEqs,t0,y0_est,fixedVars,yp0_est,options)
y0 = 2-element Vector{Float64}:
0.1
0.99498743710662
yp0 = 2-element Vector{Float64}:
1.9949874371066199
-0.20050378152592124
现在,把 fixedVars 改为 [0,1],这使得 y(t0) = y0_est[2] = 0.9。
fixedVars = [0,1]
y0,yp0 = decic(eqs,vars,constraintEqs,t0,y0_est,fixedVars,yp0_est,options)
y0 = 2-element Vector{Float64}:
-0.4358898943540673
0.9
yp0 = 2-element Vector{Float64}:
1.9
0.9202119991919198
说明这些初始值满足方程及约束以证明其是一致的。
substitute.(eqs,Ref(Dict(vcat(t=>t0,[vars[i]=>y0[i] for i in eachindex(y0)],[dt(vars[i])=>yp0[i] for i in eachindex(yp0)]))))
ans = 2-element Vector{Num}:
0.0
0.0
substitute.(constraintEqs,Ref(Dict(vcat(t=>t0,[vars[i]=>y0[i] for i in eachindex(y0)],[dt(vars[i])=>yp0[i] for i in eachindex(yp0)]))))
ans = 1-element Vector{Num}:
0.0
# 输入参数
eqs - 隐式常微分方程组符号等式向量 | 符号表达式向量
隐式常微分方程组,指定为符号等式向量或者符号表达式向量。这里,符号表达式表示右侧为零的等式。
一般来说,这是 reduceDAEToODE 的返回值。
vars - 原微分代数系的状态变量符号函数向量
原微分代数系的状态变量,指定为符号函数向量。
示例:[x,y]
数据类型: Num
constraintEqs - 在 reduceDAEToODE 代换中发现的约束方程符号等式向量 | 符号表达式向量
在 reduceDAEToODE 代换中发现的约束方程,指定为符号等式向量或符号表达式向量。这些表达式或等式仅依赖变量 vars,而不依赖其导数。
一般来说,这是 reduceDAEToODE 返回的约束方程。
t0 - 初始时间实数
初始时间,指定为实数。
数据类型: Int | Float
y0_est - 变量 vars 在初始时间 t0 时的估计值向量
变量 vars 在初始时间 t0 时的估计值,指定为向量。
数据类型: Int | Float
fixedVars - 表示 y0_est 中的哪些值为固定值的输入向量由 0 和 1 组成的向量
表示 y0_est 中的哪些值为固定值的输入向量,指定为由 0 和 1 组成的向量。y0_est 中的固定值对应 fixedVars 对应位置为 1。这些值在数值搜索中不会被修改。 fixedVars 中的零值表示 decic 求解约束方程时 y0_est 中的变量。0 的数目必须与约束方程的数目相同。对于变量 vars[fixedVars.==0] 的约束方程的雅可比矩阵必须可逆。
yp0_est - 变量 vars 的导数在初始时间 t0 时的估计值向量
变量 vars 的导数在初始时间 t0 时的估计值,指定为向量。
数据类型: Int | Float
options - 数值搜索的选项由 odeset 返回的选项
数值搜索的选项,指定为由 odeset 返回的选项。比如,您可以指定数值搜索的容差。
# 输出参数
y0 - 变量的一致初始值向量
变量的一致初始值,以向量形式返回。
数据类型: Int | Float
yp0 - 变量的一阶导数的一致初始值向量
变量的一阶导数的一致初始值,以向量形式返回。
数据类型: Int | Float
# 另请参阅
findDecoupledBlocks | incidenceMatrix | isLowIndexDAE | massMatrixForm | reduceDAEIndex | reduceDAEToODE | reduceDifferentialOrder | reduceRedundancies