Function Modelica中函数的导数

Function Modelica中函数的导数,function,modelica,Function,Modelica,首先,请原谅我没有提供一个最低限度的工作示例,我真的想不出一个。我将给出一些代码,并“原则上”提出我的问题 我正在用真实气体模型(Peng Robinson)进行热物理性质计算,在转换模型时遇到了问题,我使用压力p和比焓h作为输入来计算所有其他性质。当计算温度T时,它通过一个称为偏离函数的方程与焓h相连,偏离函数本身是T的函数。在Modelica中,它看起来如下所示: Dh_real = R_m*T*(Z - 1) + (T*dadT - a)/(sqrt(8)*b)*log((Z + (1 +

首先,请原谅我没有提供一个最低限度的工作示例,我真的想不出一个。我将给出一些代码,并“原则上”提出我的问题

我正在用真实气体模型(Peng Robinson)进行热物理性质计算,在转换模型时遇到了问题,我使用压力p和比焓h作为输入来计算所有其他性质。当计算温度T时,它通过一个称为偏离函数的方程与焓h相连,偏离函数本身是T的函数。在Modelica中,它看起来如下所示:

Dh_real = R_m*T*(Z - 1) + (T*dadT - a)/(sqrt(8)*b)*log((Z + (1 + sqrt(2))*B)/(Z + (1 - sqrt(2))*B));
这里,
a
dadT
Z
也是温度相关的标量,并且在函数中使用矩阵运算(
dadT
)或多项式根计算(
Z
)进行部分计算,
b
b
是参数

从输入温度(在另一个模型中)计算焓非常简单且工作良好,解算器可以解析地求解偏离函数。另一个方向必须用数值解,我想这就是为什么Dymola在翻译时给我这个错误

Cannot find differentiation function:
DadT_Unique2([some parameters and T])
with respect to time

Failed to differentiate the equation
dadT = DadT_Unique2([some parameters and T]);

in order to reduce the DAE index.

Failed to reduce the DAE index.
现在,
DadT
是模型中的一个函数,我使用一些简单的矩阵运算从一些参数和温度T计算
DadT
。显然,Dymola需要一些内部
\u Unique2
-函数的导数。
我在规范中或网络上都找不到关于这一点的任何信息。我能提供函数的导数吗?我尝试了
smoothOrder
-注释,但没有效果。如何处理这个问题?

这不是一个完整的答案,而是一个有趣的链接列表,您应该阅读:

  • Michael Tiller关于
    注释(导数=dxyz)
    和其他注释:
  • 数值雅可比矩阵上的Claytex和标志
    隐藏。PrintFailureToDifferentiate

  • 有关StackOverflow的两个相关问题:

  • 一些相关的Modelica会议论文:


  • 三次状态方程,广义形式(表4.2)
  • 求解立方状态方程:


    (附录C)
  • 重写偏导数:

您可以使用
注释(导数=dxyz)
提供导数函数。在Modelica语言规范中搜索这些注释(反向可能也很有趣),或者在Michael Tillers在线丛书中阅读更多内容:感谢您的提示@matth。我是对的,在导数函数中,我被要求数学上给出原始函数输出微分的函数,这样编译器就可以生成关于任何变量(和时间)的导数?但是如果我没有/不能给出导数函数呢?例如,在我的例子中,
Z
是MSL函数
Modelica.Math.Vectors.Utilities.root的输出。如何从一个三阶多项式得到根计算的微分?你指定的导数是时间导数,但它可能调用原始函数的每个偏导数。例如,您可以查看或中的函数
density\u ph
(及其调用的函数)。你的
Z
是压缩因子吗?@matth是的,确实如此。我选择使用MSL roots函数计算
Z
,首先是为了能够访问液相-Z和汽相-Z,其次是在早期的开发状态,我体验到,解算器自动为
Z
选择了错误的解决方案,这导致了无意义的结果。好的,下面是我解决这个问题的方法:我设法为Z和所有其他函数给出了一个导数。由于某些原因,单一的
未能减少DAE索引。
-错误仍然存在,没有进一步的信息说明错误所在。所以我的结论是在一个函数中编写我自己的牛顿求解程序,这个函数运行良好,收敛速度非常快。谢谢@matth的指导。