9
  • 方程式部分:声明式

  • 算法部分:命令式

谁能帮我举一些例子来说明 Modelica 语言中这两个部分之间的区别?什么时候用什么部分?

4

1 回答 1

18

algorithm截面和截面之间的主要区别在于截面equation中的每个方程equation都用于模拟模型。有了一个algorithm部分,你就有了命令式的赋值语句。这意味着您可以覆盖先前分配的影响。作为一个具体的例子,在以下equation部分中:

equation
  a = b;
  a = c;

有两个等式。每个都会被使用。另一方面,如果我有以下algorithm部分

algorithm
  a := b;
  a := c;

第二个赋值总是覆盖第一个。

但是让我添加一点“大图”来帮助您理解真正的语义差异。您可以将 aalgorithm视为一个黑匣子。一堆信息进来,某些变量被分配到。中间发生了什么并不重要。考虑以下算法:

algorithm
  sum := 0;
  prod := 1;
  for i in 1:10 loop
    sum := sum + i;
    prod := prod * i;
  end for;

两者sumprod被分配了多次。但最终,这一切实际上与以下内容相同:

algorithm
  sum := 1+2+3+4+5+6+7+8+9+10;
  prod := 1*2*3*4*5*6*7*8*9*10;

...甚至...

equation
  sum = 1+2+3+4+5+6+7+8+9+10;
  prod = 1*2*3*4*5*6*7*8*9*10;

但这同样不适用于equation部分。如果我在一个equation部分中这样做:

equation
  sum = 0;
  for i in 1:10 loop
    sum = sum + i;
  end for;

我会遇到一个严重的问题,因为这将扩展为 11 个方程:

equation
  sum = 0;
  sum = sum + 1;
  sum = sum + 2;
  ...
  sum = sum + 10;

所以我有一个变量和 11 个方程!这不是我们想要的。

因此,总而言之,algorithm您可以忽略算法中发生的事情,而只关注分配了值的内容。不管它被赋值多少次,它仍然算作该变量的一个“方程式”。有了一个equation部分,每个方程都存在。

PS - 当 Modelica 工具执行方程排序等操作时,我很确定语义表明算法被视为单个块。我的猜测是这对你来说还没有任何意义。但是当您了解更多有关 Modelica 的信息时,您会意识到这可能对性能不利。因此,Modelica 中的一般规则是尽可能使用equationover an algorithm。因此,您的模拟将更快。

于 2013-11-19T23:17:58.070 回答