gpt4 book ai didi

Matlab:拒绝抽样

转载 作者:行者123 更新时间:2023-12-01 11:50:20 25 4
gpt4 key购买 nike

当我运行蒙特卡洛模拟时,我只想从正态分布的尾部([-5sigma,-3sigma] 和 [3sigma,5sigma])进行采样,因此想到了拒绝采样。然而,我正在努力在 Matlab 中实现这一点。到目前为止,我一直在使用类似于下面代码的东西(我知道这不是拒绝抽样),但是拒绝抽样是解决这个问题的更好方法吗?

function [new_E11] = elasticmodulusrng()

new_E11 = normrnd(136e9,9.067e9,[1 1]);

while new_E11>=136e9-3*9.067e9 && new_E11<=136e9+3*9.067e9
new_E11 = normrnd(136e9,9.067e9,[1 1]);
end

谢谢

编辑:在答案中使用代码 enter image description here

最佳答案

mu=0
sigma=1
%get scaling factor
scale=(normcdf(5*sigma+mu,mu,sigma)-normcdf(3*sigma+mu,mu,sigma))*2
%define pdf
cpdf=@(x)((1/scale)*normpdf(x,mu,sigma).*((abs(x-mu)<5.*sigma)&(abs(x-mu.*sigma)>3)))
%get cdf via integral
ccdf=@(x)integral(cpdf,mu-5.*sigma,x)
%allow vector inputs
ccdf=@(x)arrayfun(ccdf,x)

%inverse cdf
icdf=@(y)(fzero(@(x)(ccdf(x)-y),.5));
%allow vector inputs
icdf=@(x)arrayfun(icdf,x);
%icdf is very slow, thus evaluate some numbers and use the cached and interpolated version:
cachedicdf=nan(n+1,1);
x=0:0.01:1;
y=icdf(x);
icdf=@(uni)interp1(x,y,uni);
%plot some example data
hist(icdf(rand(10000000,1)),1000);

准确性不是我所期望的,但我会把它留在这里。也许有人能够改进代码。

关于Matlab:拒绝抽样,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22437218/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com