创建随机数行范围和总和中的向量应等于M

时间:2016-01-04 13:06:08

标签: matlab random numbers

我对简单的MATLAB随机数生成问题非常困惑。我知道它看起来愚蠢和基本水平一些如何,但我之前尝试过谷歌,但找不到任何有用的解决方案。

我有这样的界限

  Lb = [150,100,150]; %in MW
  Ub = [600,400,200]; %in MW
  Pd = 850;   %in MW

我想创建一个随机猜测,其总和将等于Pd,并且应该在Lower和Upper Bounds的限制范围内。

我能够在像这样的

范围内生成行向量
        `u0=Lb+(Ub-Lb).*rand(1,d);`

我知道要产生随机数,其总和等于Pd可以像这样获得

u0=rand(1,d);
u0=u0/sum(u0);
u0=u0*Pd;

如何在单个随机数生成中结合两种效果。 谢谢

1 个答案:

答案 0 :(得分:2)

这并不像看起来那么容易,因为绑定会对问题产生一些额外的限制:

1)您当前的解决方案:

您的更正代码(如评论中@il_raffa所述)如下所示:

Lb = [150,100,150]; %in MW
Ub = [600,400,200]; %in MW
Pd = 850;   %in MW
d=3;

u0=Lb+(Ub-Lb).*rand(1,d) % Output before normalization

u0=(u0/sum(u0))*Pd % Output after normalization

输出:

u0 =

  516.6257  371.7376  156.3493 % Before Normalization

u0 =

  420.3374  302.4535  127.2091 % After Normalization

正如您所看到的,u0元素的总和远大于Pd u0中的第三个值非常接近下限。因此,在标准化之后,u0中的第三个值低于相应的下限。

@CarlWitthoft在评论中提出的解决方案也会出现类似的问题。生成n-1个随机数后,使总和等于Pd的第n个数字可能不在限定范围内。

2)结论:

在我看来,唯一的方法就是迭代直到找到解决方案,这样就可以了:

Lb = [150,100,150]; %in MW
Ub = [600,400,200]; %in MW
Pd = 850;   %in MW
d=3;

u0=[Inf Inf Inf];

while(~all((u0>Lb).*(u0<Ub))) 

u0=Lb+(Ub-Lb).*rand(1,d);

u0=(u0/sum(u0))*Pd;

end

输出

u0 =

533.9384  134.6124  181.4492