diff --git a/方程求根上课学生代码.py b/方程求根上课学生代码.py new file mode 100644 index 0000000..38a39ae --- /dev/null +++ b/方程求根上课学生代码.py @@ -0,0 +1,118 @@ +# -*- coding: utf-8 -*- +""" +Created on Sun Dec 26 16:44:41 2021 + +@author: hzh +""" +# 求方程 f(x) = x3-5x2+10x-80 = 0的根(二分法) +# 绘图 +import numpy as np +import matplotlib.pyplot as plt + +x = np.linspace(-20, 20, 200) +y = x ** 3 - 5 * x ** 2 + 10 * x - 80 +# 设置横轴纵轴刻度范围 +plt.axis([-20, 20, -500, 500]) +plt.grid('on') # 绘制网格 +plt.plot(x, y) +plt.show() + +# 二分法实现 +E = 1e-10 +x1, x2 = 0, 10 +fx = 1 +while abs(fx) > E: + x = (x1 + x2) / 2 + fx = x ** 3 - 5 * x ** 2 + 10 * x - 80 + if fx >= 0: + x2 = x + else: + x1 = x + print('x=', x, 'fx=', fx) + + +# 例2:求x2-2=0的根,即求2的平方根 +def f(x): + return x ** 2 - 2 + + +left = 1; +right = 2; +# left=-2;right=-1; +n = 0 # n用来统计二分次数 +err = 1e-6 # 误差 +while True: + n += 1; + middle = (left + right) * 0.5 + if abs(f(middle)) < err: + print('f(x)=%.8f x=%.8f n=%d' % (f(middle), middle, n)) + break + if f(middle) * f(left) > 0: + left = middle # 中点变为左边界 + # right=middle #中点变为右边界 + else: + right = middle # 中点变为右边界 +# left=middle #中点变为左边界 +''' +求方程f(x)=x3-11.1x2+38.8x-41.77的在[0,10]内的根, +请先画图,再用二分法求根。 +''' + + +# 2牛顿迭代法 +def f(x): + return x ** 2 - 2 + + +def df(x): + return x * 2 + + +x = 4; +err = 1e-6; +n = 0; +while True: + if abs(f(x)) < err: + print('fx=%.8f x=%.8f n=%d' % (f(x), x, n)) + break + x = x - f(x) / df(x) # + n += 1 + +'''习题 利用Newton迭代法求下列方程的根: +-sin(x)ex+5=0 位于0~10之间的根 + x3-11.1x2+38.8x-41.77=0 位于0~10之间的根 +xex-1=0 位于0~10之间的根 +''' + +# 牛顿割线法求方程的根 +x0 = 1; +x1 = 2; +err = 1e-6; +n = 0 + + +def f(x): + return x ** 2 - 2 + + +for x0, x1 in [(-1, -2), (1, 2)]: + while True: + if f(x1) - f(x0) == 0: + print('False') + break + x = x1 - f(x1) / (f(x1) - f(x0)) * (x1 - x0) + n += 1 + if abs(f(x)) < err: + print('fx=%.8f x=%.8f n=%d' % (f(x), x, n)) + break + x0 = x1 + x1 = x +''' +习题 利用Newton割线法求下列方程的根: +x3-3=0 位于0~10之间的根 + x3-11.1x2+38.8x-41.77=0 位于0~10之间的根 +xex-1=0 位于0~10之间的根 +''' +################begin################## +##习题 利用Newton割线法求下列方程的根: +##x**3-3=0 位于0~10之间的根