如何让包角函数在Modelica中可以区分?

JAG*_*KOO 1 modelica dymola

我在 Modelica 中制作了包角代码,如下所示。

thetta_eq=mod(thetta, 720);
Run Code Online (Sandbox Code Playgroud)

thetta 不断增加 0 到无限角,thetta_eq 是包裹角 0 到 720deg。

但是,当我区分包裹角时会出现问题。

在此处输入图片说明

此外,我无法在 Modelica 标准库 3.2.3 中使用 wrapangle 块,因为我必须使用 3.2.2 版本。

有没有人有解决这个问题的方法?代码、逻辑还是选项?

======================== 在此处输入图片说明

我已经知道当角度从 720 度下降到 0 度时无法区分,因为它是不连续的。

所以,我想问的是使它即使在下降区域也是连续的。

在此处输入图片说明

实际上,上图是 sigmoid 函数,我想当包角下降 720 到 0 度时我可以使用这个函数。

如果我使 sigmoid 函数的倾斜度非常高,我认为这可以像原始包角一样起作用。并且导数不是无限的或无限的,因此可以微分。

你怎么想?以及我如何为这个想法制定逻辑?

ps) 非常感谢您的回复!

mar*_*rco 5

就像 matth 评论的那样,您无法区分具有不连续性的变量。当 theta 从 720 跳到 0 时,您对导数有什么期望?

您可以使用原始角度的导数,而不是使用包裹角。

model Demo

  Modelica.SIunits.Angle theta = 100*sin(time);
  Modelica.SIunits.Angle theta_wrap;
  Modelica.SIunits.AngularVelocity w;

equation 

  w = der(theta);
  theta_wrap=mod(theta, 2*Modelica.Constants.pi);

end Demo;
Run Code Online (Sandbox Code Playgroud)

注意:我为 theta 使用了正确的 SIunit 类型,所以我必须包裹到 2*pi 弧度,而不是 720 度。