蒙特卡洛算法

蒙特卡罗方法又称统计模拟法、随机抽样技术,是一种随机模拟方法,以概率和统计理论方法为基础的一种计算方法,是使用随机数(或更常见的伪随机数)来解决很多计算问题的方法。将所求解的问题同一定的概率模型相联系,用电子计算机实现统计模拟或抽样,以获得问题的近似解。为象征性地表明这一方法的概率统计特征,故借用赌城蒙特卡罗命名。

一般来说,采样越多,越近似最优解。

【例】用蒙特卡洛模拟法求圆周率pi 
如图,红色线条为平面上圆心在原点的单位圆,圆的面积为pi,黑色线条构成边长为2的正方形 
 
设相互独立的随机变量X,Y均服从[-1,1]上的均匀分布,则(X,Y)服从{-1≤x≤1, -1≤y≤1}上的二元均匀分布(即图中正方形区域上的二元均匀分布),记事件A = {x^2+y^2≤1},则A事件发生的概率等于单位圆面积除以边长为2的正方形的面积,即P(A) = pi/4。

可得圆周率pi = 4P(A). 而P(A)可以通过蒙特卡洛模拟法求得,在图1中正方形内随机投点(即横坐标X和纵坐标Y都是[-1,1]上均匀分布的随机数),落在单位圆内的点的个数m与点的总数n的比值m/n可以作为A事件的概率P(A)的近似,随着投点总数的增加,m/n会越来越接近于P(A),从而可以得到逐渐接近于pi的模拟值 。

function pijisuan = pi(mm)
frq = 0;
%产生一个1*mm大小的矩阵,范围在0-1之间
xrandnum = unifrnd(0,1,1,mm);
yrandnum = unifrnd(0,1,1,mm);
for ii = 1:mm
    if (xrandnum(1,ii)^2 + yrandnum(1,ii)^2 <= 1)
        frq = frq + 1;
    end
end
pijisuan = 4*frq/mm
%在控制台输入pi(m),m为参数,即可得到数值。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

int main()
{
    unsigned long i;
    unsigned long m;
    const unsigned long N=100000000;
    double x,y,pi;
    srand((unsigned)time(NULL));
    for(i=0,m=0;i<N;i++)
    {
        /*x,y在区间(-1,1)*/
        x=2.0*rand()/RAND_MAX-1;、/*产生– 1到1之间的随机数*/
        y=2.0*rand()/RAND_MAX-1;
        if((x*x+y*y)<=1)
        { 
              m++;
        }
    }
    pi=4.0*m/N;
    printf("%lf\n",pi);
    return 0;
}

计算定积分问题

function result = Jifen(a,b,m,mm)
%a是积分下限
%b是积分上限
%m是函数的上界
%mm是随机试验次数
frq = 0;
xrangnum = unifrnd(a,b,1,mm);
yrangnum = unifrnd(0,m,1,mm);
for ii = 1:mm
    if (cos(xrangnum(1,ii)) + 2) >= yrangnum(1,ii)
        frq = frq + 1;
    end
end
result = frq*m*(b-a)/mm
%在命令行中输入Jifen(a,b,m,mm)即可



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

没想好叫什么名字

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值