首页 > 其他分享 >用蒙特卡罗方法求p

用蒙特卡罗方法求p

时间:2024-04-30 22:33:41浏览次数:15  
标签:count int MPI 正方形 蒙特卡罗 方法 节点

实验任务:

基于蒙特卡罗思想用MPI程序实现对p值的并行求解

实验目的:

掌握蒙特卡罗算法并行化的实现方法

实现方法:

根据蒙特卡罗方法的思想,我们以坐标原点为圆心作一个直径为1的单位圆,再作一个正方形与圆相切,在这个正方形内随机产生count点,判断是否落在圆内,将落在圆内的点数目计作m,根据概率理论,m与count的比值近似可以看成圆和正方形的面积之比,由于圆的半径为0.5,正方形的边长为1,我们有m/count=p0.5^2/1,则p值可以用以上公式计算:p=4m/count。本实验就采用这一方法来计算p的近似值。

代码示例:

#include"mpi.h"
#include<stdio.h>
#include<stdlib.h>
int main(int argc,char **argv)
{
   int myid,numprocs;
   int namelen,source;
   long count=1000000;
   char processor_name[MPI_MAX_PROCESSOR_NAME];
   MPI_Status status;
   MPI_Init(&argc,&argv);
   MPI_Comm_rank(MPI_COMM_WORLD,&myid);
   MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
   MPI_Get_processor_name(processor_name,&namelen);
   srand((int)time(0));
   double y;
   double x;
   long m=0,m1=0,i=0,p=0;
   double pi=0.0,n=0.0;
   for(i=0;i<count;i++)
   {
       x=(double)rand()/(double)RAND_MAX;
       y=(double)rand()/(double)RAND_MAX;
       if((x-0.5)*(x-0.5)+(y-0.5)*(y-0.5)<0.25)
          m++;
   }
   n=4.0*m/1000000;
   printf("Process %d of %d on %s pi= %f\n",myid,numprocs,processor_name,n);
   if(myid!=0)
   {
       MPI_Send(&m,1,MPI_DOUBLE,0,1,MPI_COMM_WORLD);
   }
   else
   {
       p=m;
       for(source=1;source<numprocs;source++)
       {
          MPI_Recv(&m1,1,MPI_DOUBLE,source,1,MPI_COMM_WORLD,&status);

          p+=m1;
       }
       printf("pi=%f\n",4.0*p/(count*numprocs));
    }
    MPI_Finalize();
}

运行结果:

程序说明:

本例在设计时引入numprocs参数,即总的节点数,通过对参数的使用可以实现在机群节点个数发生变化时不用 对程序作任何修改,我们通常再编写并行程序时都要求能对节点的数目进行动态适应,也就是节点可扩展。在示例中各节点对落入圆内的随机点进行计数,并将计算结果发送到主节点,由主节点对所有数据汇总,并计算p值。系统打印出各节点计算的p值和汇总后的p值。这种p值计算方法收敛速度较慢,但是非常优美,随机数的威力是很强大的。这类算法具有很好的并行化能力,各节点几乎不需要作信息交换,独立完成自己的计算工作。

标签:count,int,MPI,正方形,蒙特卡罗,方法,节点
From: https://www.cnblogs.com/doris510/p/18168796

相关文章

  • public void add(int index, E element)的方法源码分析
    publicclassArrayList<E>extendsAbstractList<E>implementsList<E>,RandomAccess,Cloneable,java.io.Serializable{publicvoidadd(intindex,Eelement){rangeCheckForAdd(index);//校验数组是否越界......
  • useEffect中的deps数组经常依赖了好多变量,甚至包括对象,如何避免这样,假如某个变量变化
    避免在useEffect的依赖数组中包含大量变量或对象,可以通过以下几种策略来优化:拆分useEffect:如果不同的副作用依赖于不同的状态或变量,可以将它们拆分为多个useEffect调用。这样每个useEffect只关注自己关心的依赖项,使逻辑更加清晰且易于维护。useEffect(()=>{//仅当a变化......
  • c#二维矩阵表示方法
    二维矩阵在C#中,可以使用二维数组或者嵌套的List来表示二维矩阵。以下是使用二维数组和List的示例代码。使用二维数组:introws=4;//行数intcols=5;//列数int[,]matrix=newint[rows,cols];//创建二维矩阵//初始化矩阵for(inti=0;i<rows;i++){......
  • cesium 加载各类地图的方法集合
    1.天地图服务//矢量底图viewer.imageryLayers.addImageryProvider(newCesium.WebMapTileServiceImageryProvider({url:"http://t0.tianditu.com/vec_w/wmts?service=wmts&request=GetTile&version=1.0.0&LAYER=vec&tileMatrixSet=w&TileMatrix={T......
  • Go语言系列——数组和切片、可变参数函数、Maps、字符串、指针、结构体、方法、接口(一
    文章目录11-数组和切片数组数组的声明数组是值类型数组的长度使用range迭代数组多维数组切片创建一个切片切片的修改切片的长度和容量使用make创建一个切片追加切片元素切片的函数传递多维切片内存优化12-可变参数函数什么是可变参数函数语法通过一些例子理解可变参......
  • Radash库使用说明——数组方法篇(全)
    写在前面tips:点赞+收藏=学会!本文包含radash中数组相关的所有方法说明+使用示例+思维导图查看这边会整理出一份数组相关方法的使用大纲(不含源码解析),方便大家查阅使用;作者会按照大类进行整理分享,本次也会同步给出Array所有方法的思维导图;所有方法整理完毕后,作者会整......
  • SeetaFace 6 使用方法
    SeetaFaceEngine是一个开源的人脸识别引擎,可以进行人脸检测、人脸关键点检测、人脸识别等操作。首先,你需要下载并编译SeetaFaceEngine,然后在你的项目中链接这个引擎。下面是一个简单的使用SeetaFaceEngine进行人脸检测的例子:#include<seeta/FaceDetector.h>#include<seet......
  • css中内容content部分垂直居中的方法
     1、vertical-align属性让文字居中  vertical-align值有很多,常用的就是middle,bottom,text-bottom等,然而真实使用的时候,我们会发现这个属性“时灵时不灵”,有些情况下我们加了这个属性之后仍然不见img或者text有任何的变化。那是因为vertical-align只作用在inline-block或者inl......
  • 求极限的方法总结
    求极限的方法总结两个重要极限:\(\Large\underset{x\rightarrow0}{\lim}\frac{\sinx}{x}=1\)\(\Large\underset{x\rightarrow\infty}{\lim}(1+\frac{1}{x})^x=e\)1.直接代入函数在某点连续,函数在该点的极限等于该点的函数值一切初等函数在其定义区间内都是连续的,都可......
  • 【转】[C#] 创建返回多个值的方法
    来源:https://mp.weixin.qq.com/s/LqFX32Cb4YeEQMOBYr23jQ在遇到执行方法需要返回多个值的情况时(比如去数据库查一个值,要同时返回数据库查询耗时),可以使用以下方式实现:1、使用TuplesC#中的元组提供了一种返回多个值的方法,而无需定义新的类或结构。让我们浏览一个示例,该示例展示......