J'ai constaté des problèmes numériques lors de l'intégration d'une entrée Pulse retardée d'un temps déterminé dans Modelica (à l'aide de 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;
L'intégration d'une impulsion avec période = 1/a, amplitude = a et largeur = 100% devrait donner 1,0. Mais comme on peut le voir sur l'intrigue, ce n'est pas ce que je reçois pour l'impulsion différée:
Seul le signal non retardé donne la valeur correcte en utilisant DASSL. L’erreur d’intégration numérique apparaît déjà pour period = 1/a = 1/8 et croît (naturellement) à mesure que a grandit.
Quel est le meilleur remède?
Comme Ankit l’a signalé sur le Wolfram Forum , le problème est que le signal est discret mais que le bloc de délai n’en est pas conscient. Il peut être corrigé avec un bloc de délai différent:
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;
Cordialement
Le problème est, comme l’a écrit Markus A, que ce délai ne propage pas la discontinuité d’entrée en sortie et que, par conséquent, la simulation ne gère pas le changement d’étape retardé de la même manière qu’un changement d’étape normal, c’est-à-dire avec détection gestion des événements.
Du point de vue de l'outil, l'interpolation en douceur du signal retardé n'est pas simplement la solution la plus simple, elle évite également une cascade d'événements si le signal retardé est renvoyé.
Je ne vois aucune solution de contournement fiable lorsque j'utilise un solveur à taille de pas variable.