实验4 pi 的计算
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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 );