【问题标题】:Mean of a time variable in ModelicaModelica中时间变量的平均值
【发布时间】:2021-10-08 01:33:03
【问题描述】:

我有一个简单的模型如下,我打算计算 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 为 10 秒。 有没有办法使用一般方程来计算 der(x) 的平均值。如果有人可以提供帮助,我将不胜感激。

【问题讨论】:

    标签: variables average mean modelica


    【解决方案1】:

    根据sjoelund.se 的回答,我创建了一个模型,通过两种方法计算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;
    

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 感谢您的回复。我无法通过 (x2-x1)/(time2-time1) 计算 der(x) 的平均值,因为其他变量也涉及 der(x) 的方程。我需要模拟结束时的平均值和后处理(将输出导出到 excel 文件并计算平均值)是我目前正在做的事情,但这很耗时。这就是为什么我在 Modelica 环境中寻找更好的解决方案。
      猜你喜欢
      • 1970-01-01
      • 2013-12-29
      • 1970-01-01
      • 2021-05-14
      • 1970-01-01
      • 2020-04-03
      • 2014-08-20
      • 2020-12-22
      • 1970-01-01
      相关资源
      最近更新 更多