Modelica I/O块与函数

Modelica I/O块与函数,modelica,Modelica,Modelica中的块和函数有一些相似之处和不同之处。在块中,输出变量最有可能用等式表示为输入变量,而在函数中,输出变量用赋值表示为输入变量。给定一个y=f(u)的关系,它可以用这两个概念来表示,我想知道在哪种情况下,你应该支持哪一个概念 就我个人而言 使用输入/输出连接器可以更好地将块集成到方框图中 对于雅可比矩阵求值所需的符号操作、优化和求值分析导数,编译器很可能更好地处理块中的方程。所以我猜在某些边界情况下,块对数值误差可能不太敏感。对于函数,如果没有明确提供导数,则可以使用有限差分方

Modelica中的块和函数有一些相似之处和不同之处。在块中,输出变量最有可能用等式表示为输入变量,而在函数中,输出变量用赋值表示为输入变量。给定一个y=f(u)的关系,它可以用这两个概念来表示,我想知道在哪种情况下,你应该支持哪一个概念

就我个人而言

  • 使用输入/输出连接器可以更好地将块集成到方框图中

  • 对于雅可比矩阵求值所需的符号操作、优化和求值分析导数,编译器很可能更好地处理块中的方程。所以我猜在某些边界情况下,块对数值误差可能不太敏感。对于函数,如果没有明确提供导数,则可以使用有限差分方法计算导数

  • 另一方面,函数中的一组赋值很可能被视为一个等式。如果用块中更大的方程组表示相同的赋值集,则会产生更大的模型,可能会导致运行时性能下降

  • 尽管带有算法部分的块在某种程度上等同于具有相同赋值集的函数,但函数调用的语法在两种情况下更受欢迎

  • 可以建立块类型的层次结构,并完成所有面向对象建模的工作。功能有点有限。不可能从包含算法部分的非抽象函数进行扩展。但也有可能有一个抽象的功能,作为一个接口,从中可以建立实现的功能等等


上述一些参数取决于特定模拟环境处理块或函数的方式。这些可能是底层细节,不一定是已知的。

您可能会对相反的内容感兴趣:像调用函数一样调用块:

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

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

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

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

  • 关于功能的区分,开发人员至少需要定义可以区分分配的频率(这里有一个很好的例子),例如Dymola不会自动完成。或者,可以手动指定区分函数()。顺便说一下,偏导数也可以定义,见第。12.7.2

  • 当需要反转函数时,可能需要手动定义它。这在第节中进行了描述。12.8

  • 此外,函数中的代码可以内联也很重要,这应该可以克服上面提到的一些问题,请参见第节。18.3

  • 一般来说,当函数没有很强的理由时,我会选择块。我想到的一些是过程执行的需要,或者是循环的

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

    z = Block(x, y);