Modelica-方程和算法部分之间的差异

时间:2013-11-19 17:39:58

标签: modelica openmodelica

方程式部分:声明式

算法部分:非声明性

任何人都可以通过示例来帮助我,这些示例显示了这两个部分之间的区别。何时使用哪个部分?

-Thanks

1 个答案:

答案 0 :(得分:12)

algorithm部分与equation部分之间的主要区别在于equation部分中的每个等式都用于模拟模型。使用algorithm部分,您可以使用命令式的赋值语句。这意味着您可以覆盖先前作业的影响。作为一个具体的例子,在以下equation部分中:

equation
  a = b;
  a = c;

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

algorithm
  a := b;
  a := c;

第二项任务总是否定第一项。

但是,让我添加一些“大图”来帮助您理解真正的语义差异。您可以将algorithm视为黑匣子。一堆信息进来,某些变量被分配给。两者之间发生的事情并不重要。请考虑以下算法:

algorithm
  sum := 0;
  prod := 1;
  for i in 1:10 loop
    sum := sum + x[i];
    prod := prod * x[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;

我有一个严重的问题,因为这会扩展到11个等式:

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

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

因此,总而言之,使用algorithm,您可以忽略算法中发生的事情,只关注分配值的内容。分配一个值的次数无关紧要,它仍然算作该变量的一个“等式”。使用equation部分,每个等式都会持续存在。

P.S。 - 当Modelica工具执行方程排序时,我很确定语义规定算法被视为单个块。我猜这对你来说没什么意义。但是当您了解有关Modelica的更多信息时,您会发现这对性能有害。因此,如果可以的话,Modelica中的一般规则始终使用equation而不是algorithm。因此,您的模拟速度会更快。