Modelica 中时间变量的平均值

Mean of a time variable in Modelica

我有一个简单的模型如下,我打算计算 x 导数 wrt time(der(x)) 的平均值。

model Average
  Real x;
initial equation 
  x = 2.0;
equation 
  der(x) = x + 5;
  annotation (experiment(StopTime=10, __Dymola_Algorithm="Dassl"));
end Average;

关键是它是原始代码的简化代码,其中“x”由 CombiTimeTable 给出。我需要执行几个模拟(通过几个文本文件作为 CombiTimeTable 的输入)它们没有相同的行数(不同的持续时间)。换句话说,StopTime 因情况而异,例如对于这种特定情况,此处的 StopTime 为 10s。 有什么方法可以使用一般方程来计算 der(x) 的平均值。如果有人能提供帮助,我将不胜感激。

如果您想要 der(X) 的平均值,您不能将平均值计算为 (x2-x1)/(time2-time1) 吗?

如果您想要数值解而不是解析解,请使用 Modelica.Blocks.Math.Mean。请注意,它对信号进行采样,因此会出现一些数字错误。为了提高精度,您需要减少采样周期,但这样做会增加模拟系统所需的时间。 如果您不需要在模拟过程中使用均值,也可以使用结果文件的 post 处理。

根据 的回答,我创建了一个模型,通过两种方法计算 der(x) 的平均值:

  • 使用 MSL 中的块 Modelica.Blocks.Math.ContinuousMean(而不是 Mean,因为它不采样)
  • 在模拟终止时用(x2-x1)/(time2-time1)计算平均值
model Average
  import Modelica.Constants.pi;
  import Modelica.Utilities.Streams.print;

  Real x;
  Real time1, time2, x1, x2;
  Modelica.Blocks.Math.ContinuousMean continuousMean;

equation 

  der(x) = sqrt(1+cos(2*pi*2*time))+sin(time)^2;

  // Method 1: Continuous mean from MSL
  continuousMean.u = der(x);

  when terminal() then
    print("Continuous mean: "+String( continuousMean.y));
  end when;

  // Method 2: Mean at end time
  when initial() then
    x1 = x;
    time1 = time;
  end when;

  when terminal() then
    x2 = x;
    time2 = time;
    print("Computed mean: "+String( (x2-x1)/(time2-time1)));
  end when;

  annotation (experiment(StopTime=1.0, __Dymola_Algorithm="Dassl"));
end Average;

两个值都在模拟结束时打印出来。它们给出的值与平均值 post 处理命令相似,您可以在 Dymola 中对绘制的信号应用该命令:

另一种可能性是在模拟结束后调用 Dymola 中的均值信号运算符(可能在运行模拟的脚本中):

DymolaCommands.Plot.signalOperatorValue("der(x)", SignalOperator.ArithmeticMean, 0, 1);