控制混合Modelica模型中的事件

时间:2012-11-15 10:15:44

标签: simulation modelica

我对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(如果......)会导致意外行为。

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

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

事先感谢所有答案。 罗埃尔

1 个答案:

答案 0 :(得分:5)

一些评论。

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

其次,您可以尝试固定步骤集成商。根据工具的不同,他们可以在固定时间步长积分器的环境中实现这种“池事件并一次性触发它们”。但是规范并没有真正说明工具应该如何处理固定时间步之间发生的事件。

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

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