【问题标题】:smooth the curve in Dymola在 Dymola 中平滑曲线
【发布时间】:2020-01-07 18:44:54
【问题描述】:

在 Dymola 中,绘制结果后,如何平滑曲线?

【问题讨论】:

    标签: modelica dymola


    【解决方案1】:

    我不知道如何在绘图窗口中执行此操作,但平滑曲线可以通过多种方式完成。你必须意识到你正在用它来操纵实际的模拟结果。

    我建议您自己使用滤波器,并在不影响实际模拟的情况下创建平滑信号。我使用 MSL 中的巴特沃斯滤波器制作了一个带有 原始过滤 信号的小样本模型。

    我只是稍微复制和修改了一个示例,请忽略大多数内联 cmets。您必须对f_cut 稍作调整,以便它为您的情况切割正确的高频。

    model FilterTest "Demonstrates the Continuous.Filter block with various options"
      extends Modelica.Icons.Example;
    
      Real original = add.y;
      Real filtered = Butterworth.y;
      protected
      parameter Integer order=3;
      parameter Modelica.SIunits.Frequency f_cut=2;
      parameter Modelica.Blocks.Types.FilterType filterType=Modelica.Blocks.Types.FilterType.LowPass
        "Type of filter (LowPass/HighPass)";
      parameter Modelica.Blocks.Types.Init init=Modelica.Blocks.Types.Init.SteadyState
        "Type of initialization (no init/steady state/initial state/initial output)";
      parameter Boolean normalized=true;
      Modelica.Blocks.Continuous.Filter Butterworth(
    
        analogFilter = Modelica.Blocks.Types.AnalogFilter.Butterworth,
        f_cut= 100,
        f_min=1,
        filterType=Modelica.Blocks.Types.FilterType.LowPass, gain = 1,
        init=init,normalized=normalized,
        order=order)
        annotation (Placement(visible = true, transformation(extent = {{38, 18}, {58, 38}}, rotation = 0)));
      Modelica.Blocks.Sources.Sine sineHigh(freqHz = 200)  annotation(
        Placement(visible = true, transformation(origin = {-62, 54}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
      Modelica.Blocks.Sources.Sine sineLow(amplitude = 10, freqHz = 3)  annotation(
        Placement(visible = true, transformation(origin = {-56, 2}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
      Modelica.Blocks.Math.Add add annotation(
        Placement(visible = true, transformation(origin = {-8, 28}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
    equation
      connect(add.u1, sineHigh.y) annotation(
        Line(points = {{-20, 34}, {-20, 55}, {-51, 55}, {-51, 54}}, color = {0, 0, 127}));
      connect(add.u2, sineLow.y) annotation(
        Line(points = {{-20, 22}, {-33.5, 22}, {-33.5, 2}, {-45, 2}}, color = {0, 0, 127}));
      connect(Butterworth.u, add.y) annotation(
        Line(points = {{36, 28}, {3, 28}}, color = {0, 0, 127}));
      annotation(
        experiment(StopTime = 0.9),
        Documentation(info = "<html>
    
    <p>
    This example demonstrates various options of the
    <a href=\"modelica://Modelica.Blocks.Continuous.Filter\">Filter</a> block.
    A step input starts at 0.1 s with an offset of 0.1, in order to demonstrate
    the initialization options. This step input drives 4 filter blocks that
    have identical parameters, with the only exception of the used analog filter type
    (CriticalDamping, Bessel, Butterworth, Chebyshev of type I). All the main options
    can be set via parameters and are then applied to all the 4 filters.
    The default setting uses low pass filters of order 3 with a cut-off frequency of
    2 Hz resulting in the following outputs:
    </p>
    
    <img src=\"modelica://Modelica/Resources/Images/Blocks/Filter1.png\"
       alt=\"Filter1.png\">
    </html>"),
        uses(Modelica(version = "3.2.2")));
    end FilterTest;
    

    【讨论】:

      【解决方案2】:

      Dymola 中的绘图窗口具有一些信号运算符,可用于后期处理。但它们没有平滑功能。

      如果您想在 Dymola 中进行,最简单的选择是在模拟过程中不断计算平均值,就像 kabdelhak 建议的那样。

      另一种方法是在 Matlab 或 Python 中对 Dymola 创建的 .mat 结果文件应用信号处理过滤器。

      【讨论】:

      • 现在还有一个移动平均信号运算符。
      【解决方案3】:

      我个人发现用时间常数表示滤波的“量”比用截止频率更容易。 如果您不想介意编写几行代码,您可以编写一阶滤波器的方程来实现类似于 kabdelhak 的答案,即

      model Preheater_Model_Validation
        Modelica.SIunits.MassFlowRate m_flow_filtered;
        parameter Modelica.SIunits.Time tau=120 "filter time constant" annotation(Evaluate=false);
      
        ... (other declarations)
      initial equation
        der(m_flow_filtered) = 0 "steady-state initialization";
      equation
        tau*der(m_flow_filtered) = hex.summary.m_flow_in - m_flow_filtered;
      end Preheater_Model_Validation;
      

      代码中的Evaluate=false 注释意味着您可以在 Dymola 的“变量浏览器”中调整时间常数,而无需重新翻译代码。

      最好的问候

      雷内·贾斯特·尼尔森

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-03-19
        • 1970-01-01
        • 1970-01-01
        • 2023-03-04
        • 2017-06-10
        • 2023-03-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多