1.3求根之牛顿迭代法 您所在的位置:网站首页 牛顿迭代法收敛性例题 1.3求根之牛顿迭代法

1.3求根之牛顿迭代法

2023-08-27 22:25| 来源: 网络整理| 查看: 265

目录

目录目录前言(一)牛顿迭代法的分析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.算法流程图

牛顿迭代法.jpg

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

图像分析(来确定初值)

01.png

02.png

取在1.5为初始值

运行结果:

03.png

2.求解:\(f(x)=x^2-115=0\)

误差:10^-5

图像分析(来确定初值)

04.png

05.png

取11为初始值。

运行结果:

06.png

3.求解:\(f(x)=x^3-x^2-x+1\)

误差:10^-5

图像分析(来确定初值)

07.png

08.png

取初始值为:1.6

运行结果:

09.png

4.求解:\(f(x)=x^4-4x^2+4=0\)

图像分析(来确定初值)

10.png

11.png

取初值是:0

运行结果:

12.png

我们换另一个点试试,取初始值为2

运行结果:

13.png

作者:Mark 日期:2019/02/19 周二


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有