我对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
。一个问题似乎是,当进入算法部分时,既不使用初始条件也不使用方程部分中的值。
答案 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;
当然,还有其他方法可以根据应用程序执行此操作。至少这会给你一些东西。希望它有所帮助。