ARM 指令集仿真实验第四课 - gitee.com · 指令集仿真实验第四课. 1. For. 循环实验补充 有同学提出老师能否讲一下. ARM. 汇编的for 循环语句,我们这门《嵌入式系
补充实验
-
Upload
geraldine-travis -
Category
Documents
-
view
25 -
download
10
description
Transcript of 补充实验
1
补充实验
圆周率的近似计算
算的近似计圆周率π
vpa(pi,101)
ans =
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170680
1 . 圆周率 π 的计算历程所谓“圆周率”是指一个圆的周长与其直径的比值。古今中外,许多人致力于圆周率的研究与计算。为了计算出圆周率的越来越好的近似值,一代代的数学家为这个神秘的数贡献了无数的时间与心血。回顾历史,人类对 π 的认识过程,反映了数学和计算技术发展情形的一个侧面。 π 的研究,在一定程度上反映这个地区或时代的数学水平。德国数学家康托说:“历史上一个国家所算得的圆周率的准确程度,可以作为衡量这个国家当时数学发展水平的指标。”直到 19 世纪初,求圆周率的值应该说是数学中的头号难题。为求得圆周率的值,人类走过了漫长而曲折的道路。
实验时期基于对一个圆的周长和直径的实际测量而得出的。在古代世界,实际上长期使用 π = 3 这个数值。 最早见于文字记载的有基督教《圣经》中的章节,其上取圆周率为 3 。这一段描述的事大约发生在公元前 950 年前后。
几何法时期
真正使圆周率计算建立在科学的基础上,首先应归功于阿基米德。他是科学地研究这一常数的第一个人,是他首先提出了一种能够借助数学过程而不是通过测量的、能够把 π 的值精确到任意精度的方法。由此,开创了圆周率计算的第二阶段。
圆周长大于内接正多边形周长而小于外切正多边形周长. 据说阿基米德用到了正96 边形才算出他的值域。
在中国刘徽:公元 263 年前后,刘徽提出著名的 “割圆术”求出了比较精确的圆周率。他发现:当圆内接正多边形的边数不断增加后,多边形的周长会越来越逼近圆周长,而多边形的面积也会越来越逼近圆面积。于是,刘徽利用正多边形面积和圆面积之间的关系,从正六边形开始,逐步把边数加倍:正十二边形、正二十四边形,正四十八边形……,一直到正三○七二边形,算出圆周率等于三点一四一六,将圆周率的精度提高到小数点后第四位。
在中国祖冲之 : 在刘徽研究的基础上,进一步地发展,经过既漫长又烦琐的计算,一直算到圆内接正24576 边形,而得到一个结论: 3.1415926 < π < 3.1415927 同时得到 π 的两个近似分数:约率为 22/ 7 ; 密率为 355/ 113 。他算出的 π 的 8 位可靠数字,不但在当时是最精密的圆周率,而且保持世界记录九百多年。以致于有数学史家提议将这一结果命名为“祖率”。
分析法时期
这一时期人们开始摆脱求多边形周长的繁难计算,利用无穷级数或无穷连乘积来算 π 。1593 年,韦达( VieTa)给出
这一不寻常的公式是 π 的最早分析表达式。甚至在今天,这个公式的优美也会令我们赞叹不已。它表明仅仅借助数字 2 ,通过一系列的加、乘、除和开平方就可算出 π 值。
接着有多种表达式出现。如沃利斯1650 年给出:
发现了下面的公式
1706 年,英国天文学教授 John Machin 利用
12
1753
arctan12
1753
nxxxx
xxn
n
,2391
arctan451
arctan16
并利用这个公式计算到了圆周率的 100位 .
1914 年,印度数学家 Srinivasa Ramanujan 发表了下面的公式:
0444 99
)263901103()!(4
)!4(22
9801
nnn
nnn
在 1985 年, Gosper 用这个公式计算到了圆周率的 17500000 位.
1989 年 , David 和 Gregory Chudnovsky 发表了下面的公式
,640320
54514013413591409
)!()!3(
)!6()1(12
1
233
03
n
n
n n
nn
n
.
)640320()!3()!()13591409545140134()!6(
10005426880
033
nnnn
nn
并在 1994 年计算到了 4044000000 位.它的另一种形式是
1995 年 , 由 David Bailey,Peter Borwein 和 Simon Plouffe 共同发表了下面的圆周率计算公式(简称 BBP 公式)
.68
158
148
218
4161
0
n
n nnnn
该公式的最大优点在于:经后来人将该公式变形后打破了传统的计算方法,可以直接计算圆周率的任意第 n 位数,而不是先计算前面的 n-1 位数.
1997 年, Fabrice Bellard 发表了一个比BBP 算法更快的公式
0 110
25634
114
321024
1641
n
n
nnn
从而,大大降低了圆周率近似值的计算量 .
.910
1710
4510
4310
64
nnnn
( 1 )
1. 圆周率 的幂级数计算方法
.
Maclaurinarctan
的近似值计算,展开式的利用
x
3 5 1 2 1( 1)arctan .
3 5 2 1
n nx x xx x
n
11 1 ( 1)4arctan 1 4(1 ).
3 5 2 1
n
n
解
).12
)1(51
31
1(41arctan41
n
n
编写下面的程序 :n=10; %选择展开式的次数s=0;digits(22); % 定义计算过程中的精度for k=1:n s=s+4*(-1)^(k+1)/(2*k-1);endvpa(s,20) % 定义显示精度为 20 位
1 14[arctan arctan ]
2 3
,2391
arctan451
arctan16
3 5 2 11
3 5 2 11
1 1 1 1 1 ( 1) 14[
2 3 2 5 2 2 1 2
1 1 1 1 1 ( 1) 1]
3 3 3 5 3 2 1 3
nn
nn
n
n
( 2)
( 3 ) Machin 公式
1 .利用下面的等式计算 的值,并与例()比较
2
21
2 1
21
3 1
31
1( ) ,
8 (2 1)
( 1)( ) ,
12
( 1)( ) ,
32 (2 1)
n
n
n
n
n
an
bn
cn
练习
的数值积分计算方法圆周率.2
.,
]10[
的近似值编写下面的程序计算选取中点为上,等份,在每一个小区间分成,将积分区间
i
n
n=50; % 定义等分积分区间数,可以更改i=0:1/n:1;s=0;for k=1:length(i)-1 s=s+(1/(1+((i(k)+i(k+1))/2)^2))*1/n;end4*s
1
0 2 411
dxx
1
0 211
4 dxx
等分区间数 n
10 3.14242598500110
20 3.14180098689309
50 3.14162598692300
100 3.14160098692312
500 3.14159298692312
1000 3.14159273692313
5000 3.14159265692313
的近似值圆周率
.
1
的近似值圆周率数计算出的给出的是不同等分区间表
表1
数值积分简介
在高等数学中有一类积不出的积分,如
1
1
2
0 4
1
0
2
dxx
dxe x
(概率积分) (椭圆积分)
利用数值积分法
梯形法抛物线法
输入: x=0:0.1:1; y= exp(-x.^2); trapz(x,y)输出: ans = 0.746211
MATLAB命令•梯形方法 —— trapz(x,y) •抛物线方法—— quad(f,a,b)
1
0
2
dxe x如求积分的近似值
y=inline('exp(-x.^2)'); quad(y,0,1)
ans = 0.746826
梯形方法 抛物线方法
梯形方法
x
y
oa
b1x
2x 3x
公式推导:条件: .],[)( 类间断点上连续或有有限个第一在 baxf
当区间划分为 n 等分时
)(b
adxxf
nsss 21
1s2s
3s4s
n
iii
ii xxxfxf
11
1 ))(2
)()((
, ))()(2)((2
)(1
1
bfxfaf
hTdxxf
n
iin
b
a
——trapz(x,y)
1,,2,1 ,
nkkhaxnab
h k 其中
复化梯形方法
当区间等距划分为 n 个子区间时
nkkhaxn
abh
bfxfafh
Tdxxf
k
n
iin
b
a
,,2,1,0 ,
, ))()(2)((2
)(1
1
x
y
oa
b1x
2x 3x 4x 5x
现对每个子区间再二等分,得到 2n 个子区间
nkkhaxn
abh
bfxx
fxfafh
Tdxxf
k
n
i
iin
iin
b
a
,,2,1,0 ,
, ))()2
(2)(2)((4
)(1
11
12
))2
((2
1
1
1
n
i
iin
xxfhT ))
2((
2
1
1
n
in
hihafhT
))()((2
)( 1
bfaf
abTdxxf
b
a
举例 利用复化梯形算法求 Pi 的近似值 .
x0 1
4
y
))2
((2
1
1
4
12
1
0 2
n
inn
hihafhTTdx
x
))()((21 bfafab
T
取
运用复化梯形算法
输入初值:
输出结果: STOP
No
Yes
clear;a=0;b=1;f=inline('4/(1+x*x)');t1=(b-a)/2*(f(a)+f(b));er=1;n=1;while er>1.0e-6
h=(b-a)/n; s=0; for i=1:n s=s+f(a+i*h-h/2); end t2=(t1+h*s)/2; er=abs(t2-t1); fprintf('t=%.6f,r=%.6f\n',t2,er);
n=2*n; t1=t2;end
))2
((2
1
12
n
inn
hihafhTT
抛物线方法
x
y
oa
b1x
2x 3x
分析:
条件:.],[)( 类间断点上连续或有有限个第一在 baxf
1s2s
3s4s 梯形法是对每个子区间用梯形
面积近似曲线下面积累加而成;而抛物线法是对每个子区间考虑其中点,用三点决定的抛物线下面积来近似 .
0y
2/h2/h
1y
2y
)4(6 210 yyyh
S
))()2
(4)((6 3
322
233 xf
xxfxf
xxS
当区间划分为 n(n>1) 等分时
nkkhaxn
abh
xxfxfxfxf
hSdxxf
k
n
k
kkn
n
kkn
b
a
,,2,1,0 ,
, ))2
(4)()(2)((6
)(1
11
10
x
y
oa
b1x
2x 3x 4x 5x
)(3
1 22 nnn TTT
——辛浦生 (Simpson) 方法
))()2
(4)((6 3
3223 xf
xxfxf
hS
clear;a=0;b=1;f=inline('4/(1+x*x)');t1=(b-a)/2*(f(a)+f(b));er=1;s1=0;n=1;
while er>1.0e-6 h=(b-a)/n; s=0; for i=1:n s=s+f(a+i*h-h/2); end t2=(t1+h*s)/2; s=t2+(t2-t1)/3; er=abs(s-s1); fprintf('s=%.6f,r=%.6f\n',s,er); s=s1; n=2*n; t1=t2;
end
s=3.133333,r=3.133333s=3.141569,r=3.141569s=3.141593,r=3.141593s=3.141593,r=3.141593s=3.141593,r=3.141593s=3.141593,r=3.141593s=3.141593,r=3.141593s=3.141593,r=3.141593s=3.141593,r=3.141593s=3.141593,r=3.141593s=3.141593,r=3.141593s=3.141593,r=3.141593s=3.141593,r=3.141593s=3.141593,r=3.141593s=3.141593,r=3.141593s=3.141593,r=3.141593
)(.5 蒙特卡罗法的随机模拟计算方法圆周率
cs=0n=500 %随机取点数for i=1:n a=rand(1,2); if a(1)^2+a(2)^2<=1 cs=cs+1 endend4*cs/n
1
1
0
的近似值分别为圆周率
取算得依次取
50000,5000,3000,1000500,n
3.184000000000003.104000000000003.138666666666673.12080000000000 3.14376000000000
从计算结果看:这种数据模拟算法收敛的速度很慢.虽然在实验次数较少时,算得的近似值距离真实值误差较大,但这种数据模拟方法简单易行.在精度要求不是很高的情况下,这种取随机数进行数据模拟的方法还是有一定的实用价值,通过简单编程我们可以模拟出许多数学现象.