Modelica I/O 块与函数

Modelica I/O blocks vs. Functions

Modelica 中的块和函数有一些相同点和不同点。在块中,输出变量最有可能使用方程根据输入变量表示,而在函数中,输出变量使用赋值根据输入变量表示。给定一个关系 y = f(u) 可以用这两个概念来表达,我很想知道在哪种情况下你应该支持哪个概念?

就个人而言,

上面的一些论点取决于特定模拟环境处理块或函数的方式。这些可能是不一定知道的低级细节。

您可能对相反的事情感兴趣:像调用函数一样调用块:

https://github.com/modelica/ModelicaSpecification/issues/1512

使用函数语法的好处是不需要声明+连接组件:

  Block b;
equation
  connect(x, b.in1);
  connect(y, b.in2);
  connect(z, b.out1);

z = Block(x, y);

当然现在还不存在这种语法。你真的想尽可能地使用块。算法块也可能是函数,因为它们更短且更容易编写,并且会在结果文件中引入更少的轨迹(除非您想调试函数调用内部发生的事情,否则很好)。

您“问题”中的列表已经是一个很好的总结。还有一些其他的事情需要考虑:

  1. 关于函数的微分,开发者至少需要定义赋值可以微分的频率(这里有个不错的read on this), as e.g. Dymola will not do it automatically. Alternatively the differentiated function can be specified manually (here). By the way, a partial derivative can be defined as well, see Language Specification, Sec. 12.7.2.

  2. 当需要反转函数时,可能需要手动定义它。这在 Language Specification, Sec. 中有描述。 12.8.

  3. 此外,函数中的代码可以内联也很重要,这应该可以解决上面提到的一些问题,请参阅 Language Specification,第 1 节。 18.3.

一般来说,只要没有很强的功能理由,我就会去块。我想到的一些是程序执行的需要,或者 for-循环。

这只是我的两分钱 - 欢迎更多意见...