将显式导数函数添加到 Modelica.Math.Vectors.interpolate
Add Explicit Derivative Function to Modelica.Math.Vectors.interpolate
我有一个稳态代数模型(没有 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 添加显式定义:
在函数定义中添加导数注解:
函数插值 "Interpolate in a vector" 扩展 Modelica.Icons.Function 注释(导数 = dydx);
添加一个受保护的实型变量dydx:
真正的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 仍然发出有关
的警告
我对派生注释的使用有误解吗?如果是这样,有人可以帮助我了解如何定义插值函数的导数吗?
谢谢!
此问题与 https://github.com/modelica/Modelica/issues/2078 相同,将在 Modelica 标准库的下一个向后兼容维护版本中修复。
我有一个稳态代数模型(没有 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 添加显式定义:
在函数定义中添加导数注解:
函数插值 "Interpolate in a vector" 扩展 Modelica.Icons.Function 注释(导数 = dydx);
添加一个受保护的实型变量dydx:
真正的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 仍然发出有关
的警告我对派生注释的使用有误解吗?如果是这样,有人可以帮助我了解如何定义插值函数的导数吗?
谢谢!
此问题与 https://github.com/modelica/Modelica/issues/2078 相同,将在 Modelica 标准库的下一个向后兼容维护版本中修复。