在Dymola中解决DAEs,为什么在执行Patelides算法后使用DASSL算法?

我对 Dymola 中的 DAE 求解过程感到困惑。所以我做了一个例子来探索它。
这是示例方案和控制方程的屏幕截图

基于以下变量的定义,我认为求解 DAE 的过程是

  1. 选择状态变量
  2. 使用积分器根据状态变量的导数计算状态变量。
  3. 计算其他变量。

我使用以下调试设置在 Dymola 中构建模型。

由于我的模型中DAE的指数是3,所以需要做指数约简,使用Pantelides算法后,Dymola会在DAE系统中加入更多的微分方程。
翻译日志验证了我的推断。

现在,根据方程浏览器,很明显 DAE 系统已被修改为 BLT 形式,我想我可以在当前方程系统中使用牛顿法,但 Dymola 会使用 DASSL 算法。显然,DASSL 会再次从头开始构建结构雅可比矩阵,因此在初始化(使用 Pantelides 算法)和模拟(使用 DASSL 算法)过程中,将使用不同的结构雅可比矩阵。

我的问题是:
使用 Pantelides 算法进行索引归约和分区后,我可以用牛顿法求解方程,但为什么 Dymola 必须再次进行分区并使用 DASSL 算法?

另外,我在 Wolfram System Modeler 中比较了结构化雅可比矩阵在初始化和仿真过程中,发现这两个矩阵是不同的。

回答

我认为实际上有两件事对于理解整个过程很重要:

  1. 对于初始化和仿真,方程组是不同的。原因例如在Modelica 语言规范 3.4的第 8.6 节中找到:

在此阶段,导数der(..)和前变量pre(..)也被解释为未知代数变量。初始化使用在预期操作中使用的所有方程和算法......

基本上,一组不同的未知数(和相应的方程)会导致两个独立的问题需要在初始化和模拟期间解决。据我所知,符号处理(包括 Pantelides 算法)用于简化这两个问题。举个例子:翻译Modelica.Blocks.Examples.PID_Controller结果如下翻译日志,将两个方面分开(注意:“翻译模型”和“初始化问题”是不同的):

  1. 在找到初始问题的一致解决方案后(例如使用牛顿法),实际积分开始。初始化完成后 DASSL 所做的与其他动态仿真求解器相同:计算下一个仿真步骤的状态向量,使用来自当前步骤的信息和模型方程计算的导数(在 DASSL 的情况下)和其他一些,DASSL 的未来值使用隐式的 BDF 算法,例如参见此处)。

DASSL 的一个特别之处(虽然不是唯一的)是 DASSL 有两个可以在模拟过程中使用的接口:它可以处理系统的 ODE 描述(在它被转换后,例如通过 Dymola 的符号预处理) 或者它可以使用 DAE 描述(通过设置Advance.Define.DAEsolver=true;)。默认使用 ODE 接口。两者都有优点,Dymola 手册指出:

启用 DAE 求解器后,模型的输出和动力学部分中的方程不会在调用模型期间求解。它们由积分器作为非线性方程组的一部分由积分器处理,积分器每步求解该方程组。如果转换后的模型包含多个或大型非线性方程系统,则 DAE 求解器可能更有效,因为求解的非线性系统较少。


回答

使用Pantelides算法进行索引归约和分区后,我可以用牛顿法求解方程,但为什么Dymola必须再次进行分区并使用DASSL算法?

简单的答案是:它不必进行额外的分区或使用 DASSL。您只需单击几个按钮并将算法更改为 cvode、Runge-Kutta、Euler 等。我有点不确定,但我认为 Dymola 不会在 ODE 模式下对 DASSL 进行任何额外的分区(我肯定知道OpenModelica 的 DASSL 算法没有 - 尽管使用 DAE 求解器来求解 ODE 系统有点愚蠢)。如果您在 DAE 模式下运行模拟,您甚至可以跳过索引减少(取决于系统的索引)。

积分法(如dassl)所做的实际上是对系统时间进行逐时求解。Pantelides 算法所做的是减少索引(在 Modelica 工具中通常为 ODE 形式,这是大多数集成方法所需要的)。


以上是在Dymola中解决DAEs,为什么在执行Patelides算法后使用DASSL算法?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>