MPI编程----计算cosx的积分

该博客介绍了使用MPI进行并行计算,通过将积分区间平均分配给多个进程,每个进程独立计算一部分,最终由根进程汇总求得cosx积分的精确结果。随着区间分得更细,误差逐渐减小。
摘要由CSDN通过智能技术生成

原理:

将积分区间平均分成多份,每个进程计算相应的任务,计算完成后通过根进程收集并求和得出答案并计算出相应的误差。
这里写图片描述

代码如下:

#include <stdio.h>
#include "mpi.h"
#include <string.h>
#include<math.h>
#define PI 3.1415926
double my_abs(double x)
{
    if(x <= 0)
        x = x * -1;
    return x;
}
int main(int argc,char **argv)
{
    MPI_Comm comm = MPI_COMM_WORLD;
    MPI_Status status;
    int size,rank,dest;
    char str[100];
    MPI_Init(&argc,&argv);
    MPI_Comm_size(comm,&size);
    MPI_Comm_rank(comm,&rank);
    int n = 100000;        //将区间分成100000份
    double dx = PI / 2 / n;
    if(rank==0)
    {
        double sum,sum1,sum2,sum3,sum4;
        double error_ ;
        MPI_Recv(&sum1,1,MPI_DOUBLE,1,1,comm,&status);     //接收子进程计算结果
        MPI_Recv(&sum2,1,MPI_DOUBLE,2,2,comm,&status);
        MPI_Recv(&sum3,1,MPI_DOUBLE,3,3,comm,&status);
        //MPI_Recv(&sum4,1,MPI_DOUBLE,4,4,comm,&status);
        sum = sum1 + sum2 + sum3;
        error_ = (1 - my_abs(1 - my_abs(sum))) * 100;       //计算误差
        printf("result is : %lf\n",sum);
        printf("right is : %lf%% \n",error_);
    }
    else if(rank==1)
    {
        double aij = 0;
        double sum = 0;
        int i = 0;
        //while(aij + i * dx <= PI / 2)
        while(i <= n)                     //计算积分
        {
            sum += dx * cos(aij + dx / 2);
            i++;
            aij += dx;
        }
        MPI_Send(&sum,1,MPI_DOUBLE,0,1,comm);//将计算结果发给根进程
    }
    else if(rank==2)
    {
        double aij = PI / 2;
        double sum = 0;
        int i = 0;
        while(i <= n)
        {
            sum += dx * cos(aij + dx / 2);
            i++;
            aij += dx;
        }
        MPI_Send(&sum,1,MPI_DOUBLE,0,2,comm);
    }
    else if(rank==3)
    {
        double aij = PI;
        double sum = 0;
        int i = 0;
        while(i <= n)
        {
            sum += dx * cos(aij + dx / 2);
            i++;
            aij += dx;
        }
        MPI_Send(&sum,1,MPI_DOUBLE,0,3,comm);
    }
    /*
    else if(rank==4)
    {
        double aij = 3*PI /2;
        double sum = 0;
        int i = 0;
        while(aij + i * dx <= PI*2)
        {
            sum += dx * cos(aij + dx / 2);
            i++;
        }
        MPI_Send(&sum,1,MPI_DOUBLE,0,4,comm);
    }
    */
    MPI_Finalize();
    return 0;
}

运行结果:

如图所示,区间分的份数越多,误差越小。
这里写图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值