蒙特卡洛方法

目录

一,蒲丰投针问题(Buffon's noodle)

二,求定积分

三,求反常积分

1,无界函数反常积分

2,无穷区间反常积分

四,其他蒙特卡洛方法


一,蒲丰投针问题(Buffon's noodle)

平面内有无穷多条互相平行的直线,任意相邻两条的彼此间隔都是a,

有一条长为l的针,l<=a,把针随机丢在平面内,求针和直线有交点的概率。

解法一:

p=\frac{2}{a}\int_0^{\frac{l}{2}}\frac{2arccos\frac{2y}{l}}{\pi}dy=\frac{2l}{a\pi}

其中的思想是,针的质心的位置和针的方向是两个独立的随机变量。

所以,投针实验可以用来估算π的值。

解法二:

一个直径为a的圆和直线组的交点数量的均值为2,

所以直径为l/π的圆和直线组的交点数量的均值为\frac{2l}{a\pi}

所以长为l的线段和直线组的交点数量的均值为\frac{2l}{a\pi}

因为交点数大于1的概率为0,所以交点数等于1的概率就是\frac{2l}{a\pi}

其中的思想是,交点的数量只和曲线长度有关,而且成正比,与曲线形状无关,证明思路是用折线逼近曲线,

但是总感觉这个证明非常不严谨,因为再短的线段也可能和直线有无穷多交点,这种情况是存在的,只是概率为0,而这种情况对交点数的期望的贡献是否为0?

这个问题可以抽象出一个更简单的核心问题:线段如果就是平行于直线的,但是位置是均匀随机的,那我们是不是可以认为交点个数的均值是线段长度除以a?

关于这方面,可以了解下 Geometric probability,本文不展开讨论了。

 

二,求定积分

要求I=\int_a^bf(x)dx,可以在区间[a,b]内产生n个随机数,计算\frac{b-a}{n}\sum_{i=1}^nf(x_i)

当n越来越大时,它就去趋近于I

例如,求I=\int_1^2\frac{1}{x}dx

代码:

#include<iostream>
#include<time.h>
using namespace std;

int main()
{
    srand(time(NULL));
    int N=30000,num=0;
    double s=0;
    for(int i=0;i<100000;i++){
        int x=rand();
        if(x>=N)continue;
        s+=1/(x*1.0/N+1),num++;
    }
    cout<<s/num;
    return 0;
}

输出:

0.693811

实际上,I=ln2=0.69314718,误差还是比较小的。

这里为了保证随机数的质量,采用了拒绝采样 https://blog.csdn.net/nameofcsdn/article/details/116537214

 

三,求反常积分

1,无界函数反常积分

无界函数反常积分的表达式和定积分完全相同,所以用蒙特卡洛方法来求的步骤也是一样的。

例如,求I=\int_0^1\frac{1}{\sqrt x}dx

代码:

#include<iostream>
#include<time.h>
#include<math.h>
using namespace std;

int main()
{
    srand(time(NULL));
    int N=30000,num=0;
    double s=0;
    for(int i=0;i<1000000;i++){
        int x=rand();
        if(x>=N)continue;
        s+=1/sqrt((x+1)*1.0/N),num++;
    }
    cout<<s/num;
    return 0;
}

输出:

1.98922

实际上,I=2,误差还是比较小的。

2,无穷区间反常积分

设f的反函数是g,则\int_a^{+\infty}f(x)dx=\int_0^{f(a)}g(y)dy-af(a),参考https://blog.csdn.net/nameofcsdn/article/details/116570653

例如,求I=\int_1^{+\infty}\frac{1}{x^2}dx

根据公式,反函数g(x)=\frac{1}{\sqrt x},把I化成无界函数反常积分I=\int_0^1 \frac{1}{\sqrt x}dx-1

其中 \int_0^1\frac{1}{\sqrt x}dx上面已经求过了是2,所以I=1

 

四,其他蒙特卡洛方法

https://blog.csdn.net/nameofcsdn/article/details/115269170

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值