MPI求计算cosx的定积分

计算定积分

在这里插入图片描述

设计思想

计算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;
}

猜你喜欢

转载自blog.csdn.net/weixin_38023259/article/details/88578759