
实验目标
对于方程 $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
| def f(x): y = x**3 - x - 1 return y
def Dicphoni(a,b,tol): y0 = f(a)
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
def f(x): y = x * exp(x) - 1 return y
def f_(x): y = (1+x) * exp(x) return y
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
def f(x): y = x * exp(x) - 1 return y
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 学年数值分析方法课程实验,仅供学习参考。
如有错误或不足地方,还请指出,祝愿读者能够在编程之路上不断进步!