【问题标题】:Dymola/Modelica - How can I calculate the mean of a signal only in the steady state?Dymola/Modelica - 如何仅在稳定状态下计算信号的平均值?
【发布时间】:2021-11-26 13:12:54
【问题描述】:

我正在努力计算我的 Modelica 模型中连续信号的平均值。问题是我只对计算稳态的平均值感兴趣。例如,在附加的模型(最小,可重现示例)中,我想计算 40 到 60 秒之间的平均值。因此,我首先尝试使用Modelica.Blocks.Math.ContinuousMean,但t_0是受保护的,所以我在我的个人库中写了一个类似的代码(也附上)。 但是,有一个错误,我无法弄清楚发生了什么。有人可以对这个简单的问题有所了解吗?提前谢谢!!!

型号:

model MeanExampleStackOverFlow

  parameter Modelica.SIunits.Time period=3;
  final parameter Real angularFrecuency=(2*Modelica.Constants.pi)/period;
  parameter Real amplitude=2;
  Real signal;
  Real mean;

  PersonalLibrary.Utilities.ContinuosMeanStartTime meanBlock(t_0=40);

equation 

  signal = amplitude*sin(angularFrecuency*time) + log(time*100 + 1);
  meanBlock.u = signal;
  meanBlock.y = mean;

end MeanExampleStackOverFlow; 

块保存在个人库中:

block ContinuosMeanStartTime "Similar block as Continuos Mean in MSL but with unprotected Start time (t_0)"
  extends Modelica.Blocks.Icons.Block;
  parameter Modelica.SIunits.Time t_eps(min=0.0) = 1e-7 "Mean value calculation starts at startTime + t_eps";
  parameter Modelica.SIunits.Time t_0(min=0.0) = 0 "Start time";

  Modelica.Blocks.Interfaces.RealInput u "Noisy input signal";
  Modelica.Blocks.Interfaces.RealOutput y "Expectation (mean) value of the input signal";
protected 
  Real mu "Internal integrator variable";
initial equation 
  mu = u;
equation 
  der(mu) = noEvent(if time >= t_0 + t_eps then (u - mu)/(time - t_0) else 0);
  y = noEvent(if time >= t_0 + t_eps then mu else u);

end ContinuosMeanStartTime; 

最后,这里有一些结果显示了我想要实现的目标(已经用其他软件编辑了结果)。 最好的问候。

注意:顺便问一下,有没有其他方法可以访问 MSL 中的受保护参数而不是编写新块?

【问题讨论】:

  • 你能提供一个最小的、可重现的例子吗?从您的绘图中重新创建模型需要工作,并且不能保证会发生相同的错误。 stackoverflow.com/help/minimal-reproducible-example
  • 感谢您的评论。我已经编辑了帖子。让我们看看现在是否更容易理解。提前致谢!

标签: modelica dymola openmodelica


【解决方案1】:

目前你不能使用t_eps来实现,只是为了防止被零除。

如果t_0 被曝光,那可能会改变。

【讨论】:

【解决方案2】:

当我运行您的代码时,我收到一个错误,指出 t=40 处存在奇点。

我认为您基本上在 t= t_0 + t_eps 处遇到了一个数值问题,因为您突然在 mu 上有一个特征值为 time-t_0 的微分方程,它在 if 条件变为 true 之后立即是 t_eps,因此非常小,这对求解器来说是个问题。

这里有一些方法可以解决这个问题:

  • 使用其他求解器(对我而言,DASSL 没有通过,但 LSODAR 有效),有些可能更适合您的特定数值挑战
  • 增加 t_eps(对我来说,使用 DASSL 的模型运行时间为 t_eps > 1e-6 左右),因此 time= t_0 + t_eps 处的特征值变得更大李>
  • 删除 noEvent (我不太清楚为什么这会解决问题,我的猜测是,然后事件触发 DASSL 的重置,并减小其步长,因此快速特征值这也可以解释为什么原始模型 Modelica.Blocks.Math.ContinuousMean 在时间 = t_0 + t_eps 时起作用,因为这里的 if 语句在模拟开始后立即变为真,其中 DASSL 处于类似状态就像在一个事件之后使用非常小的步长。但这些只是有根据的猜测。)

您的代码的另一件事是,如果您想创建绿线,您必须将 ContinuosMeanStartTime 块的输出更改为

y =  mu;

否则,您将得到 信号 作为 time= 40 + t_eps 之前的平均值。

【讨论】:

  • 非常感谢,感谢您的帮助 :) 您的学习真的很有趣!
猜你喜欢
  • 2021-04-15
  • 1970-01-01
  • 2012-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-03
  • 1970-01-01
  • 2019-02-07
相关资源
最近更新 更多