2012-02-11 106 views
1

我试图在Matlab中生成三角形概率分布,但没有成功。我使用公式http://en.wikipedia.org/wiki/Triangular_distribution在Matlab中生成三角形分布

n = 10000000; 

a = 0.2; 
b = 0.7; 
c = 0.5; 

u = sqrt(rand(n, 1)); 

x = zeros(n, 1); 
for i = 1:n 
    U = u(i); 
    if U < (c-a)/(b-a) 
     X = a + sqrt(U*(b-a)*(c-a)); 
    else 
     X = b - sqrt((1-U)*(b-a)*(b-c));   
    end 
    x(i) = X; 
end 

hist(x, 100); 

直方图看起来像这样:

enter image description here

看起来不像很多三角形给我的。有什么问题?我在滥用rand(n)

回答

5

您可以将两个均匀分布相加,分布图将进行卷积运算,然后得到三角形分布。

易于理解的例子:滚动两个骰子,每个动作有均匀的分布,以导致从1-6的数字,合并动作具有三角形分布以导致数2-12

编辑:最小工作示例:

a=randint(10000,1,10); 
b=randint(10000,1,10); 

c=a+b; 

hist(c,max(c)-min(c)+1) 

edit2:再次查看您的脚本。它的工作,但你已经犯了一个错误:

u = sqrt(rand(n, 1)); 

应该

u = rand(n, 1); 

EDIT3:优化代码

n = 10000000; 

a = 0.2; 
b = 0.7; 
c = 0.5; 

u = rand(n, 1); 
x = zeros(n, 1); 

idx = find(u < (c-a)/(b-a)); 
x(idx) = a + sqrt(u(idx)*(b-a)*(c-a)); 
idx =setdiff(1:n,idx); 
x(idx) = b - sqrt((1-u(idx))*(b-a)*(b-c)); 
hist(x, 100); 

+0

那真是愚蠢的我。谢谢! – Superbest 2012-02-11 16:59:42

+1

两种制服的总和是迄今为止最简单的方法。但是,您也可以反转CDF,只需要一个rand调用,但数学稍微多一点。 – 2012-02-11 17:41:58

+1

是的,两套制服的总和是最简单的,但它对于对称的三角形分布只是有用的。 topicstart中的代码允许任何三角形形状。顺便说一句,我相信你仍然可以通过使用逻辑索引来优化该代码,以消除循环.. – 2012-02-11 19:29:18

1

变化

u = sqrt(rand(n, 1)); 

u = rand(n, 1); 

这个公式的好处是,你可以从一个单一的随机样本一般三角形分布分发样品。