事件

在关于基本方程的第一章里,我们看到了描述连续行为的例子。在该章中介绍的方程在任何时候都有效,而且这些方程的解总是连续的。在本章中,我们讨论了Modelica语言用以描述离散行为的种种方法。事件导致所有Modelica内离散行为的根本原因。

条件表达式

事件的产生有以下两种可能。首先,时间可以用条件语句产生。在本章的前面几例,我们看到了条件表达式可以触发事件。倘若这些条件表达式仅仅涉及变量time,我们就将其成为“时间事件”。变量time是一个内建的全局变量,而且是所有模型的“输入”。

如果事件是由涉及解内变量的条件表达式产生的,我们就将其成为“状态事件”。时间事件和状态时间的重要区别在本章内的第一个例子以及第二个例子中分别作了讨论。

创建条件表达式可以使用关系运算符(>>=<<===)以及逻辑运算符(notandor)。而正如我们在事件的抑制的讨论结果,我们可以在条件表达式外加上noEvent运算符以抑制其事件的生成。

通常情况下,产生事件的条件表达式出现在一个if语句或if表达式的里面。但也应注意的是,即使是简单的变量赋值,例如:

  Boolean late;
equation
  late = time>=5.0 "This will generate an event";

也可以触发事件的产生。

分段构造

处理条件表示式时有一种特殊情况。在某些情况下,条件表达式是一种有效的创建构造分段表达式的方法。例如:

x = if (x<0) then 0 else x^3;

Modelica编译器很难可靠地确定函数是否连续,或者函数是否有连续导数。出于这个原因,Modelica自带了smooth操作符用以明示这种情况。例如,用以下形式使用smooth运算符:

x = smooth(if (x<0) then 0 else x^3, 2);

表示该表达式是连续的,而且在两次微分后仍将保持连续。

\[\begin{split}x' & = \begin{cases} 0, & \text{for } x < 0, \\ 3 \, x^2, & \text{otherwise,} \end{cases} \\ x'' & = \begin{cases} 0, & \text{for } x < 0, \\ 6 \, x, \phantom{^2} & \text{otherwise,} \end{cases} \\ x''' & = \begin{cases} 0, & \text{for } x < 0, \\ 6, \phantom{6 \, ^2}& \text{otherwise.} \end{cases}\end{split}\]

因此,函数的第一及第二阶导数在\(x=0\)处连续,但第三阶导数则不连续。

注意smooth操作符需要指定一个可导次数的上界。

事件与函数

除了由条件表达式生成,事件还可以通过Modelica内的某些函数产生。

事件生成的函数

以下是当其返回值不连续是就会产生事件的函数的列表。

函数

描述

div(x,y)

省去小数部分的代数商。

mod(x,y)

x/y的模数

rem(x,y)

代数除法的余数

ceil(x)

不小于x的最小整数

floor(x)

不大于x的最大整数(返回Real

integer(x)

不大于x的最大整数(返回Integer

initial()

初始化时为true,否则为false

terminal()

仿真结束时为true,否则为false

sample(t0,dt)

t0时刻以及以后的每dt秒生成一个事件

edge(x)

仅在x变为true的一瞬间为true

change(x)

每当x改变时为true

不会产生事件的函数

以下是不会产生事件的函数的列表。

函数

描述

abs(x)

x的绝对值

sign(x)

x的符号(返回-1、0或1 )

sqrt(x)

x的平方根

min(x,y)

xy中的最小值

max(x,y)

xy中的最大值