事件¶
在关于基本方程的第一章里,我们看到了描述连续行为的例子。在该章中介绍的方程在任何时候都有效,而且这些方程的解总是连续的。在本章中,我们讨论了Modelica语言用以描述离散行为的种种方法。事件导致所有Modelica内离散行为的根本原因。
条件表达式¶
事件的产生有以下两种可能。首先,时间可以用条件语句产生。在本章的前面几例,我们看到了条件表达式可以触发事件。倘若这些条件表达式仅仅涉及变量time
,我们就将其成为“时间事件”。变量time
是一个内建的全局变量,而且是所有模型的“输入”。
如果事件是由涉及解内变量的条件表达式产生的,我们就将其成为“状态事件”。时间事件和状态时间的重要区别在本章内的第一个例子以及第二个例子中分别作了讨论。
创建条件表达式可以使用关系运算符(>
、>=
、<
、<=
、==
)以及逻辑运算符(not
、and
、or
)。而正如我们在事件的抑制的讨论结果,我们可以在条件表达式外加上noEvent
运算符以抑制其事件的生成。
通常情况下,产生事件的条件表达式出现在一个if
语句或if
表达式的里面。但也应注意的是,即使是简单的变量赋值,例如:
Boolean late;
equation
late = time>=5.0 "This will generate an event";
也可以触发事件的产生。
分段构造¶
处理条件表示式时有一种特殊情况。在某些情况下,条件表达式是一种有效的创建构造分段表达式的方法。例如:
x = if (x<0) then 0 else x^3;
It is hard for a Modelica compiler to reliably determine that such a
function is continuous and has continuous derivatives. For
this reason, Modelica includes the smooth
operator to explicitly
express such conditions. For example, using the smooth
operator
as follows:
x = smooth(if (x<0) then 0 else x^3, 2);
indicates that the expression is continuous as is and will remain continuous if differentiated up to 2 times because
Hence, the function, its first and second derivatives are continuous at \(x=0\), but the third derivative is discontinuous.
Note that the smooth
operator requires an upper bound
to be specified.
事件与函数¶
除了由条件表达式生成,事件还可以通过Modelica内的某些函数产生。
事件生成的函数¶
以下是当其返回值不连续是就会产生事件的函数的列表。
函数 |
描述 |
div(x,y) |
省去小数部分的代数商。 |
mod(x,y) |
|
rem(x,y) |
代数除法的余数 |
ceil(x) |
不小于 |
floor(x) |
不大于 |
integer(x) |
不大于 |
initial() |
初始化时为 |
terminal() |
仿真结束时为 |
sample(t0,dt) |
在 |
edge(x) |
仅在 |
change(x) |
每当 |
不会产生事件的函数¶
以下是不会产生事件的函数的列表。
函数 |
描述 |
abs(x) |
|
sign(x) |
|
sqrt(x) |
|
min(x,y) |
|
max(x,y) |
|