平滑Dymola中的曲线

时间:2020-01-07 18:44:54

标签: modelica dymola

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

3 个答案:

答案 0 :(得分:3)

我不知道在绘图窗口中执行此操作的方法,但是可以使用多种方法平滑曲线。您必须注意,您正在使用它来操纵实际的模拟结果。

我建议您自己使用一个滤波器,并且只创建一个平滑的信号而不影响实际的仿真。我使用来自MSL的Butterworth滤波器制作了一个带有原始滤波信号的小样本模型。

我刚刚复制并修改了一个示例,请忽略大多数内联注释。您必须摆弄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;

答案 1 :(得分:3)

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

screenshot with Dymola signal operators

如果要在Dymola中执行此操作,最简单的选择是在仿真过程中连续计算平均值,如建议的kabdelhak。

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

答案 2 :(得分: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的“变量浏览器”中调整时间常数,而无需重新翻译代码。

最诚挚的问候

Rene Just Nielsen

相关问题