带参数的Modelica函数调用缓存

编程语言 2026-07-11

考虑下面的示例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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章