尽管方程可能是 Modelica 中最重要的数学方面,但它们也是最容易解释的。
基本方程
关于方程其实没有什么复杂的语义需要解释。所有方程都由等号分隔的左表达式和右表达式组成,即
<left-hand expression> = <right-hand expression>;
通过本章所举的示例,读者在每个示例中都反复接触到了这种模式。唯一真正偏离上述语法的情况是,有时还会包含对等式的描述,例如:
V = i*R "Ohm's law"; m*der(v) = F "Newton's law";
正如之前所指出的,在 Modelica 中方程的左、右两边都是表达式,而非赋值。换句话说(与大多数编程语言不同),左边不必是变量(正如我们在上面牛顿定律的例子中所看到的那样)。
初始方程
正如我们在本章的许多示例中所看到的那样,在模型中可以指定一些方程来用于求解初始条件。初始化这一整个主题将在下一节(名为“初始化”)中详细讨论。目前,关于这个主题我们仅能说,如果一个方程仅用于求解初始条件,那么该方程部分必须通过“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 个),但哪个方程可以变化。这一点很重要,因为在 Modelica 中模拟一个模型时,变量的数量必须与方程的数量相等,并且在模拟过程中方程的数量必须保持固定。
另一种类型的条件方程是那些方程数量不均衡的情况。这意味着“如果”一侧的方程数量可能与“否则”一侧的方程数量不同(就像之前在均衡情况下那样)。
但请记住,在模拟过程中,方程的数量是不能改变的。那么,为什么从“如果”一侧到“否则”一侧的方程数量会有所不同呢?这只能是因为条件表达式的值在模拟过程中不能发生变化。为了确保条件表达式永远不会改变,就必须保证条件表达式中的所有变量都具有所谓的参数变异性。
在我们关于“可变性”的讨论中,有没有提到过这样一个事实:带有参数限定符的变量在模拟过程中是不能发生变化的?如果带有参数限定符的变量在模拟过程中不能变化,并且表达式中的所有变量都具有这种参数可变性,那么整个表达式也必须具有参数可变性(也就是说,表达式的值在模拟过程中不能发生变化)。
此时,您可能会自问这样一个不平衡的案例为何会有用处?这里我们还是有点操之过急了,不过其中一个应用场景是条件性地应用初始方程,例如:
.. parameter Boolean steady_state; initial equation if steady_state then der(x) = 0; der(y) = 0; ..
换句话说,如果布尔参数“steady_state”为真,那么初始方程就会被执行。但如果该参数为假,则这些方程将不会被执行。这里的条件表达式显然具有参数的可变性,因为该表达式仅包含一个变量,而这个变量就是参数。
关于这个话题我们就先说到这里吧,因为离散和条件行为将在下一章中进行详细论述。