蒙特卡洛方法估算圆周率

Posted object-oriented-design-and-ana

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了蒙特卡洛方法估算圆周率相关的知识,希望对你有一定的参考价值。

圆周率的近似计算方法
      使用蒙特卡洛方法估算圆周率,具体思路如下:
      思考一个边长为 s 的正方形,它的内接圆和正方形的面积之比为 πr2/4 r2 = π/4。由此可以在正方
形的面积范围内产生大量(n 个,需要足够大)随机的点,再统计这些点在圆的范围内的数量 m。则
π/4 = m/n,由此可估算 π 的值。

工程设计思路

       在平面直角坐标系内随机选取一个坐标点,假定该坐标点为矩形左上角的位置,同时输入该矩形的

长和宽,由于本例中要求矩形为正方形,所以必须要求输入的该矩形场合宽务必相等,以上均为系

统的输入。
        据此,可以求出该正方形内接圆的圆心坐标点及半径。然后就可以通过随机数方法获取落于正方
形之内的坐标点,同时统计落在圆内的点的个数,由此就可以估算出 π 的值。

做题准备:(随机数的产生)

        已知矩形的左上角坐标(Abscissa,Ordinate)以及长Length宽Width,在该矩形范围内产生n个随机数。由于Math.radom()是随机产生(0,1)之间的随机数,故(最小值,最大值)之间的随机数=Math.radom()*(最大值-最小值)-最小值。

        该题的横坐标范围是(Abscissa,Abscissa+Length),纵坐标范围是(Ordinate-Width,Ordinate),由此可以知道落于正方形之内的坐标点x=Math.random()*(Length)+Absciss与 y=Math.random()*(Width)+(Ordinate-Width)
          

 

public double simulation(int count) {// 模拟
        int s=0;
        MonteCarloSimulation w=new MonteCarloSimulation(rectangle);
        double r1=w.getRectangle().getCoordinate().getAbscissa()+w.getRectangle().getLength()/2;//由左上角坐标和长宽获得圆心的横坐标
        double r2=w.getRectangle().getCoordinate().getOrdinate()-w.getRectangle().getWidth()/2;//获得圆心的纵坐标
        for (int i=0;i<count;i++) {
            double x=Math.random()*(w.getRectangle().getLength())+w.getRectangle().getCoordinate().getAbscissa();//随机产生落入矩形范围内横坐标
            double y=Math.random()*(w.getRectangle().getWidth())+(w.getRectangle().getCoordinate().getOrdinate()-w.getRectangle().getWidth());//随机产生落入矩形范围内的纵坐标
            if (Math.sqrt((x-r1)*(x-r1)+(y-r2)*(y-r2))<w.getRectangle().getWidth()/2)//如果随机产生的点到圆心的距离小于圆的半径
                s++;    //计数器加一
        } 
        return (double)4*s/count;//返回的是估计的圆周率
    }

 

以上是关于蒙特卡洛方法估算圆周率的主要内容,如果未能解决你的问题,请参考以下文章

利用蒙特卡洛方法对面积进行近似估算

Python蒙特卡罗计算圆周率PI——Numpy性能优化

python模拟蒙特卡罗法计算圆周率的近似ŀ

python模拟蒙特卡罗法计算圆周率的近似值

计算思维:蒙特卡罗方法求“圆周率”

数据分析之蒙特卡洛模拟