方程与算法部分的区别

10
  • 方程部分:声明性

  • 算法部分:命令式

有没有人能给我提供Modelica语言中这两个部分之间区别的示例?什么时候该使用哪个部分?

1个回答

21
算法部分和方程式部分的主要区别在于,方程式部分中的每个方程式都用于模拟模型。在算法部分中,您有赋值语句是命令式的。这意味着您可以覆盖先前赋值的影响。作为一个具体的例子,在下面的方程式部分中:
equation
  a = b;
  a = c;

有两个方程式,每个都会被使用。另一方面,如果我有以下的算法部分。

algorithm
  a := b;
  a := c;

第二个任务总是会覆盖第一个任务。

不过让我加入一些“大局观”来帮助你理解真实的语义差异。你可以将 算法 看作是一个黑匣子,输入一堆信息,某些变量会被赋值,中间的过程并不重要。考虑以下算法:

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个方程!这不是我们想要的。

因此,总结一下,使用算法时可以忽略算法中发生的情况,只关注被赋值的内容。它被赋值多少次都只算作该变量的一个“方程”。使用方程部分,则每个方程都持续存在。

P.S. - 当Modelica工具进行诸如方程排序之类的操作时,我非常确定语义规定算法被视为单个块。我猜这对你来说还没有意义。但随着对Modelica的了解越来越深入,你会意识到这可能会影响性能。因此,在Modelica中通常使用方程而不是算法。这样做可以提高模拟速度。


非常感谢 @Michael Tiller。 - shilu
没问题。如果我的回答解决了你的问题,请不要忘记接受它。 - Michael Tiller
你的第三个代码块中,x[i] 应该改为 i,不是吗? - Foad S. Farimani
我们在Discord上与Martin Sjölund进行了相关讨论。我认为algorithm部分可以用于建模因果关系,但显然这不是意图。 - Foad S. Farimani
我进行了一些格式编辑,希望您不介意。 - Foad S. Farimani

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接