【问题标题】:Assignment problems with simple random number generation in ModelicaModelica 中简单随机数生成的分配问题
【发布时间】:2016-03-28 15:19:45
【问题描述】:

我对 Modelica(Dymola 环境)比较陌生,我感到非常绝望/沮丧,因为我无法解决像 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。一个问题似乎是进入算法部分时,既没有使用初始条件,也没有使用方程部分的值。

【问题讨论】:

标签: algorithm variables random modelica


【解决方案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;

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-26
    • 2013-06-03
    相关资源
    最近更新 更多