在 Dymola 中平滑曲线

smooth the curve in Dymola

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

我不知道情节 window 中的方法,但是 平滑曲线 可以通过多种方式完成。你必须意识到你正在用它来操纵实际的模拟结果。

我建议您自己使用一个滤波器,并在不影响实际模拟的情况下创建一个平滑的信号。我使用来自 MSL 的 Butterworth 滤波器制作了一个带有 originalfiltered 信号的小样本模型。

我只是复制并稍微修改了一个示例,请忽略大部分内联注释。您必须 fiddle 稍微 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;

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

如果您想在 Dymola 中这样做,最简单的选择是在模拟过程中连续计算平均值,就像 kabdelhak 所建议的那样。

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

我个人觉得用时间常数比截止频率更容易表达过滤的'amount'。 如果您不介意编写几行代码,您可以编写一阶滤波器的方程来实现类似于 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 中调整 'Variable browser' 中的时间常数,而无需重新翻译代码。

此致

雷内·贾斯特·尼尔森