Modelica

时间:2016-03-28 15:19:46

标签: algorithm variables random modelica

我对Modelica(Dymola-environment)相对较新,我非常绝望/不安,我无法解决像Modelica中随机数生成这样的简单问题,我希望你能帮助我。

简单函数random使用输入种子seedIn[3]生成0到1之间的随机数,并为下一个时间步或事件生成输出种子seedOut[3]。电话 (z,seedOut) = random(seedIn); 完美无缺。

问题在于,我无法通过seedOut[3]作为下一个seedIn[3]在Modelica中找到计算此作业的方法,这非常令人沮丧。

我的简单程序如下:

*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。一个问题似乎是,当进入算法部分时,既不使用初始条件也不使用方程部分中的值。

1 个答案:

答案 0 :(得分: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;

当然,还有其他方法可以根据应用程序执行此操作。至少这会给你一些东西。希望它有所帮助。