在Matlab中生成三角形分布

时间:2012-02-11 16:36:38

标签: matlab random distribution probability

我试图在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);

直方图如下所示:

enter image description here

对我来说看起来不像三角形。有什么问题?我在滥用rand(n)吗?

3 个答案:

答案 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)

此示例使用makedistpdf命令。

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。
Triangular Distribution


MATLAB在R2013a中引入了makedist。需要统计工具箱。

参考:
Triangular Distribution

答案 2 :(得分:1)

更改

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

u = rand(n, 1);

这个公式的优点在于,您可以使用单个随机样本从一般三角形分布中分发样本。