与仅在 Modelica 中定义连续导数函数 C0 相比,有什么优势?

Ang*_*ueR 2 minimum smoothing derivative modelica

我想知道 Modelica 在实现可导函数(对 min(.) 函数具有连续导数)方面是否有任何优势?

\n

对于 x\xe2\xa9\xbe0 的 min(.) 函数,我尝试了以下操作:

\n
1/ f1(x,s) := Smooth(0, noEvent(min(x,s)))\n2/ f2(x,s) := Smooth(10, x*(1+(x/s)^60)^(-1/60) )\n
Run Code Online (Sandbox Code Playgroud)\n

实现如下所示:

\n
function Limiter "Function  Limiter"\n  input Real x;\n  input Real xc(final min=0);\n  output Real y;\nprotected \n  Real mx;\n  parameter Real k=3;\n  parameter Integer o(\n    final min=1,\n    max=30) = 30;\n  final parameter Integer twoO=2*o;\nalgorithm \n  mx := noEvent(min(x, k*xc));\n  if noEvent(abs(xc)) >= 1 then\n    y := mx*(1 + (mx/xc)^twoO)^(-1/twoO);\n  else\n    y := mx*xc*(xc^twoO + mx^twoO)^(-1/twoO);\n  end if;\n  annotation (derivative=DerLimiter, inverse(x=InverseLimiter(x=y, xc=xc), xc=InverseLimiter(x=y, xc=x)));\nend Limiter;\n
Run Code Online (Sandbox Code Playgroud)\n

与 f1 相反,我可以为 modelica 提供任何 x\xe2\xa9\xbe0 的 f2 的导数函数和反函数,我认为这有助于提高求解器的速度。

\n

总之,我想知道在 Modelica 中实现此类辅助函数是否在速度方面具有优势,或者我是否浪费时间来查找和实现这些函数?

\n

任何有关该主题的反馈和知识共享都将受到赞赏。

\n

Han*_*son 5

这取决于应用程序。平滑函数的缺点min是:

  • 需要更多时间来计算。
  • 即使理论上是可逆的,但在实践中,远离转变点也可能是不可逆的。尝试反转它也可能表明存在应该以完全不同的方式处理的建模问题。

因此,我不会使用这个平滑min函数,直到我看到特定应用程序实际上需要它 - 而问题中缺少它。

min对于和之外的非平滑函数,max保持它们非平滑甚至可能更有效,因为这允许求解器快速检测导数中的不连续性并触发事件,而不是花费时间来跟踪快速“连续”改变。(smooth操作员的设计允许这样做。)

一般建议是,平滑且可逆的函数应如此声明 - 并不是每个函数都应修改为平滑且可逆。