сгладить кривую в Дымоле

Как в Димоле после нанесения результата сгладить кривую? введите здесь описание изображения


person Jack    schedule 07.01.2020    source источник


Ответы (3)


Я не знаю, как это сделать в окне графика, но сглаживание кривой можно выполнить несколькими способами. Вы должны знать, что этим вы манипулируете реальным результатом симуляции.

Я бы рекомендовал использовать фильтр самостоятельно и просто создать сглаженный сигнал, не влияя на фактическую симуляцию. Я сделал небольшой образец модели с исходным и отфильтрованным сигналом, используя фильтр Баттерворта из MSL.

Я просто скопировал и немного изменил пример, не обращайте внимания на большинство встроенных комментариев. Вы должны немного повозиться с 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;
person kabdelhak    schedule 08.01.2020

В окнах графика в Dymola есть несколько операторов сигналов, которые вы можете использовать для постобработки. Но в них нет функции сглаживания.

снимок экрана с операторами сигналов Dymola

Если вы хотите сделать это в Dymola, самый простой вариант - постоянно вычислять усредненные значения во время моделирования, как предложил Кабдельхак.

Альтернативой может быть применение фильтров обработки сигналов в Matlab или Python в файле результатов .mat, созданном Dymola.

person marco    schedule 08.01.2020
comment
Теперь есть также оператор сигнала скользящей средней. - person Dag B; 03.03.2021

Лично мне легче выразить «количество» фильтрации через постоянную времени, чем через частоту среза. Если вы не хотите возражать против написания пары строк кода, вы можете написать уравнение фильтра первого порядка, чтобы добиться чего-то похожего на ответ 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 без повторного перевода кода.

С наилучшими пожеланиями

Рене Юст Нильсен

person Rene Just Nielsen    schedule 08.01.2020