сгладить кривую в димоле - PullRequest
2 голосов
/ 07 января 2020

Как можно сгладить кривую в Dymola после построения графика результата? enter image description here

Ответы [ 3 ]

3 голосов
/ 08 января 2020

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

screenshot with Dymola signal operators

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

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

3 голосов
/ 08 января 2020

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

С уважением

Рене Джаст Нильсен

3 голосов
/ 08 января 2020

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

Я бы рекомендовал использовать фильтр самостоятельно и просто создать сглаженный сигнал, не влияя на фактическое моделирование. Я сделал небольшую модель образца с оригинальным и фильтрованным сигналом, используя фильтр Баттерворта из 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...