Это довольно общий вопрос, поэтому мой ответ также будет довольно общим. Также мне не понятно, что вы называете циклом. Википедия упоминает глубокие и неглубокие выделения, а также есть и другие.
Некоторые общие замечания: в Modelica оператор when
полезен для подсчета. Вы можете прочитать Раздел 8.3.5 Спецификации языка Modelica , чтобы получить полную информацию по этому вопросу.
Приведенные ниже примеры вычисляют, как часто переменная PNet
становится положительной, что должно соответствовать количеству приведенных выше мелких циклов. Некоторое описание для модели:
- Модель
noiseSource
вычисляет случайное число, которое затем фильтруется элементом первого порядка (PT1) для вычисления PNet. Фильтр, вероятно, должен быть пропущен в исходном примере, он только для того, чтобы немного сгладить траекторию.
- Код в операторе
when
выполняется один раз в тот момент, когда условие становится истинным, что позволяет считать.
- Оператор
pre
обращается к значению cycles
непосредственно перед тем, как оператор when
стал активным, что позволяет подсчитывать, как часто возникало условие.
-
start=0
в cycles(start=0)
устанавливает начальное значение для переменной cycles
, что необходимо, поскольку вы не можете использовать cycles = 0
, поскольку это приведет к созданию уравнения для циклов, а это не то, что вам нужно.
- Модель
inner
globalSeed
необходима для работы источника шума.
Вот фактический код:
model CycleCounter
inner Modelica.Blocks.Noise.GlobalSeed globalSeed;
Modelica.Blocks.Noise.NormalNoise noiseSource;
parameter Modelica.SIunits.Time T = 1e-3 "Time constant of PT1 element to filter random signal to compute PNet";
Integer cycles(start=0) "Counts the number of ";
Real PNet "Random value";
equation
der(PNet) = (noiseSource.y - PNet)/T;
when PNet > 0 then
cycles = pre(cycles)+1;
end when;
annotation (uses(Modelica(version="3.2.3")));
end CycleCounter;
И результат симуляции в Dymola: