2012-02-11 149 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); 

這個公式的好處是,你可以從一個單一的隨機樣本一般三角形分佈分發樣品。