计算定积分
设计思想
计算cos(x)中从0-2π的定积分,基本思想,分成p块,每一块都是平均分成n个小区,然后n可以初始化定义也可以输入,n理论上越小,精确值越高,用长方形的面积累加表示区间面积,利用的是高数的原理,然后mpi内的:使用send和recv ,比如:
输入5个进程,利用前四个进程计算面积,然后把每个的计算结果发送到最后一个进程,输出结果。
结果验算(π/2下):
(0-2π之内)可见进程数p越多,也就是n划分的越小,得出的数据越精确,但是进程数越多消耗的时间越长。
#include <stdio.h>
#include <string.h>
#include <math.h>
#include "mpi.h"
#define PI 3.141592654
int main(int argc, char**argv)
{
int rank, size;
double a,b;//区间ab
a = 0;
b = 2*PI;
MPI_Comm comm = MPI_COMM_WORLD;
MPI_Status status;
MPI_Init(&argc, &argv);
MPI_Comm_size(comm, &size);
MPI_Comm_rank(comm, &rank);
int p;//p用于计算的进程数,比总进程少一,n为每个进程的小块数,h为宽度
p = size-1;
int n;
n = 10;
double h;
h = (b-a)/p/n;
if (rank == size -1) //最后一块进程计算总和
{
int j;
j = 0;
double tem;
double sum = 0;
for (j = 0; j < size-1; j++)
{
MPI_Recv(&tem, 1, MPI_DOUBLE, j, 99, comm, &status);
sum = sum + tem;
}
printf("cos sum from %f to %f of process %d is %f.\n", a, b, rank, sum);
}
else
{
int j;
j = 0;
double sump = 0;
for (j = 0; j < n; j++)
{
sump = sump + cos(a+(rank*n+j)*h+h/2)*h ;
}
MPI_Send(&sump, 1, MPI_DOUBLE, size-1, 99, comm);
printf("cos sum from process %d is %f.\n", rank, sump);
}
MPI_Finalize();
return 0;
}