Dymola求解器介绍

Dymosim是一个独立的程序,用于Dymola的求解,可以通过命令“dymosim”或“dymosim dsin.txt dsres.mat”执行模拟。在这两种情况下,模拟运行都是通过读取输入文件dsin.txt来执行,并将仿真结果存储在dsres.mat二进制文件中。Dymosim提供了许多积分算法,下面将介绍这些算法的特点以及适用对象,但谨记,不应该只依赖一种算法进行仿真实验,相反,应该用两三种不同的算法去检验结果。

积分器的属性

Relative and absolute error tolerances

每一步必须满足

| local error |<RelativeTolerance*|xi|+AbsoluteTolerance

Global error

全局误差是初始值问题的真解与计算近似值之间的差值。大部分情况下只控制每一步的local error,不直接控制global error. 一般来说,被计算的时变量精确性是与RelativeTolerance有关,大的tolerance值会带来比较准确的结果。

Step consideration

one-step vs muti-step

one-step算法在每一步都重新开始,因此相比于muti-step算法(lsodar,dassl),一个event结束后的重新启动时间缩短。

Variable step size, dense output

大多数积分算法都具有可变步长算法,在每一步,算法会估计local error,积分步长的选择依据是使local error比由RelativeTolerance和AbsoluteTolerance定义的最大期望local error小。
固定步长算法则不考虑tolerance,步长固定,由输出时间网格给定。输出时间网格由开始时间、结束时间、输出网格的尺寸确定,结果保存在网格点中。这些算法就一个点一个点的推进,最大步长不能超过两个点之间的距离。这种算法在定义输出网格时要谨慎,为了不引起稳定性问题,应该定义比较小的固定步长,输出步长是这些固定步长乘以倍数。
还有密集输出算法,这种算法的步长选择是依需要的tolerance和估计的local error,积分时会经过期望的输出点,通过插值决定输出点的时变量,不需要评估差分方程,意味着它可以高效的处理状态事件,并产生均匀的空间输出。在Dymosim的输入文件中可以通过algorithm(hmax)设置密集输出算法的最大允许步长。

Variable order

积分算法内部用一个阶数为k的多项式来近似时变量x(t),一些算法采用固定的阶数,一些采用在仿真中变化的阶数。固定阶数的算法在设置时就可手动选择,高阶数意味着更严格的tolerance,而像dassl,Isodar这种变阶数的算法则会在仿真中自动的调整阶数。
对于相同的最大local error,如果阶数高,则可以选择较大的步长,取得更高的效率。如果预知系统的结果不是特别光滑,则应选择低阶的算法。在Dymosim的输入文件中可以通过algorithm(ordmax)设置最高阶数,如果设为1,则变阶数的积分算法就会降为简单的欧拉方程。

Stiff systems, A-stable algorithms

在用微分方程描述的一个变化过程中,若往往又包含着多个相互作用但变化速度相差十分悬殊的子过程,这样一类过程就认为具有“刚性”。描述这类过程的微分方程初值问题称为“刚性问题”。例如,宇航飞行器自动控制系统一般包含两个相互作用但效应速度相差十分悬殊的子系统,一个是控制飞行器质心运动的系统,质心运动惯性较大,因而相对来说变化缓慢;另一个是控制飞行器运动姿态的系统,由于惯性小,相对来说变化很快,因而整个系统就是一个刚性系统。
算法的步长一般会受其特定的稳定边界的限制,只有在边界内,积分才是稳定的,并产生可靠的结果。如果一个系统采用非刚性算法,积分算法限制在稳定边界内,而不是最大local error,这个系统就是刚性的,这也意味着非刚性算法选择的步长比较小,导致积分效率相应的退化。
然而请注意,系统的刚性与否取决于选择的error tolerance,如果tolerance更为严格,系统就会成为非刚性,这是因为步长是受最大local error限制而不再是稳定边界。
一些刚性算法被设计为A-stable,即对于稳定的线性系统都是稳定的,这意味着它们适合于低阻尼的刚性系统,另外,它们一般以高阶开始,所以适合于不连续系统或事件。

Dymosim的变步长积分算法

在这里插入图片描述

固定步长算法

在这里插入图片描述

如何选择算法

如果模型不包括许多事件:1)模型在某些时刻是刚性的,在某些时刻是非刚性的,则可使用传统的LSODAR算法;2)DASSL算法
如果模型包括许多事件,使用Single-step算法:1)非刚性,使用Cerk和Dopri;2)RadauIIa, Esdirk 和Sdirk 算法

Sparse solver

如果系统足够大,足够零散,在编译时会自动提示以下信息
在这里插入图片描述
为了激活sparse solver,设置Advanced.SparseActivate=true(默认false),并从Cvode、RadauIIa、 Esdirk23a, 34a, 45a、Sdirk34hw中选择算法

来源于Dymola User Manual Volume1 5.4

猜你喜欢

转载自blog.csdn.net/yangguangdblu/article/details/83999575