1.3求根之牛顿迭代法 | 您所在的位置:网站首页 › 牛顿迭代法收敛性例题 › 1.3求根之牛顿迭代法 |
目录
目录目录前言(一)牛顿迭代法的分析1.定义2.条件3.思想4.误差(二)代码实现1.算法流程图2.源代码feval()函数float_num()函数牛顿迭代法(三)案例演示1.求解:\(f(x)=x^3-x-1=0\)2.求解:\(f(x)=x^2-115=0\)3.求解:\(f(x)=x^3-x^2-x+1\)4.求解:\(f(x)=x^4-4x^2+4=0\)作者:Mark日期:2019/02/19 周二
前言
今天我们讲的是具有收敛速度快,能求重根的解方程之法,牛顿迭代法。 (一)牛顿迭代法的分析 1.定义迭代公式如下: \[x_{k+1} = x_k-\frac{f(x_k)}{f\prime(x_k)} (k=0,1,2...) \]迭代函数是: \[\varphi(x) = x_k-\frac{f(x_k)}{f\prime(x_k)} \]由于$ \varphi(x)= x_k-\frac{f(x_k)}{f\prime(x_k)}$ 与原方程\(f(x)=0\) 等价。 当\(k\rightarrow \infty\) 时,\(x_k\)就是\(f(x)=0\)的近似解。 该方法称为牛顿迭代方法。 2.条件f(x)函数是连续可导函数。 f(x)在局部收敛,当\(f(x) \times f\prime\prime(x)>0\)时,局部收敛。 注意:牛顿迭代法的局部收敛性,很依赖于初始值的取法。 也就是说,初始值的选取,决定该区域的收敛性。 3.思想其总思想还是迭代的方法,只是其迭代公式是由泰勒展开得来的,其利用的是:用切线方程与x轴的交点来近似f(x)与x轴的交点。 4.误差任然用的是迭代法的误差,前后两次x的差的绝对值与我们给的精度比较。 (二)代码实现 1.算法流程图 2.源代码 feval()函数 def feval(string, a): """ 根据值来计算数学表达式。 :param string: 含有x未知数的数学表达式 :param a: 自变量x的具体数值 :return: 数学表达式的计算结果 """ count = string.count("x") string = string.replace('x', '%f') t = (a, ) * count result = eval(string % t) return result float_num()函数 def flaot_num(x, r): """ 处理保留几位小数点的函数,四舍五入法 :param x: 原始数据 :param r: 误差 :return: 处理后的数据 """ # 处理小数点的位数 r = str(r) if "." in r: dian = r.index(".") size = len(r[dian + 1:]) result = round(x, size) return result elif "e" in r: dian = r.index("e") size = int(r[dian+2:]) result = round(x, size) return result else: result = round(x, 0) return result 牛顿迭代法 """ 牛顿迭代法,迭代的思想,不断逼近。 """ # 求导数需要的库 import sympy as sp from my_math.func_math import feval, flaot_num def new_fun(expr, x0, r): """ 牛顿迭代法求解方程的根 :param expr: 代函数表达式 :param x0: 初始值 :param r: 误差 :return: 计算的结果值 """ x = sp.Symbol('x') k = 0 # 一阶导与二阶导 fx_1 = str(sp.diff(expr)) fx_2 = str(sp.diff(fx_1)) # 迭代公式 y = "x-" + "("+expr + ")/(" + fx_1 + ")" # 判断收敛性 if feval(expr, x0)*feval(fx_2, x0) r: x1 = feval(y, x2) x2 = feval(y, x1) k += 1 print("次数:", k) print("x1:", x1) print("x2:", x2) result = flaot_num(x2, r) print("=" * 30) print("原始的数据是", x2) print("最后的结果是:", result) return result if __name__ == '__main__': new_fun("x**4-4*x**2+4", 2, 10**-5) (三)案例演示 1.求解:\(f(x)=x^3-x-1=0\)误差:10^-5 图像分析(来确定初值) 取在1.5为初始值 运行结果: 2.求解:\(f(x)=x^2-115=0\)误差:10^-5 图像分析(来确定初值) 取11为初始值。 运行结果: 3.求解:\(f(x)=x^3-x^2-x+1\)误差:10^-5 图像分析(来确定初值) 取初始值为:1.6 运行结果: 4.求解:\(f(x)=x^4-4x^2+4=0\)图像分析(来确定初值) 取初值是:0 运行结果: 我们换另一个点试试,取初始值为2 运行结果: 作者:Mark 日期:2019/02/19 周二 |
CopyRight 2018-2019 实验室设备网 版权所有 |