альтернатива функции выборки с изменяющимся диапазоном выборки

Есть ли альтернатива демонстрационной функции в Openmodelica, которая принимает аргументы, отличные от type parameter? То есть альтернатива должна позволять выборку переменного диапазона значений во время моделирования.

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

Можно ли также иметь функцию «текущее среднеквадратичное значение», чтобы вывод был непрерывным?

Короче говоря, я хотел бы рассчитать значение RMS для диапазона выборки переменной, и в выборке должен быть только один новый член или значение на итерацию, а не полностью новый набор значений.


person Gladson    schedule 14.12.2016    source источник
comment
Думаю, вы могли бы использовать что-то вроде: doc.modelica.org/om/ и вы основываете вход триггера на каком-то выражении, основанном на времени.   -  person Adrian Pop    schedule 14.12.2016


Ответы (1)


Некоторые возможные решения (вам, вероятно, следует проверить мою математику и просто использовать их для вдохновения; также проверьте блок RootMeanSquare в стандартной библиотеке, который по какой-то причине представляет собой образец блока Mean):

Запуск RMS с начала времени (без частоты).

model RMS
  Real signal = sin(time);
  Real rms = if time < 1e-10 then signal else sqrt(i_sq / time /* Assume start-time is 0; can also integrate the denominator using der(denom)=1 for a portable solution. Remember to guard the first period of time against division by zero */);
  Real i_sq(start=0, fixed=true) "Integrated square of the signal";
equation
  der(i_sq) = signal^2;
end RMS;

С фиксированным окном f:

model RMS
  constant Real f = 2*2*asin(1.0);
  Real signal = sin(time);
  Real rms = if time < f then (if time < 1e-10 then signal else sqrt(i_sq / time)) else sqrt(i_sq_f / f);
  Real i_sq(start=0, fixed=true);
  Real i_sq_f = i_sq - delay(i_sq, f);
equation
  der(i_sq) = signal^2;
end RMS;

С переменным окном, f (ограничено f_max):

model RMS
  constant Real f_max = 2*2*asin(1.0);
  constant Real f = 1+abs(2*asin(time));
  Real signal = sin(time);
  Real rms = if time < f then (if time < 1e-10 then signal else sqrt(i_sq / time)) else sqrt(i_sq_f / f);
  Real i_sq(start=0, fixed=true);
  Real i_sq_f = i_sq - delay(i_sq, f, f_max);
equation
  der(i_sq) = signal^2;
end RMS;

Переменное время для выборки в синхронной Modelica: https://trac.modelica.org/Modelica/ticket/2022

Изменяемое время выборки в более ранней версии Modelica:

when time>=nextEvent then
  doSampleStuff(...);
  nextEvent = calculateNextSampleTime(...);
end when;
person sjoelund.se    schedule 15.12.2016
comment
это соответствует моим потребностям! - person Gladson; 16.12.2016