华北科技学院
实 验 报 告
课程名称
数值计算
学生所在院部
理学院
学生姓名 陈硕
学号 201809014223
任课教师
郑 宇
理学院制
一、 实验目的
华北科技学院实验报告
1. 通过计算结果分析迭代函数对收敛性的影响;
2. 通过计算结果分析初值的选择对收敛性的影响;
3. 通过计算结果比较几种经典算法的收敛速度。
二、 实验题目
非线性方程求根实验
1. 迭代函数对收敛性的影响:
实验题目:用简单迭代法求方程
3)(f
x
3
x
4
x
01
方案一 化方程为简单不动点方程
取初值 x0=0.5,迭代 8 次。
方案二 化方程为等价方程
x
43
1
x
3
)(
x
x
1
3 3
x
4
)(
x
取初值 x0=0.5,迭代 8 次,观察其计算结果并加以分析。
2. 初值的选择对收敛性的影响:
实验题目:用牛顿法求方程
)(
xf
3
x
01
x
在 x=0.5 附近的根
方案一 使用牛顿法并取初值 x0=0.5,由
x
k
1
x
k
(
xf
k
('
f
x
k
)
)
得
x
k
1
x
k
1
x
3
k
3
x
x
k
2
k
1
2
3
x
x
3
k
2
k
1
1
迭代 6 次。
方案二 取初值 x0=0.0,使用同样的公式
x
k
1
x
k
1
x
3
k
3
x
x
k
2
k
1
2
3
x
x
3
k
2
k
1
1
迭代 6 次,观察并比较计算结果,分析原因。
第 1 页
3. 几种经典算法的比较
华北科技学院实验报告
实验题目:求方程
)(
xf
3
x
cos
x
5
x
01
的全部根
方案一 用牛顿方程求解:
x
k
1
x
k
(
xf
k
('
f
x
k
)
)
x
k
x
3
k
cos
2
3
x
k
x
k
sin
x
5
k
x
k
5
1
;
方案二 用简单迭代法求解:
x
k
1
3
cos
x
k
5
x
k
1
;
方案三 用埃特金迭代加速法求解:
z
k
(
(
),
x
y
k
k
x
k
1
y
x
y
k
2
y
k
)
k
k
)
2
x
k
,
k
...1,0
x
k
z
k
其中,
)(
x
3
cos
x
5
x
1
取相同的迭代初始值,比较各方法的收敛速度
三、 实验原理
不动点迭代法基本原理:通过某种等价变换,可将非线性方程 f(x)=0 改写成 x=
)x
其中, )(x 为连续函数。给定初始值 x0 后,课构造迭代计算公式
(
x
k
1
x
k
)
(k=0,1,2,...)
从而得到近似解序列{ kx }。
牛顿迭代法基本原理:从几何角度看,就是讲切线与横轴交点处的 x 值作为下一步
近似解。采用点斜式公式,切线方程为
解方程 P(x)=0,得到牛顿迭代法的迭代计算公式:
)(
xP
(
xf
k
)
(
x
x
k
)
f
('
x
k
)
x
k
1
x
k
(
xf
k
('
f
x
k
)
)
迭代收敛速度:达到特定的准确度需要多少步迭代,也就是需要多少计算量
第 2 页
四、 实验内容
华北科技学院实验报告
1. 迭代函数对收敛性的影响:
以不同的方式得到方程的等价形式,选择同一初值 x0=0.5 代入迭代方程,比
较计算结果,研究响应的不动点迭代法的收敛情况。
2. 初值的选择对收敛性的影响:
选择不同的初值 x0=0.5,x0=0.0 代入牛顿迭代方程,比较计算结果,研究初值
的选择是否会对收敛性造成影响
3. 几种经典算法的比较:
选择同以初值 x0=2.0,分别代入牛顿法迭代方程、简单迭代方程和埃特金收
敛加速法迭代方程,观察计算结果,比较不同算法的收敛速度
五、 实验结果和分析:
1. 迭代函数对收敛性的影响:
将原方程改为等价的方案一、方案二两种形式,得到下属两种不动点迭代法。
方案一 化方程为简单不动点方程
x
3
取初值 x0=0.5,迭代 8 次,计算出的结果如下:
43
x
1
迭代次数 1
Xk
0.6934
2
0.8393
3
0.9227
)(
x
5
0.9839
6
0.9928
7
0.9967
8
0.9985
4
0.9644
从上述计算结果看,序列{ kx }有趋于无穷大的趋势,爹大幅不收敛,无法求出近似
解。
方案二 化方程为等价方程
x
1
3 3
x
4
)(
x
迭代次数 1
Xk
取初值 x0=0.5,迭代 8 次,计算出的结果如下:
5
0.2638
8
0.2638
从上述计算结果看,x7 和 x8 前 5 位有效数字均为 0.2638,可认为迭代过程是收敛
的,要求的根为 0.2638
2
0.2805
3
0.2665
4
0.2642
6
0.2637
7
0.2638
0.3437
方案一、方案二计算结果对比可以看出,用不同的方式改造原方程,可得到多种不
动点迭代法计算过程,其收敛性质也不同。
2.初值的选择对收敛性的影响:
方案一 使用牛顿法并取初值 x0=0.5,由
x
k
1
x
k
(
xf
k
('
f
x
k
)
)
第 3 页
得
华北科技学院实验报告
x
k
1
x
k
1
x
3
k
3
x
x
k
2
k
1
2
3
x
x
3
k
2
k
1
1
迭代 6 次,计算结果如下:
迭代次数 1
Xk
2
0.6832
0.7143
3
0.6823
4
0.6823
5
0.6823
6
0.6823
从上述计算结果看出,x3、x4、x5、x6 前 5 位有效数字均为 0.6823,可认为迭
代过程是收敛的,要求的根为 0.6823
方案二 取初值 x0=0.0,使用同样的公式
x
k
1
x
k
1
x
3
k
3
x
x
k
2
k
1
2
3
x
x
3
k
2
k
1
1
迭代 6 次,计算结果如下:
迭代次数 1
Xk
1.0
2
0.75
3
0.6860
4
0.6823
5
0.6823
6
0.6823
从上述计算结果看出,x4、x5、x6 前 5 位有效数字均为 0.6823,可认为迭代过
程是收敛的,要求的根为 0.6823。
方案一、方案二计算结果对比可以得出,选择不同的初值会对迭代收敛的速度有所
影响,但不影响收敛的性质。
3.几种经典算法的比较
方案一 用牛顿方程求解:
x
k
1
x
k
(
xf
k
('
f
x
k
)
)
x
k
x
3
k
cos
2
3
x
k
x
k
sin
x
5
k
x
k
5
1
;
迭代 8 次,计算结果如下:
迭代次数 1
Xk
2.3267
2
2.2725
3
2.2708
4
2.2708
5
2.2708
6
2.2708
7
2.2708
8
2.2708
从表中数据可以看出,到第四步迭代,解的前 5 位有效数字已经不变化了,迭代过
程收敛的较快
方案二 用简单迭代法求解:
x
k
1
3
cos
x
k
5
x
k
1
;
迭代 8 次,计算结果如下:
迭代次数 1
Xk
2.1956
2
2.2501
3
2.2651
4
2.2692
5
2.2704
6
2.2708
7
2.2708
8
2.2708
从表内数据可以看出,到第七步迭代时,解的前 5 位有效数字已经不变化了,迭代
过程收敛的较慢
方案三 用埃特金迭代加速法求解:
第 4 页
y
k
华北科技学院实验报告
)
(
2
),
x
k
x
k
1
x
k
z
k
(
z
k
y
x
y
k
2
y
k
)
k
k
x
k
,
k
...1,0
迭代 3 次,计算结果如下:
其中,
)(
x
3
cos
x
5
x
1
迭代次数
1
2
3
Xk
2.2713
2.2708
2.2708
从表内数据可以看出,到第三步迭代时,解的前 5 位有效数字已经不变化了,迭代
过程收敛的很快
方案一、方案二、方案三计算结果对比可以得出,选择初值相同时,埃特金迭代加
速法收敛速度最快,牛顿迭代法收敛速度较快,简单迭代法收敛速度最慢。
六、 附录
代码及运行结果:
#1.方案一
x = 0.5
for i in range(8):
x = pow((4*x-1)/3.0,1/3)
print('第'+str(i+1)+'次的迭代结果为'+str(x))
#输出:
# 第 1 次的迭代结果为 0.6933612743506347
# 第 2 次的迭代结果为 0.839264457114505
# 第 3 次的迭代结果为 0.9227477487920787
# 第 4 次的迭代结果为 0.9644143487133259
# 第 5 次的迭代结果为 0.9839272042752456
# 第 6 次的迭代结果为 0.9928048897851239
# 第 7 次的迭代结果为 0.9967918922886454
# 第 8 次的迭代结果为 0.9985721365267841
1.方案二
x = 0.5
for i in range(8):
x = (3.0*x**3+1.0)/4.0
print('第'+str(i+1)+'次的迭代结果为'+str(x))
# #输出:
第 5 页
华北科技学院实验报告
# 第 1 次的迭代结果为 0.34375
# 第 2 次的迭代结果为 0.28046417236328125
# 第 3 次的迭代结果为 0.26654601581715853
# 第 4 次的迭代结果为 0.2642029268189602
# 第 5 次的迭代结果为 0.2638316546388099
# 第 6 次的迭代结果为 0.2637734255843168
# 第 7 次的迭代结果为 0.2637643079912704
# 第 8 次的迭代结果为 0.26376288070926884
#2.方案一
x = 0.5
for i in range(6):
x =(2.0*x**3+1.0)/(3.0*x**2+1.0)
print('第'+str(i+1)+'次的迭代结果为'+str(x))
# #输出:
# 第 1 次的迭代结果为 0.7142857142857143
# 第 2 次的迭代结果为 0.6831797235023042
# 第 3 次的迭代结果为 0.6823284233045783
# 第 4 次的迭代结果为 0.682327803828347
# 第 5 次的迭代结果为 0.6823278038280193
# 第 6 次的迭代结果为 0.6823278038280194
#2.方案二
x = 0.0
for i in range(6):
x =(2.0*x**3+1.0)/(3.0*x**2+1.0)
print('第'+str(i+1)+'次的迭代结果为'+str(x))
# #输出:
# 第 1 次的迭代结果为 1.0
# 第 2 次的迭代结果为 0.75
# 第 3 次的迭代结果为 0.686046511627907
# 第 4 次的迭代结果为 0.6823395825973143
# 第 5 次的迭代结果为 0.6823278039465127
# 第 6 次的迭代结果为 0.6823278038280193
#3.方案一
import math
x=2.0
for i in range(8):
x = x - (x**3-math.cos(x)-5.0*x-1.0)/(3.0*x**2+math.sin(x)-5.0)
print('第' + str(i + 1) + '次的迭代结果为' + str(x))
# #输出:
# 第 1 次的迭代结果为 2.3266855479083763
# 第 2 次的迭代结果为 2.272546398909606
# 第 3 次的迭代结果为 2.270830646264361
# 第 4 次的迭代结果为 2.270828944840953
第 6 页
华北科技学院实验报告
# 第 5 次的迭代结果为 2.270828944839281
# 第 6 次的迭代结果为 2.2708289448392804
# 第 7 次的迭代结果为 2.2708289448392804
# 第 8 次的迭代结果为 2.2708289448392804
#3.方案二
import math
x=2.0
for i in range(8):
x = math.pow((math.cos(x)+5.0*x+1.0),1/3)
print('第' + str(i + 1) + '次的迭代结果为' + str(x))
# 输出:
# 第 1 次的迭代结果为 2.195573272531163
# 第 2 次的迭代结果为 2.2501530755476673
# 第 3 次的迭代结果为 2.2651632710880665
# 第 4 次的迭代结果为 2.269277475483024
# 第 5 次的迭代结果为 2.2704041738207237
# 第 6 次的迭代结果为 2.270712654203415
# 第 7 次的迭代结果为 2.2707971080950586
# 第 8 次的迭代结果为 2.2708202289657673
#3.方案三
import math
def fun(x):
f = math.pow((math.cos(x)+5.0*x+1.0),1/3)
return f
x=2.0
y=fun(x)
z=fun(y)
for i in range(8):
x = x-(y-x)**2/(z-2.0*y+x)
y=fun(x)
z=fun(y)
print('第' + str(i + 1) + '次的迭代结果为' + str(x))
# 输出:
# 第 1 次的迭代结果为 2.271281393813576
# 第 2 次的迭代结果为 2.2708289457789386
# 第 3 次的迭代结果为 2.2708289448392804
第 7 页