什么会影响Modelica中的仿真运行时间
为了使我在 Modelica 中的模型模拟运行得更快,我问以下问题:Modelica 中的模拟运行时间有什么影响?
我会感谢任何可能的帮助。
回答
编辑:更多细节可以从我的书“Modelica by Application - Power Systems”(URL)中查阅
什么会影响运行时性能?
一、应用编译技术
自然地,面向对象的 Modelica 模型,即使是微不足道的模型,也会对应于大型方程组。Modelica 仿真环境通常会优化此类生成的模型:
- 通过删除琐碎的方程(即别名方程)来减少可能方程的数量
- 用所谓的 BLT 变换将大块方程组分解为更小的级联方程组块,这些方程组可以以顺序方式更快地求解,而不是作为单个方程块,
- 使用撕裂方法解决 sc 大代数环。
- 理论上它甚至可以走得太远,如果可能的话,尝试以解析的方式求解方程组块,而不是进行昂贵的数值积分
因此,运行时性能将受到底层 Modelica 编译器的影响,以及它利用基于方程的编译器方法的程度。通常需要激活一些额外的设置来利用所有可能的此类技术。需要挖掘文档以启用此类设置。
二、模型的性质
模型的性质会影响运行时性能,特别是:
- 该模型是一个大规模系统吗?还是小规模的?
- 它是强非线性还是半线性的?
- 得到的优化方程系统对应于模型是稀疏的(即每个具有少量变量的大型方程组,例如电力系统网络模型)还是密集的(例如多体系统和生化网络)
- 它是一个僵硬的系统吗?(例如,具有多个子系统的系统,一些表现出非常快的动态,而另一些表现出非常缓慢的动态)
- 系统是否表现出大量的状态事件
- ...
三、求解器的选择
给定模型的上述特征通常会影响求解器的理想选择。求解器可以在很大程度上影响运行时性能(和准确性)。可以按以下顺序制定求解器选择策略:
-
对于非刚性弱非线性模型,理想的选择是显式方法,例如单步 Runga-Kutta 或高阶多步 Adam-Bashforth。如果准确性不那么重要,可以尝试一种执行速度更快的低阶显式方法。自然,增加求解器误差容限也会加快模拟速度。
-
然而,可能会发生,特别是对于大型系统,数值稳定性可能更难以保证。然后,应该尝试显式求解器的较小求解器步长(和/或较小的误差容限)。在这种情况下,容错较大的隐式求解器可以与容错较小的显式求解器相媲美。
实际上,明智的做法是同时尝试这两种方法,比较结果的准确性,并确定显式方法是否产生相对准确的结果。但是,作为警告,这只是一种启发式方法,因为系统不一定在整个可允许参数值空间上具有相同的行为。
-
为了增加模型的非线性,选择将更倾向于使用可变步长技术的现代求解器。在这里,我将从隐式可变步长 Runga-Kutta(即单步)和/或隐式可变步多步方法 Adams-Moulton 开始。对于这两个类别,可以扩大求解器容差和/或降低求解器错误顺序,并确定模拟是否产生了相对准确的解决方案(但运行时间更快)。
-
前几类方法的实现通常在误差控制方面不太保守,因此,为了增加模型的刚度或可扩展性差的模型,选择将更倾向于实现所谓的数值更稳定的后向微分公式 (BDF) 的现代求解器,sa DASSL,CVODE,IDA。这些求解器(可以)还利用系统的 sc Jacobian 进行自适应步长控制。
-
如果人们不知道关于模型行为的那么多信息,像 LSODAR 这样的现代求解器可以在显式和隐式求解器之间切换并执行自动错误顺序控制(在不同顺序之间切换)是一个不错的选择。可能某些 Modelica 环境具有使用自动切换的高级求解器。但是,如果事先知道模型的行为,那么使用其他建议的方法也是明智的,因为 LSODAR 在需要时可能无法执行最佳切换。
X。...
3,4 类和 5 类求解器之间的比较并不容易判断,还取决于系统是连续的还是混合的,即底层的寻根算法。
通常 DASSL 可能会更慢,因为它在步长/误差控制方面更加保守。所以看起来IDA等的速度更快。一些已发表的作品可以提供有关此类比较的一些直觉。最好有一个 Modelica 库,包括所有可能的模型类型,并运行所有可能的基准测试,包括准确性和运行时间,以得出更多求解器/模型特定的结论。可以为此目的使用和扩展的库是ScalableTestSuite Modelica 库。
四、进阶方面
-
Modelica 社区已经发表了一些关于使用稀疏求解器来利用雅可比矩阵的预期稀疏性的作品。如果仿真环境提供了这样的功能,通常会显着提高大型模型的运行时性能。
-
对于具有大量事件的模型,以标准方式进行数值积分可能非常低效。特别具有挑战性的是,当一个事件被触发时,可以进一步触发其他状态事件集,并且应该评估状态事件队列。寻根算法可能会进一步触发其他事件,并且求解器可能会在 sc 颤抖的情况下继续运行。对于这种情况有高级策略,sc 滑动模式,但是我不确定 Modelica 模拟环境在多大程度上解决了这个问题。
-
一组建议的解决方案(也适用于具有高刚度的系统)是采用所谓的 QSS(量化状态系统)方法。这对于无法使用显式求解器求解的模型尤其有益。有显式和隐式 QSS 方法。还有其他值得一试的数值积分策略,其中在逼近状态事件时仅评估整个方程组的子集。在这里,我不确定此类求解器的可用性。
-
一些仿真环境区分两种可能影响仿真运行时间的仿真模式:ODE 模式和 DAE 模式。在第一种模式中,系统被简化为 ODE 系统,其中可能具有额外的非线性方程组级联块。在 DAE 模式下,系统被简化为索引为 1 的 DAE 系统。前一种模式将有利于显示出使用 sc 撕裂方法而不是数值积分来求解的大型级联非线性方程块的密集系统。DAE 模式将有利于使用稀疏求解器求解的大规模稀疏系统。我认为 ODE 模式通常通过选择 CVODE 或 LSODAR 激活,而 DAE 模式通过选择 IDA 或 DASSL 激活。但是也建议在这里和那里挖掘文档。
-
还有一些关于所谓的多速率数值积分求解器的已发表作品。这里,在每个数值积分步骤中,仅积分方程系统的数值重要部分,而不是整个方程系统。因此,这对大规模刚性系统非常有益。
X。...
五、并行化
显然,利用多核/GPU 并行执行数值积分,以及应用并行化的其他方法可以加快计算速度。
六、非常非常高级的话题
为了关注一些优秀的研究尝试,其中一些可用于加速大规模(松耦合)混合网络模型的仿真运行时性能,我也在这里列出。通过使用混合范式、基于代理的建模范式和/或多模式范式,可以获得加速。背后的想法是可以在几个较小的子系统中描述一个松散耦合的系统,并仅在必要时进行子系统之间的通信。这可能是有益的,并且可以通过搜索相关出版物来追踪原因。在提到的一些方向上已经有一些出色的工作,如果是这种情况,值得在他们停止的地方继续他们。
备注:上述任何求解器不一定存在于所有可能的 Modelica 仿真环境中。如果没有提供求解器作为选择,人们仍然可以生成 FMU-ME(用于模型交换的功能模型单元)并编写代码,将该 FMU 与所需的求解器进行数值集成。
警告:上述某些方面基于特定类型模型的个人经验,不一定适用于所有模型类型。
很少有人推荐阅读,我肯定错过了很多重要的出版物:
- F. Casella,Modelica 中大型模型的模拟:最新技术和未来展望,Modelica 2016
- Liu Liu、Felix Felgner 和 Georg Frey,用于刚性和混合系统仿真的 4 种数值求解器的比较,2010 年会议
- Willi Braun、Francesco Casella 和 Bernhard Bachmann,解决大型 Modelica 模型:使用 OpenModelica 的新方法和实验结果,Modelica 2017
- Erik Henningsson、Hans Olsson 和 Luigi Vanfretti,大型混合模型的 DAE 求解器,Modelica 2019
- Tamara Beltrame 和 François Cellier,使用 DEVS 形式主义在 Dymola/Modelica 中量化状态系统模拟,Modelica 2006
- Victorino Sanz、Federico Bergero 和 Alfonso Urquia,使用 Modelica 进行基于代理的建模方法,Simpra 2010