Kingzy's Blog

Personal Technology Website

0%

【数值分析课程实验-04】方程求根的数值方法

实验目标

对于方程 $f\left( x \right) =0$,使用编程语言实现以下算法:
1. 用 二分法 求解方程的根;
2. 用 牛顿迭代法 求解方程的根;
3. 用 弦截法 求解方程的根。

编程语言与扩展库

编程语言:Python 语言
扩展模块:numpy

实现代码

二分法求根

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 函数 f(x)
def f(x):
y = x**3 - x - 1
return y

# 二分求根法 求解 f(x) = 0
def Dicphoni(a,b,tol):
# 初始值
y0 = f(a)

# 迭代直到区间小于 tol
while b-a > tol:
x = (a+b)/2
y = f(x)

# 对半区间
if y * y0>0:
a = x
else:
b = x

return x,y

if __name__ == '__main__':
# 求根区间与误差范围
a,b = 1,1.5
tol = 0.5e-5
x,y = Dicphoni(a,b,tol)
print('x = {}'.format(x))
print('y = {}'.format(y))

牛顿法求根

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# 导入模块
from math import exp

# 函数 f(x)
def f(x):
y = x * exp(x) - 1
return y

# 导函数f ' (x)
def f_(x):
y = (1+x) * exp(x)
return y

# 牛顿法 求解 f(x) = 0
def Newton(x0,tol,N):

# 初值
x_k = x0
print('x0 = {}'.format(x0))

# 迭代
for i in range(N):
x_k_plus = x_k - f(x_k)/f_(x_k)
print('x{} = {}'.format(i + 1, x_k_plus))

# 达到误差要求
if abs(x_k_plus - x_k)<tol:
print('迭代次数: {}'.format(i+1))
break
x_k = x_k_plus

if __name__ == '__main__':
Newton(0.5,1e-5,100)

弦截法求根

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 导入模块
from math import exp

# 函数 f(x)
def f(x):
y = x * exp(x) - 1
return y

# 弦截法 求解 f(x) = 0
def String_Interception(x0,x1,tol,N):

# 初值
x_k_sub = x0
x_k = x1
print('x0 = {}'.format(x0))
print('x1 = {}'.format(x1))

# 迭代
for i in range(N):
x_k_plus = x_k - f(x_k)/(f(x_k)-f(x_k_sub))*(x_k - x_k_sub)
print('x{} = {}'.format(i + 2, x_k_plus))

# 达到误差要求
if abs(x_k_plus - x_k)<tol:
print('迭代次数: {}'.format(i+1))
break
x_k = x_k_plus

if __name__ == '__main__':
String_Interception(0.5,0.6,1e-5,100)

写在最后

声明:本专栏内容来源于武汉理工大学 2019-2020 学年数值分析方法课程实验,仅供学习参考
如有错误或不足地方,还请指出,祝愿读者能够在编程之路上不断进步!