方程

尽管方程可能是Modelica语言中唯一最重要的数学方面的体现,但是它仍然是最易于解释的。

基本方程

关于方程真的没有复杂的语义需要解释。所有的方程都是由左边一个表达式和右边一个表达式组成,中间被等号隔开。例如:

<left-hand expression> = <right-hand expression>;

通过本章中的实例,读者可以反复接触每个例子中的这种格式。上面展示的唯一真实存在的语法偏差是关于方程的描述应该如下,例如:

V = i*R "Ohm's law";
m*der(v) = F "Newton's law";

正如我们先前指出的那样,在Modelica语言中,方程的左边和右边是表达式,而不是赋值。换句话说(对比大多数的程序语言),方程的左边一定要包含变量(正如上面牛顿第一定律中看到的那样)。

初始方程

正如在本章中看到的许多例子一样。在一个模型中指定方程用于求解初始状态是可能的。关于初始化的整个主题将会在下章中详细讨论,标题就是初始化目前在本章中要说的是如果方程仅仅用于求解初始化,equation区域必须冠以initial(初始)关键词。

initial equation
  x = 0; // Only used to solve for initial conditions

带条件的方程

下一章将讨论如何应用if(如果)命令表示有条件的行为。值得提前指出的是方程可以是有条件的。条件方程有两种形式。第一种是平衡形式。例如:

if a>b then
  x = 5*time;
else
  x = 3*time;
end if;

在平衡的情况下,方程的数量总是一致的(上述代码中都为1)。但是要使用哪条方程这点可以改变。这个很重要,因为要在Modeliaca中模拟一个模型,变量的数量必须等于方程的数量。而且,在模拟的过程中方程的数量必须是固定的。

另外一种条件方程的类型是方程的数量是不平衡的。这意味着方程的数量在ifelse的两侧可能是不相等的(不像此前的平衡情况那样)。

但是请记得,方程的数量在模拟过程中不能改变。那么是如何做到ifelse两侧的方程数量是不同的呢?只有一种情况模拟过程中条件表达式的值不能改变。为了确保条件表达式永不改变,条件表达式中所有的变量必须拥有所谓的参数级别的可变性

还记得讨论可变性的时候,带有parameter(参数)限定词的变量在模拟过程中不能改变的事实吗?如果带有parameter(参数)限定词的变量在模拟过程中不能改变,且表达式中的所有变量都拥有这个参数级别的可变性,那么整个表达式一定也拥有参数级别的可变性(亦即表达式的值在模拟过程中不能改变)。

关于这个问题,你一定会质疑,这种不平衡的情况有用吗?再次提前指出,其中一种应用是在带条件的初始方程,例如:

..
  parameter Boolean steady_state;
initial equation
  if steady_state then
    der(x) = 0;
    der(y) = 0;
..

换句话说,如果布尔参数steady_state(稳定状态)为真,那么初始方程是有效的。但是如果参数为假,它们就无效。这里的条件表达式具有参数级别的可变性是因为,表达式仅仅包含一个变量,而这个变量是个参数。

这些就是本节所要讨论的,离散和有条件的行为将在下一章中讨论