在matlab范围内生成logormal随机数

时间:2016-02-01 11:28:55

标签: matlab

我们的数据遵循对数正态分布,知道它的平均值= 5.0163,标准差= 1.0571我们要生成并绘制n(6000)样本在范围内(3:7.9) )遵循monte-carlo方法的相同分布 我们有这个代码,但它没有输出所需范围内的样本(所有样本都小于下限)

Data = [ 3 3 3 3 3.3 3.3 3.6 3.9 3.9 3.9 3.9 3.9 3.9 3.9 3.9 3.9 3.9 3.9 3.9 4.2 4.2 4.2 4.2 4.2 4.2 4.5 4.5 4.5 4.5 4.5 4.5 4.5 4.8 4.8 4.8 4.8 4.8 4.8 4.8 4.8 4.8 5.1 5.1 5.1 5.1 5.1 5.1 5.1 5.1 5.1 5.1 5.1 5.1 5.4 5.4 5.4 5.4 5.4 5.4 5.4 5.4 5.4 5.7 6 6 6 6 6 6 6 6 6.3 6.3 6.3 6.3 6.3 6.3 6.3 6.6 6.6 6.6 6.6 6.9 6.9 6.9 7.8];
%draw Lognormal Fit of the data
histfit(Data,[],'lognormal');
% lognormal curve parameters
LN = lognfit(Data);
m=LN(1);
s=LN(2);
% mean and stanard diviation of the associated normal dist.
mu=log(m^2/sqrt(s^2+m^2));
sigma=sqrt(log((s^2/m^2)+1));
%generate random numbers
for i = 1 : 100
X = lognrnd(mu,sigma)
if ((X>=3)&&(X<=7.9))
 X;
end
end

1 个答案:

答案 0 :(得分:0)

由于对分布的支持是无限的(所有正实数),因此无法保证Lognormal distribution中的样本将落在某个(有限)范围内。但是,我们可以调用MATLAB的truncate函数来轻松解决此问题(请参见下文)。

参数化:请注意,如果X〜Normal(mu,sigma),则如果Y = ln(X),则Y〜Lognormal(mu,sigma)。因此,对数正态通常由关联的正态分布参数化。平均值E [Y]不等于mu。

下面的代码对此进行了说明。

mu = 5; 
sigma = 1;
pd = makedist('Lognormal',mu,sigma)
Y = random(pd,50000,1);                 % 50000 Lognormal samples
X = log(Y);  

>> mean(X)                              
ans =
    4.9922
>> std(X)
ans =
    1.0007

限制为[a,b]范围:
给定通过拟合对数正态得到的参数mu和sigma,然后限制为给定的间隔,[a,b]对于MATLAB的概率分布对象(在R2013a中引入)很简单。

mu = 2.5;       % Assume mu & sigma found from fitting 
sigma = 1.4;
pd = makedist('Lognormal',mu,sigma);    % Creates the Lognormal distribution object

a = 10;
b = 100;
N = 10000;
pdT = truncate(pd,a,b);              % Truncates to the interval [a,b]

Y = random(pdT,N,1);                 % Generate samples from truncated Lognormal

区别很明显。

Lognormal & Truncated Lognormal

W = random(pd,N,1);                  % Generate samples from Lognormal 

figure
s(1) = subplot(2,1,1)
histogram(Y,'Normalization','pdf')
xlim([0,125])
s(2) = subplot(2,1,2)
histogram(W,'Normalization','pdf','FaceColor','g','FaceAlpha',0.35)
xlim([0 125])
title(s(2),'Lognormal(\mu=2.5,\sigma=1.4)')
title(s(1),'Lognormal(\mu=2.5,\sigma=1.4) truncated to [10,100]')