实验4 pi 的计算

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验三

圆周率π的计算

实验指导书

卢本捷

一.实验目的

1.学习并行计算的初步方法。

二.实验内容

1.用多种方法完成pi的并行计算

三.实验环境

1.两台或以上的Windows 2000,或Windows 2003 或Windows XP,windows vista,windows 7 等。

2.节点的网络互联。

3.VC 6.0 或者 2003 或2005,2008,2010 等

四.实验要求

1.记录实验过程,分析试验现象。

2.记录主要源代码

3.撰写实验报告.

五.MPICH2 实验步骤

1.方法1:积分

π4=∫

1

1+x2

1

=argtgx|(1,0)

对积分进行数值求解即可。

代码如下:

int done = 0, n, myid, numprocs, i,source=0,count=1;

double PI25DT = 3.141592653589793238462643;

double mypi, pi, h, sum, x;

double startwtime = 0.0, endwtime;

MPI_Init(&argc,&argv);

MPI_Comm_size(MPI_COMM_WORLD,&numprocs);

MPI_Comm_rank(MPI_COMM_WORLD,&myid);

while (!done)

{

if (myid == source)

{

fprintf(stdout, "Enter the number of intervals: (0 quits) ");

fflush(stdout);

if (scanf("%d",&n) != 1)

{

fprintf( stdout , "No number entered; quitting\n" ); n = 0;

}

startwtime = MPI_Wtime(); }

MPI_Bcast(&n, count, MPI_INT , source, MPI_COMM_WORLD );

if (n == 0)

done = 1; else {

h = 1.0 / (double ) n; // 前进步长 sum = 0.0;

for (i = myid + 1; i <= n; i += numprocs) // 分成很多的小长条。 每隔numprocs ,就该某进程计算

{

x = h * ((double )i - 0.5); //找到小长条的位置。 0.5 可以不用减。

sum += f(x); // 计算长条的高。

}

mypi = h * sum; // h 是宽度。这样得到面积。 MPI_Reduce(&mypi, &pi, count, MPI_DOUBLE , MPI_SUM , source, MPI_COMM_WORLD ); // 所有进程的工作汇总

if (myid == source)

{

printf("pi is approximately %.16f, Error is %.16f\n", pi, fabs(pi - PI25DT));

endwtime = MPI_Wtime(); // 主进程计时。

printf("wall clock time = %f\n", endwtime-startwtime);

fflush( stdout );

}

}

}

MPI_Finalize();

return 0;

2. 幂级数

tg (π /4)=1

π /4= arctg (1)

对arctg (x )进行幂级数展开:

arctgx =∫dx 1+x

2x 0=∫∑(−x 2)n ∞n=0x 0dx 交换次序=∑∫(−x 2)n x 0∞n=0dx 计算积分得:argtgx=∑(−1)n x 2n+12n+1

∞n=0

所以当x=1 时:

π /4= ∑(−1)n 2n+1∞n=0 因此,算法结构如下:

● 主进程确定一个n 值。

● 将n 传递给所有工作进程

● 每隔numprocess ,工作进程进行计算,求和。

● 所有进程工作汇总即可。

3. 改进的幂级数

以上方法收敛很慢。(每一项衰减得慢),要精确到10−N 大致需要计算2×10N 项。

为提高计算速度采用以下改进的方法:

对于幂级数而言,当x 越接近于0时,收敛越快。 上面的例子中,x=1,离0有相当的距离。

令x=1/5. 记φ=arctg(1/5). tg φ =1/5.

tg2φ= 2tg φ/(1-tg 2φ) = 5/12.

同理tg4φ = 120/119. 而tg (π /4)=1,可见 4φ 与π /4 非常接近(略大一点)。 令 θ =4φ- π /4

所以tg θ =tg(4φ- π /4) = 120119−1120119+1=1239 θ =arctg (1/239).

所以:

π /4 =4φ –θ

= 4 × arctg(1/5)- arctg(1/239)

再利用幂级数展开:

=4 ∑(−1)n ∞n=01(2n+1)52n+1 - ∑(−1)n ∞n=01

(2n+1)2392n+1 上述级数收敛的速度非常快。

左边部分:当n=4时,即有1/9×59 < 10-6

而右边收敛更快。

比较算法设计:

● 完成上述算法的并行化。

● 比较同等精度时的计算速度。

(1) 第一种方法

#include "stdafx.h"

#include "mpi.h"

#include

#include "windows.h"

double f(double );

相关文档
最新文档