Численные проблемы, связанные с задержкой импульсного сигнала (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;
С уважением
Проблема, как писал Маркус А., в том, что эта задержка не распространяет разрыв от входа к выходу, и поэтому моделирование не обрабатывает задержанное пошаговое изменение так же, как обычное пошаговое изменение, то есть с обнаружением события и обработки событий.
С точки зрения инструмента плавная интерполяция задержанного сигнала - это не просто простейшее решение, но также позволяет избежать каскада событий, если задержанный сигнал возвращается обратно.
Я не вижу никакого простого надежного обходного пути при использовании любого решателя переменной размера шага.