Задачи присваивания при генерации простых случайных чисел в Modelica

Я относительно новичок в Modelica (Dymola-environment), и я очень отчаялся / расстраиваюсь из-за того, что не могу решить такую ​​простую проблему, как генерация случайных чисел в Modelica, и я надеюсь, что вы можете мне помочь.

Простая функция random производит случайное число от 0 до 1 с входным начальным значением seedIn[3] и создает выходное начальное число seedOut[3] для следующего временного шага или события. Вызов (z,seedOut) = random(seedIn); работает отлично.

Проблема в том, что я не могу найти способ в Modelica вычислить это назначение с течением времени, используя seedOut[3] в качестве следующего seedIn[3], что очень расстраивает.

Моя простая программа выглядит так:

*model Randomgenerator
Real z;
Integer seedIn[3]( start={1,23,131},fixed=true), seedOut[3];
equation
  (z,seedOut) = random(seedIn);
algorithm
  seedIn := seedOut;

end Randomgenerator;*

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


person D. Friese    schedule 28.03.2016    source источник
comment
Возможно, вам понадобится уравнение или оператор when с reinit (seedIn, seedOut);   -  person Adrian Pop    schedule 28.03.2016
comment
Вас также могут заинтересовать шум DLR и DLR Advanced Noise. Или выполните поиск Noise на impact.github.io   -  person matth    schedule 29.03.2016
comment
Подробнее о генерации случайных чисел в Modelica читайте в вопросе   -  person jrhodin    schedule 29.03.2016


Ответы (1)


Используя функции 'sample' и 'reinit', приведенный ниже код вычислит новое случайное число с частотой, указанной в 'sample'. Обратите внимание на способ определения «начального значения» seedIn.

model Randomgenerator

  Real seedIn[3] = {1,23,131};

  Real z;
  Real[3] seedOut;

equation 
  (z,seedOut) = random(seedIn);
  when sample(1,1) then
   reinit(seedIn,pre(seedOut));
  end when;

end Randomgenerator;

Функция pre позволяет использовать предыдущее значение переменной. Если бы это не использовалось, выход «z» вернул бы постоянное значение. Две вещи относительно функции 'reinint': она требует использования 'when' и требует 'Real' переменных / выражений, поэтому seedIn и seedOut теперь определены как 'Real'.

Я использовал простой "случайный" генератор:

function random

  input Real[3] seedIn;

  output Real z;
  output Real[3] seedOut;

algorithm 
  seedOut[1] :=seedIn[1] + 1;
  seedOut[2] :=seedIn[2] + 5;
  seedOut[3] :=seedIn[3] + 10;

  z :=(0.1*seedIn[1] + 0.2*seedIn[2] + 0.3*seedIn[3])/(0.5*sum(seedIn));

end random;

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

person Scott G    schedule 28.03.2016