Ang*_*ueR 2 minimum smoothing derivative modelica
我想知道 Modelica 在实现可导函数(对 min(.) 函数具有连续导数)方面是否有任何优势?
\n对于 x\xe2\xa9\xbe0 的 min(.) 函数,我尝试了以下操作:
\n1/ f1(x,s) := Smooth(0, noEvent(min(x,s)))\n2/ f2(x,s) := Smooth(10, x*(1+(x/s)^60)^(-1/60) )\nRun Code Online (Sandbox Code Playgroud)\n实现如下所示:
\nfunction 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;\nRun Code Online (Sandbox Code Playgroud)\n与 f1 相反,我可以为 modelica 提供任何 x\xe2\xa9\xbe0 的 f2 的导数函数和反函数,我认为这有助于提高求解器的速度。
\n总之,我想知道在 Modelica 中实现此类辅助函数是否在速度方面具有优势,或者我是否浪费时间来查找和实现这些函数?
\n任何有关该主题的反馈和知识共享都将受到赞赏。
\n这取决于应用程序。平滑函数的缺点min是:
因此,我不会使用这个平滑min函数,直到我看到特定应用程序实际上需要它 - 而问题中缺少它。
min对于和之外的非平滑函数,max保持它们非平滑甚至可能更有效,因为这允许求解器快速检测导数中的不连续性并触发事件,而不是花费时间来跟踪快速“连续”改变。(smooth操作员的设计允许这样做。)
一般建议是,平滑且可逆的函数应如此声明 - 并不是每个函数都应修改为平滑且可逆。