如何用带权重的蒙特卡洛数值积分?

数值积分

有时会碰到一些难以表示成一般代数形式的积分,特别是在工程上,而且工程计算时一般也不需要精确的代数表达式,往往只要一定精度的数值结果。因此如何数值计算定积分呢?

为了便于比较,我们计算如下积分:
∫ 0 1 1 1 + x 2 = arctan ⁡ x ∣ 0 1 = π 4 ≈ 0.7854 \int_0^1 \frac{1}{1+x^2}=\arctan x|_0^1=\frac{\pi}{4}\approx{0.7854} 011+x21=arctanx01=4π0.7854

均匀取点

%matlab code
clear;
x=linspace(0,1,200); %平均分成200个样本
y=1./(1+x.^2);
int=mean(y) %结果为0.7852

均匀取点在积分曲线比较平缓时,效果较好,如果有变化快的地方,需要单独做更加密集的取点,这个例子中曲线比较平缓,故精度相对较高。

均匀分布的蒙特卡洛取点

%matlab code
clear;
x=rand(1,200);%产生(0,1)区间均匀分布的200个随机数
y=1./(1+x.^2);
int2=mean(y)  %结果介于0.76~0.80

从效果上看,均匀分布的蒙特卡洛法不如均匀取点,会有涨落,精度不高,是否用更高精度的方法?观察图像 f ( x ) = 1 1 + x 2 f(x)= \frac{1}{1+x^2} f(x)=1+x21:
fx.jpg

我们发现函数单调递减,那么我们在蒙特卡洛取点时,是否可以在x=0附近多取一些,x=1附近少取一些?比如我们按概率密度取点:
w = 4 3 ( 2 − x ) w=\frac{4}{3}(2-x) w=34(2x)
这个概率分布有以下特点:1、首先是一次函数,容易处理;2、x=0处和x=1处的概率比为2:1。最后由归一性可以确定系数。那么该如何产生这样的随机数呢?matlab有内置算法吗?请参看Matlab如何用均匀分布产生其他分布?

%matlab code
clear;
x=rand(1,200);
w=2-sqrt(4-3*x);
I=1./(1+w.^2)./(4-2*w)*3;
int3=mean(I)  %结果介于0.783~0.787

效果提高不少!可以猜想,如果我们选取的概率密度函数越接近原函数,那么蒙特卡洛的结果就越准确,但代价是求解反函数的过程会越复杂,需要折中。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值