我试图生成在Matlab三角概率分布,但没有成功。所用式I在http://en.wikipedia.org/wiki/Triangular_distribution。
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);
直方图看起来就像这样:
看起来并不像很多三角形给我的。有什么问题?我是不是滥用rand(n)
?
您可以添加两个均匀分布的分布图卷积,你会得到一个三角形分布。
易于理解的例子:滚动两个骰子,每个动作有均匀的分布,以导致从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);
此示例使用makedist
和pdf
命令。
a = 2; m = 7; b = 10;
N = 50000;
pd = makedist('Triangular',a,m,b); % Create probability distribution object
X = (0:.1:12);
T = random(pd,N,1); % Generate samples from distribution
figure, hold on, box on
histogram(T,'Normalization','pdf')
title([num2str(N) ' Samples'])
plot(X,pdf(pd,X),'r--','LineWidth',1.8)
legend('Empirical Density','Theoretical Density','Location','northwest')
三角形分布具有下界一个= 7,模式M = 10,和上界B = 10。
MATLAB在R2013a介绍makedist
。需要统计工具箱。
更改
u = sqrt(rand(n, 1));
至
u = rand(n, 1);
这个公式的好处是,你可以从一个单一的随机样本一般三角形分布分发样品。