但经过这一切之后,我们仍不清楚如何避免我们在“ Decay1”和“Decay2”模型中所遇到的问题。答案是一个名为“noEvent”的特殊操作符。这个“noEvent”操作符会抑制这种特殊的事件处理。相反,它会按照大多数用户原本预期的方式进行操作,即对
x 的每个值都评估条件表达式。在以下模型中,我们可以看到“noEvent”操作符的实际应用:
这种模型会产生一种被称为“抖动”的效应。抖动指的是由于大量事件的发生导致模拟性能下降的现象,这些事件人为地缩短了解算器所采用的时间步长。如果我们查看模拟过程中的
CPU 使用时间,就会清楚地看到其影响。一旦 x 接近 1,CPU 使用时间就会急剧上升。这是因为幕后发生的事件会引发大量极短的时间步长,从而极大地增加了所进行的计算量。关于“WithChatter”示例的重要之处在于,它似乎有明显的数学解决方案,但由于事件的高频率,仍然会受到模拟性能下降的影响。
modelWithEvents"Integrate with events"parameterRealfreq=1.0;Realx(start=0);Realy=time;equationder(x)=ifsin(2*Modelica.Constants.pi*freq*time)>0then2.0else0.0;endWithEvents;
观察这个系统,我们可以发现,x 的导数一半时间是 2,另一半时间则是
0。因此,在每个这样的周期内,x 的平均导数应该是 1。这意味着在每个周期结束时,x 和 y
应该相等。
如果我们对“具有事件处理功能的控件”模型进行模拟,将会得到以下结果:
请注意,在每个周期结束时,x 和 y 的轨迹会交汇在一起。这直观地表明了底层积分的准确性。即使我们增加底层周期的频率,我们也会发现这一特性依然成立:
modelWithNoEvents"Integrate without events"parameterRealfreq=1.0;Realx(start=0);Realy=time;equationder(x)=noEvent(ifsin(2*Modelica.Constants.pi*freq*time)>0then2.0else0.0);endWithNoEvents;