将显式导数函数添加到Modelica.Math.Vectors.interpolate

时间:2018-01-22 09:28:36

标签: modelica openmodelica dymola

我有一个稳态代数模型(没有der()表达式)和一个非线性方程。当在Dymola中进行翻译时,这组方程导致数字雅可比矩阵。我想删除数字雅可比行列式(如果可能的话)以提高模型的性能。

设置参数Hidden.PrintFailureToDifferentiate = true后(感谢this tip from Claytex),我看到Dymola发出警告:

Cannot find derivative of function:
InitializationParameterLoop.InitFunctions.interpolate(xVector, yVector, x, 1)

请注意,InitializationParameterLoop.InitFunctions.interpolate函数是Modelica.Math.Vectors.interpolate函数的副本,已复制,以便我可以在我自己的包中进行必要的修改。

我尝试通过对插值函数进行以下更改来为派生dy / dx添加显式定义:

  • 将衍生注释添加到函数定义中:

    function interpolate“在向量中插值”扩展了Modelica.Icons.Function注释(衍生词= dydx);

  • 添加受保护的Real变量dydx:

    Real dydx;

  • 在算法部分计算dydx:

    if abs(x2-x1)>0 then dydx :=(y2 - y1)/(x2 - x1); else dydx := sign(y2 - y1)*Modelica.Constants.inf; end if;

我希望这个简单的方法可以用来明确定义dydx并删除数字雅可比计算,但它似乎没有做任何改变,Dymola仍然发出关于

的警告

我是否误解了衍生注释的使用?如果是这样,有人可以帮助我理解如何定义插值函数的导数吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

这与https://github.com/modelica/Modelica/issues/2078的问题相同,将在Modelica标准库的下一个向后兼容维护版本中修复。