生成在Matlab三角分布

问题描述 投票:1回答:3

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

matlab random distribution probability
3个回答
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);


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')

三角形分布具有下界一个= 7,模式M = 10,和上界B = 10。 Triangular Distribution


MATLAB在R2013a介绍makedist。需要统计工具箱。

参考: Triangular Distribution


1
投票

更改

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

u = rand(n, 1);

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

© www.soinside.com 2019 - 2024. All rights reserved.