如何在Matlab中从截距对数正态分布生成随机数?

如何在Matlab中从截距对数正态分布生成随机数?,matlab,statistics,distribution,random-sample,probability-density,Matlab,Statistics,Distribution,Random Sample,Probability Density,半径r来自截止对数正态分布,其具有以下概率密度函数: pdf=((sqrt(2).*exp(-0.5*((log(r/rch)).^2)))./((sqrt(pi.*(sigma_nd.^2))... .*r).*(erf((log(rmax/rch))./sqrt(2.*(sigma_nd.^2)))-erf((log(rmin/rch))./sqrt(2.*(sigma_nd.^2)))))); rch、sigma\u nd、rmax和rmin都是常量 我从网络上找到了解释,但似乎

半径
r
来自截止对数正态分布,其具有以下概率密度函数:

pdf=((sqrt(2).*exp(-0.5*((log(r/rch)).^2)))./((sqrt(pi.*(sigma_nd.^2))...
    .*r).*(erf((log(rmax/rch))./sqrt(2.*(sigma_nd.^2)))-erf((log(rmin/rch))./sqrt(2.*(sigma_nd.^2))))));
rch
sigma\u nd
rmax
rmin
都是常量


我从网络上找到了解释,但似乎很难找到它的积分,然后在Matlab中求逆。

如果PDF是连续的,那么你可以积分得到CDF,然后找到CDF的逆,并以随机值计算


如果您的PDF不是连续的,那么您可以使用cumsum获得一个离散的CDF,并将其用作interp()中的初始Y值,初始X值与PDF采样时的值相同,并要求在rand()数字数组中进行插值。

我检查过,但我的第一直觉是它看起来像
log(r/rch)
是一个限制为
log(rmin/rch)
log(rmax/rch)
的系统。因此,您可以生成适当的截断正态随机变量,例如
y
,然后
r=rch*exp(y)

通过生成不受信任的值并替换超出限制的值,可以生成截断的正态随机变量。或者,您可以使用CDF来完成,如@PengOne所述,您可以在上找到它


我(仍然)不确定您的p.d.f.是否完全正确,但这里最重要的是发行版。

对于您的发行版来说,这可能有点过分了,但您可以随时编写一份


另一方面,实现是直接进行的,因此您的采样器非常快。

不清楚您的变量是什么,但我假设它是
r

最简单的方法是,如Chris所述,首先获取cdf(注意,如果r从0开始,
pdf(1)
为Nan…将其更改为
0
):

然后生成一个均匀分布(size\u dist表示元素的数量):

然后是沿cdf放置分布的方法。任何技术都可以,但这里是最简单的(尽管不雅观)


我在网上找到了这个解释,但我不能得到它的积分和倒数。你能发布解决方案吗?@S_H你可以用来对PDF进行数字积分。你能描述一下PDF的来源吗?i、 e.基本分布应该是什么。@Nzbuu:请在你的答案中加上注释和更新后的注释。PDF是截距对数正态分布。我想是这样的。生成一个截断的正态r.v.并按描述取指数。嗨,Rasman。谢谢你的回答。按如下方式运行时出错:
???矩形空矩阵赋值不正确。
行上的
x(i)=find(y)(i)确保定义了cdf(vs null)。如果pdf中的任何元素为Nan(例如@0,matlab将计算为Nan;因此我的注释:将其更改为零),cdf定义是否正确(简单地绘制它)?是sum(pdf)实数?您如何定义
r
?如果pdf定义良好(即r>=0的所有值),则cumtrapz(pdf)应生成实数。
cdf = cumtrapz(pdf);
cdf = cdf / cdf(end);
y = rand (size_dist,1);
x = zeros(size_dist,1);
for i = 1:size_dist
    x(i) = find( y(i)<= cdf,1);
end
pdfHist = r(x);
hist (pdfHist,50)