我对简单的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;
如何在单个随机数生成中结合两种效果。 谢谢
答案 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