5

我对 Modelica 中的混合建模范式感到困惑。一方面,事件是有用的,另一方面,它们是要避免的。让我解释一下我的情况:

我有一个大型模型,由一个社区中的多个建筑物组成,模拟了 1 年多。最初,模型运行非常缓慢。在尽可能多的 if 条件周围添加 noEvent() 极大地提高了速度。

随着开发的继续,模型的控制变得更加复杂,我又遇到了很多事件,有时间隔很短。给出一个想法:

Number of (model) time events : 28170
Number of (U) time events     : 0
Number of state    events     : 22572
Number of step     events     : 0

这些事件会破坏输出(为了正确的后处理,我需要事件中的变量)并减慢模拟速度。而且,我感觉某些 noEvent(if...) 会导致意外行为。

我想知道在某些时间步强制我的事件并在这些时间步之间禁止它们是否是一种解决方案?理想情况下,我想根据某些条件触发这些“强制事件”。例如:白天他们应该每 15 分钟一次,每分钟都在高太阳辐射下,晚上我根本不想要事件。

这是个好主意吗?我想这会更快,因为许多状态事件将成为时间事件?如何使用 Modelica 3.2(在 Dymola 中)做到这一点?

预先感谢所有答案。罗尔

4

1 回答 1

6

几点评论。

首先,如果您有一个包含大量事件的模拟(相对于模拟的总持续时间),我鼓励您做的第一件事是使用低阶积分器。这里的要点是,高阶积分器通常允许您采取更长的时间步长。但是,如果这些步骤不断被事件截断,它们最终会变得非常昂贵。

其次,您可以尝试固定步长积分器。根据工具的不同,他们可能会在固定时间步长积分器的上下文中实现这种“池事件并立即触发它们”的方法。但是规范并没有真正说明工具应该如何处理在固定时间步之间发生的事件。

第三,解决此问题的另一种方法是自己“汇集”您的事件。我能想到的最简单的方法是获取当前生成事件的所有语句并将它们包装在“when sample(...,...) then”语句中。这样,您可以确保仅在特定时间间隔触发事件。这将比固定时间步长方法更便携。我认为这是您在问题中实际提出的,但重要的是要指出它不应该基于时间步长(模型没有时间步长的概念),而是基于模型指定的采样间隔(这将,在实践中,完全独立于时间步长)。

正如您所指出的,使用“sample(...,...)”会将这些转换为时间事件,是的,这应该更快。

于 2012-11-16T19:39:35.237 回答