matalb——生成离散非均匀随机数
今日感冒,状态非常差,连锁故障风险评估的程序仍然没有调试出bug的问题所在。在和Yu XingBin的交流中发现了程序设计中另外一个问题,会导致程序计算的指标出现较大偏差。
一、问题
连锁故障仿真程序中,第一步就是需要随机选择一条故障线路。起先我认为按照均匀分布产生[1 n]之间的任一随机数(n为总线路数),结果发现仿真结果出现母线分离的概率非常大,远远超过了Yu XingBin论文中的结论。疑惑不解,遂于之邮件交流,得知两点信息:
1.输电线路的故障概率远远大于变压器线路故障概率。因为输电线路很长,并且暴露在外部环境中,易受天气等因素的影响,其故障概率显然大于变压器。
2.输电线路的故障概率近视的认为与线路的长度成正比。
根据以上信息分析可以得知,对于固定拓扑结构的电力网络,故障线路的概率是随机的、离散的,而不是均匀分布的。故障线路的选择应该按照每条线路的故障概率进行抽样。所以需要实现离散非均匀分布的随机整数抽样。
二、解决方案
网上现成有一个解决方案如下: function y=dis_rand(x,p,n)
%dis_rand 产生离散分布随机数
% x:可能取值
% p:取值概率
% n:拟生成随机数的数目
cp=cumsum(p);
y=zeros(1,n);
for i=1:n
y(i)=x(sum(cp<=rand(1))+1);
end
算法说明:利用matlab中的rand函数获取区间[0,1]上均匀分布的随机数,根据希望的分布律把[0,1]区间分段,各段的长度依次为随机数取各个可能值的概率。当那个均匀分布的随机数落在其中第i个小段上时,就把第i个可能取值输出。
例:y=dis_rand([1 :3],[0.4 0.3 0.4],1) 即按照0.4 0.3 0.4的概率从1,2,3三个数字中产生一个随机数。