Matlab中特定范围内的对数正态随机数

时间:2010-06-18 13:55:22

标签: matlab distribution preconditions

我想开发一个范围为[0.42,1.19]的对数正态分布,其少数元素以D=[1.19,1.00,0.84,0.71,0.59,0.50,0.42]给出。平均值应为0.84,标准差尽可能小。还给出了90%的cdf(= 90%的晶粒)位于0.59 and 1.19之间。

一旦我知道这个对数正态分布的所有元素,其中包含给定的条件,我就可以找到它的pdf,这就是我的要求。以下是我尝试的简单步骤:

D=[1.19,1.00,0.84,0.71,0.59,0.50,0.42];

s=0.30; % std dev of the lognormal distribution

m=0.84; % mean of the lognormal distribution

mu=log(m^2/sqrt(s^2+m^2)); % mean of the associated normal dist.

sigma=sqrt(log((s^2/m^2)+1)); % std dev of the associated normal dist.

[r,c]=size(D);

for i=1:c

D_normal(i)=mu+(sigma.*randn(1));

w(i)=(D_normal(i)-mu)/sigma; % the probability or the wt. percentage

end

sizes=exp(D_normal);

2 个答案:

答案 0 :(得分:1)

如果您有统计工具箱,并且想要从对数正态分布中绘制随机值,则只需调用LOGNRND即可。如果您想知道具有特定值的给定均值和西格玛的对数正态分布的密度,请使用LOGNPDF

由于您正在计算权重,因此您可能正在寻找密度。在你的例子中,这些将是:

weights = lognpdf([1.19,1.00,0.84,0.71,0.59,0.50,0.42],0.84,0.3)

weights =
     0.095039     0.026385     0.005212   0.00079218   6.9197e-05   5.6697e-06   2.9244e-07

修改

如果你想知道谷物的百分比在0.59到1.19的范围内,你可以使用LOGNCDF

100*diff(logncdf([0.59,1.19],0.84,0.3))
ans =
       1.3202

这不是很多。如果您绘制分布图,您会注意到具有您的值的对数正态分布峰值略高于2

x = 0:0.01:10;
figure
plot(x,lognpdf(x,0.84,0.3))

答案 1 :(得分:0)

您似乎希望生成截断的对数正态随机数。如果我的假设是正确的,您可以使用rejection samplinginverse transform sampling生成必要的样本。警告:如果您的界限与平均值相差很远,则拒绝抽样效率非常低。

拒绝抽样

如果x~LogNormal(mu,sigma)I(lb< x< ub)

然后生成,x~LogNormal(mu,sigma)并接受绘制,如果lb< x< UB。

逆变换采样

如果x~LogNormal(mu,sigma)I(lb< x< ub)那么

CDF(x)= phi((log(x)-mu)/ sigma)/(phi((log(ub)-mu)/ sigma) - phi((log(lb)-mu)/ sigma) )

生成,u~Uniform(0,1)。

设置,CDF(x)= u并反转为x。

换句话说,

x = exp(mu + sigma * phi_inverse(u *(phi((log(ub) - mu)/ sigma) - phi((log(lb) - mu)/ sigma))))