带参数的Modelica函数调用缓存
考虑下面的示例Modelica模型:
函数myFun1接收一个参数作为输入,然后在myFun1内部对同一参数再次调用myFun2。
理论上,在仿真过程中只需一次性地求值k=myFun2(b),因为输入是在仿真期间保持不变的参数。
我的真实的myFun2函数比示例中的要复杂,因此不可能进行内联。我在myFun2中添加了一个打印语句,输出到一个文件,仿真结束后该文件有数百行。
出于性能考虑,希望仅对myFun2求值一次,如何在Dymola / OpenModelica / 其他工具中实现呢? 有没有办法统计一个函数被调用的次数,以确保它按预期工作?
model ModelFunFun
Real x, y;
parameter Real z = 3;
protected
function myFun1
input Real a;
input Real b;
output Real c;
protected
Real k = myFun2(b);
algorithm
c := k*a;
end myFun1;
function myFun2
input Real d;
output Real e;
algorithm
e:=d*d;
end myFun2;
equation
x = time -2;
y = myFun1(a=x, b=z);
end ModelFunFun;
解决方案
是的,至少在Dymola 2025x Refresh 1及更高版本中是可行的,我还没有检查较早版本。
只需要指示 myFun1 应该被内联,它就会被内联。
然而,myFun2 默认也会被内联并重新求值。你可以指示它不应该被内联,以确保 myFun2 只被求值一次——但这很可能是一种悲观的做法。见下方代码:
model ModelFunFun
Real x, y;
parameter Real z = 3;
protected
function myFun1
input Real a;
input Real b;
output Real c;
protected
Real k = myFun2(b);
algorithm
c := k*a;
annotation(Inline=true);
end myFun1;
function myFun2
input Real d;
output Real e;
algorithm
e:=d*d;
// annotation(Inline=false);
end myFun2;
equation
x = time -2;
y = myFun1(a=x, b=z);
end ModelFunFun;
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。