Modelica 中的 noEvent 运算符不使用迭代来查找触发事件的精确时刻。
看来这会导致计算错误,这是我在以下网站上找到的示例https://mbe.modelica.university/behavior/discrete/decay/那么使用noEvent操作符时是否必须保证功能流畅呢?
如果不能保证准确性,使用 noEvent 运算符的目的是什么?
虽然问题已经得到解答,但我想补充一些要点,因为我认为这对很多人来说都是有用的。
有一些常见的原因需要使用noEvent()
陈述:
保护表情:这用于防止函数在其有效范围之外进行评估。一个典型的例子是der(x) = if x>=0 then sqrt(x) else 0;
这在大多数常见的编程语言中都能完美运行。这在 Modelica 中并不总是有效,原因如下: 当搜索满足条件的时间时x>=0
变为 false,则两个分支可能都用以下值进行评估x
在 0 左右变化。 Marvel 发布的屏幕截图中提到了同样的事实。如果负数的平方根,这会导致崩溃x
被评估。所以der(x) = if noEvent(x>=0) then -sqrt(x) else 0;
用于抑制迭代以搜索交叉时间,将不连续性的处理留给求解器(通常称为“按字面意思取表达式而不是生成交叉函数”)。如果使用可变步长求解器,这会使求解器减小步长以满足其相对误差容限,这可能会导致性能下降。此外,如果所描述的函数不够平滑,导致模拟不精确甚至不稳定,那么这可能是至关重要的。
连续表达式:当函数连续时,实际上不需要事件。这归结为以下事实:事件用于描述不连续性。因此,如果没有,通常该事件就是多余的,因此可以被抑制。这实际上是由smooth()
Modelica 中的运算符,但规范指出,该工具仍然可以自由生成事件。根据我的经验,如果功能的更改相对较大,工具会生成事件。因此,有一个有意义的noEvent()
在一个smooth()
.
避免喋喋不休: noEvent
可以在这里提供帮助,但实际上喋喋不休是一个更普遍的问题。因此,我建议通过重新构建模型来解决与抖动相关的问题。
如果以上都不成立,则使用noEvent
应仔细考虑。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)