用蒙特卡罗方法求积分

实验任务

采用 Monte-Carlo 法计算函数 y=x0~10 之间的积分值

实验目的

熟悉 MPI_Reduce() 函数的用法

实验方法

该算法的思想是通过随机数把函数划分成小的矩形块,通过求矩形块的面积和来求积分值,我们生成 n0~10 之间的随机数,求出该随机数所对应的函数值作为矩形的高,由于随机数在 n 很大时会近似平均分布在 0~10 区间,所以矩形的宽取相同的值为 10/n ,对所有的矩形块求和即可得函数的积分值。

代码示例

/*文件名 inte.c*/ 
#define N 100000000 
#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 
#include "mpi.h" 
int main(int argc, char** argv) 
{ 
int myid,numprocs; 
int i; 
double local=0.0; 
double inte,tmp=0.0,x; 
MPI_Init(&argc, &argv); 
MPI_Comm_rank(MPI_COMM_WORLD, &myid); 
MPI_Comm_size(MPI_COMM_WORLD,&numprocs); 
srand((int)time(0));//设置随机数种子 
/*各节点分别计算一部分积分值*/ 
/*以下代码在不同节点运行的结果不同*/

程序说明

以上程序通过随机数将积分区域划分为 100000000 个小的区域,各节点计算一部分小矩形的面积,最后通过 MPI_Reduce()函数对所有节点的计算结果进行归约求和得到最后的积分值,归约的过程就是各节点向主节点发送数据,由主节点接收数据并完成指定的计算操作,这一思想与云计算中Map/Reduce 思想类似,都是将任务分配到各节点计算最后由主节点汇总结果。程序通过 myid 和 numpros 参数的配合使同一段程序在不同的节点运行时完成不同部分的积分工作,这利用了 MPI 并行编程中变量分布式存储的原理,不同的节点其 myid 值是不同的。可见在 MPI 中会出现相同的代码在不同的节点执行时结果不一样的情况,这在串行程序中是不会出现的。
运行结果
posted @ 2024-05-06 18:15  棒打鲜橙不加冰  阅读(10)  评论(0编辑  收藏  举报