使用modelingToolKit.JL在Julia中求解代数微分方程

计算科学 微分方程 符号计算 朱莉娅
2021-12-23 06:46:24

我正在尝试求解 Julia 的modelingTookKit.JL 中的微分代数方程,其中向量场的形式为 f(X) = 0。

我在下面的链接modelingToolkit.JL DAE]( https://benchmarks.sciml.ai/html/DAE/ROBERDAE.html )中找到了一个DAE示例,代码如下。但是,当我更换说

D(y₁) ~ -k₁*y₁ + k₃*y₂*y₃

经过

0 ~ -k₁*y₁ + k₃*y₂*y₃ - D(y₁)

我得到一个错误。如果有人知道或可以提供一个示例,其中矢量场的方程仅被隐式定义,即 f(X) = 0,将不胜感激。

using OrdinaryDiffEq, DiffEqDevTools, Sundials, ModelingToolkit, ODEInterfaceDiffEq,
      Plots, DASSL, DASKR
using LinearAlgebra

@variables t y₁(t)=1.0 y₂(t)=0.0 y₃(t)=0.0
@parameters k₁=0.04 k₂=3e7 k₃=1e4
D = Differential(t)
eqs = [
  D(y₁) ~ -k₁*y₁ + k₃*y₂*y₃
  D(y₂) ~  k₁*y₁ - k₃*y₂*y₃ - k₂*y₂^2
  0 ~  y₁ + y₂ + y₃ - 1
]
@named sys = ODESystem(eqs)
simpsys = structural_simplify(sys)
mmprob = ODEProblem(sys,[],(0.0,1e5))
daeprob = DAEProblem(sys,[D(y₁)=>-0.04,
                              D(y₂)=>0.04,
                              D(y₃)=>0.0],[],(0.0,1e5))
odaeprob = ODAEProblem(simpsys,[],(0.0,1e5))

ref_sol = solve(daeprob,IDA(),abstol=1/10^14,reltol=1/10^14);
ode_ref_sol = solve(odaeprob,CVODE_BDF(),abstol=1/10^14,reltol=1/10^14);

probs = [mmprob,daeprob,odaeprob]
refs = [ref_sol,ref_sol,ode_ref_sol];
1个回答
0 ~ -k₁*y₁ + k₃*y₂*y₃ - D(y₁)

在这个PR中处理。此功能将包含在 ModelingToolkit.jl 的下一个版本中。另外,请注意,您应该使用

simpsys = structural_simplify(sys)
mmprob = ODEProblem(simpsys,[],(0.0,1e5))

structural_simplify函数不会改变系统。