当来自使用命令式语义的语言和系统时,这是一个可以理解的混淆点。但是 Modelica 不是这样工作的。
使用 Modelica 时,重要的是要了解一个equation
部分包含方程式,而不是分配。考虑一下,如果我给你以下等式:
x + y = 3;
x + 2*y = 5;
如果您了解这是一个数学上下文,那么您可以确定它x
的值必须为 1 且y
必须为 2。换句话说,您必须求解联立方程组。您会注意到,这些等式的左侧不是变量(通常),它们是表达式。等式只是将左侧的一个表达式与右侧的另一个表达式相等的关系。此外,这种关系总是正确的,因此顺序无关紧要。
这与具有命令式语义的命令式编程语言完全不同。但它也非常强大,因为您可以说明这些关系(线性方程组、非线性方程组、隐式方程等),编译器将找出解决它们的最有效方法。
回到您的示例,当您查看问题中的代码时,您将这些方程式解释为赋值语句。这个概念得到了加强,因为它们恰好在左侧有变量。但它们确实是方程式。在基于方程的系统中,您不必担心给定变量是否已被分配给先前。相反,要求只是对于每个变量都存在(某处)一个方程,并且没有额外的方程。换句话说,您应该具有与未知数相同数量的变量,并且方程组具有唯一解。这就是 Modelica 所需要的。
现在,Modelica 支持您习惯的那种命令式语义。但它们只能在特殊情况下使用,因为它们限制了数学行为的解释,从而干扰了允许 Modelica 编译器生成真正快速代码的符号操作。所以这不仅仅是风格的问题。如果可能的话,你应该使用方程,Modelica 中的算法只能作为最后的手段。
最后一点。有些人可能想知道“你是在告诉我,这些方程将被放入一些巨大的方程组中,并通过矩阵求逆或 Newton-Raphson 之类的方法来求解?当它显然可以用更简单的方法求解时,为什么要让它变得如此复杂? !” 但它不会作为一个巨大的方程组来解决。如果它可以作为一组简单的作业来解决,它将. 这是将应用的不同符号操作技术中的一种(在众多技术中)。其实这是Modelica的一个关键点……你不用担心优化求解方法,这个工具会搞定的。更重要的是,如果您以确实出现同时系统的方式连接组件,您也无需担心这一点。Modelica 工具可以为您处理此类“代数循环”,它们将对其进行优化以找到计算效率最高的公式,并且不会依赖于您针对这些情况重新制定模型。
这有帮助吗?