3

刚开始使用 Modelica 并无法理解它是如何工作的。

在下面的模型“方法”中,第二行使用 qInflow 和 qOutflow 来评估 der(h),但它们还没有收到值!(它们没有在方法的“数据”中定义)?代码执行的顺序是什么。

equation
 assert(minV >= 0, "minV must be greater or equal to zero");
 der(h)=(qInflow - qOutflow)/area;
 qInflow=if time > 150 then 3*flowLevel else flowLevel;
 qOutflow=Functions.LimitValue(minV, maxV, -flowGain*outCtr);
 error=ref - h;
 der(x)=error/T;
 outCtr=K*(error + x);
end FlatTank;      

来自http://www.mathcore.com/resources/documents/ie_tank_system.pdf

4

2 回答 2

5

当来自使用命令式语义的语言和系统时,这是一个可以理解的混淆点。但是 Modelica 不是这样工作的。

使用 Modelica 时,重要的是要了解一个equation部分包含方程式,而不是分配。考虑一下,如果我给你以下等式

x + y = 3;
x + 2*y = 5;

如果您了解这是一个数学上下文,那么您可以确定它x的值必须为 1 且y必须为 2。换句话说,您必须求解联立方程组。您会注意到,这些等式的左侧不是变量(通常),它们是表达式。等式只是将左侧的一个表达式与右侧的另一个表达式相等的关系。此外,这种关系总是正确的,因此顺序无关紧要。

这与具有命令式语义的命令式编程语言完全不同。但它也非常强大,因为您可以说明这些关系(线性方程组、非线性方程组、隐式方程等),编译器将找出解决它们的最有效方法。

回到您的示例,当您查看问题中的代码时,您将这些方程式解释为赋值语句。这个概念得到了加强,因为它们恰好在左侧有变量。但它们确实是方程式。在基于方程的系统中,您不必担心给定变量是否已被分配给先前。相反,要求只是对于每个变量都存在(某处)一个方程,并且没有额外的方程。换句话说,您应该具有与未知数相同数量的变量,并且方程组具有唯一解。这就是 Modelica 所需要的。

现在,Modelica 支持您习惯的那种命令式语义。但它们只能在特殊情况下使用,因为它们限制了数学行为的解释,从而干扰了允许 Modelica 编译器生成真正快速代码的符号操作。所以这不仅仅是风格的问题。如果可能的话,你应该使用方程,Modelica 中的算法只能作为最后的手段。

最后一点。有些人可能想知道“你是在告诉我,这些方程将被放入一些巨大的方程组中,并通过矩阵求逆或 Newton-Raphson 之类的方法来求解?当它显然可以用更简单的方法求解时,为什么要让它变得如此复杂? !” 但它不会作为一个巨大的方程组来解决。如果它可以作为一组简单的作业来解决,它将. 这是将应用的不同符号操作技术中的一种(在众多技术中)。其实这是Modelica的一个关键点……你不用担心优化求解方法,这个工具会搞定的。更重要的是,如果您以确实出现同时系统的方式连接组件,您也无需担心这一点。Modelica 工具可以为您处理此类“代数循环”,它们将对其进行优化以找到计算效率最高的公式,并且不会依赖于您针对这些情况重新制定模型。

这有帮助吗?

于 2012-06-13T12:50:34.297 回答
1

在对 Modelica 模型运行 Modelica 工具之前,您无法知道方程在 Modelica 模型中的执行顺序(您可以对源模型中的任何方程重新排序并获得相同的结果)。然后该命令仅适用于具有您使用的设置的此工具。

这是 OpenModelica 编译器选择的顺序 (omc +s +simCodeTarget=Dump model.mo):

error = ref - h;
outCtr = K * (error + x);
der(x) = DIVISION(error, T, #SHARED_LITERAL_2(String#);
qOutflow = LimitValue(minV, maxV, (-flowGain) * outCtr);
qInflow = if time > 150.0 then 3.0 * flowLevel else flowLevel;
der(h) = DIVISION(qInflow - qOutflow, area, #SHARED_LITERAL_3(String#);

这个例子有点无聊,因为没有等式的左边和右边改变了位置(h = error - ref如果没有选择 h 作为状态变量等,这将是可行的)。

于 2012-06-13T12:27:48.643 回答