Численные проблемы, связанные с задержкой импульсного сигнала (fixedDelay)

Я отметил численные проблемы, связанные с интегрированием импульсного входа, который задерживается на фиксированное время в Modelica (с помощью Wolfram System Modeler 4.3):

model PulseTest "Test FixedDelay with Pulse Input";
    Modelica.Blocks.Sources.Pulse pulse(
        startTime = 1, 
        width = 100, 
        period = 1/32, 
        amplitude = 32, 
        nperiod = 1
    );
    Modelica.Blocks.Nonlinear.FixedDelay fixedDelay( delayTime = 5 );
    Modelica.Blocks.Continuous.Integrator x; // integrator for the undelayed pulse
    Modelica.Blocks.Continuous.Integrator y; // integrator for the delayed pulse
equation
    connect( pulse.y, fixedDelay.u );
    connect( fixedDelay.y, y.u );
    connect( pulse.y, x.u );
end PulseTest;

Интегрирование импульса с периодом = 1/a, амплитудой = a и шириной = 100 % должно дать 1,0. Но, как видно из графика, это не то, что я получаю за задержанный импульс:

Только задержанный сигнал дает правильное значение, используя DASSL. Ошибка численного интегрирования появится уже для периода = 1/a = 1/8 и (естественно) будет расти по мере роста.

Какое лекарство лучше?

2 ответа

Решение

Как пишет Ankit на форуме Wolfram, проблема в том, что сигнал дискретный, но блок задержки не знает об этом. Это можно исправить с помощью другого блока задержки:

model DiscreteFixedDelay
  discrete input Modelica.Blocks.Interfaces.RealInput u ;
  discrete output Modelica.Blocks.Interfaces.RealOutput y ;
  parameter Modelica.SIunits.Time delayTime(start = 5) = 5 "Delay time of output with respect to input signal";
equation
  y = delay(u, delayTime);
end DiscreteFixedDelay;

С уважением

Проблема, как писал Маркус А., в том, что эта задержка не распространяет разрыв от входа к выходу, и поэтому моделирование не обрабатывает задержанное пошаговое изменение так же, как обычное пошаговое изменение, то есть с обнаружением события и обработки событий.

С точки зрения инструмента плавная интерполяция задержанного сигнала - это не просто простейшее решение, но также позволяет избежать каскада событий, если задержанный сигнал возвращается обратно.

Я не вижу никакого простого надежного обходного пути при использовании любого решателя переменной размера шага.

Другие вопросы по тегам