我试图在Matlab中生成三角形概率分布,但没有成功。我在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)
吗?
答案 0 :(得分: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);
击> <击> 撞击>
答案 1 :(得分:2)
此示例使用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')
三角分布,下限 a = 7,模式 m = 10,上限 b = 10。
MATLAB在R2013a中引入了makedist
。需要统计工具箱。
答案 2 :(得分:1)
更改
u = sqrt(rand(n, 1));
到
u = rand(n, 1);
这个公式的优点在于,您可以使用单个随机样本从一般三角形分布中分发样本。