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

shi*_*ilu 7 modelica openmodelica

方程式部分:声明式

算法部分:非声明性

任何人都可以帮助我举例说明这两个部分之间的区别.什么时候使用什么部分?

-谢谢

Mic*_*ler 16

algorithm截面和equation截面之间的主要区别在于截面中的每个方程equation用于模拟模型.对于一个algorithm部分,您必须具有必要的赋值语句.这意味着您可以覆盖先前作业的影响.作为一个具体的例子,在equation下一节中:

equation
  a = b;
  a = c;
Run Code Online (Sandbox Code Playgroud)

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

algorithm
  a := b;
  a := c;
Run Code Online (Sandbox Code Playgroud)

第二个任务总是否定第一个任务.

但是,让我添加一些"大图片"来帮助您理解真正的语义差异.你可以把它想象algorithm成一个黑盒子.一堆信息进来,某些变量被分配给.两者之间发生的事情并不重要.考虑以下算法:

algorithm
  sum := 0;
  prod := 1;
  for i in 1:10 loop
    sum := sum + x[i];
    prod := prod * x[i];
  end for;
Run Code Online (Sandbox Code Playgroud)

双方sumprod分配到多次.但最后,所有这些实际上都与以下内容相同:

algorithm
  sum := 1+2+3+4+5+6+7+8+9+10;
  prod := 1*2*3*4*5*6*7*8*9*10;
Run Code Online (Sandbox Code Playgroud)

...甚至...

equation
  sum = 1+2+3+4+5+6+7+8+9+10;
  prod = 1*2*3*4*5*6*7*8*9*10;
Run Code Online (Sandbox Code Playgroud)

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

equation
  sum = 0;
  for i in 1:10 loop
    sum = sum + i;
Run Code Online (Sandbox Code Playgroud)

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

equation
  sum = 0;
  sum = sum + 1;
  sum = sum + 2;
  ...
  sum = sum + 10;
Run Code Online (Sandbox Code Playgroud)

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

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

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