• Python趣味算法入门 - 牛顿迭代法求方程根


    问题描述

    编写用牛顿迭代法求方程根的函数。方程为ax^{3}+bx^{2}+cx+d=0,系数a,b,c,d由主函数输入,求x在1附近的一个实根。求出根后,由主函数输出。

    牛顿迭代法的公式:x=x{_{0}}-\frac{f(x{_{0}})}{f'(x{_{0}})},设迭代到 \left | x-x{_{0}} \right |\leq 10^{-5} 时结束。

    分析

    在网上可以找到很多关于牛顿迭代法的专业文章,包括应用该方法求方程根的限制与条件等等。问哥在这里就不深入探讨了,以免显得业余。这里仅简单介绍原理,方便大家就地了解编写代码解决此问题。

    牛顿迭代法的基本原理是导数的概念,以及如何求导。

    方程 f(x)=ax^{3}+bx^{2}+cx+d 求导方法为

    f'(x)=3*ax^{3-1}+2*bx^{2-1}+1*cx^{1-1}+0*d

    也就是

    f'(x)=3ax^{2}+2bx+c

    上面对f(x)只求导一次,得到的一元二次方程f'(x),称作1阶导数,代表的是原方程式中对任意点做切线,该切线的斜率(计算方法)。

    题目中是求一元三次方程的根,为了快速介绍,下面简化成一元二次,因为原理都是一样的。以下图为例,坐标中的函数是 f(x)=x^{2}-70 ,而我们要求70的平方根,相当于是在坐标中求当y=0时,x的取值。

    对 f(x)=x^{2}-70 求导可得 f'(x)=2x,代表的就是f(x)上任一点切线的斜率。

    然后,使用牛顿迭代法求 f(x)=x^{2}-70 可分为以下几步:

    1. 设定一个初始值x_{0},这个值其实是估算的,距离我们要求的结果越接近越好,比如图中,我们设定初始值为15;
    2. 可以计算出当x取值15时,对应原方程坐标图中y的取值为15^{2}-70=155,所以代入导数计算公式,可在该方程中对坐标点 (15,155) 做切线 fd_{0},该切线的斜率为2*15=30
    3. 所谓斜率,就是 y/x,而我们要求出对应x坐标轴上线段 h_{0} 的长度,就是用f(15)除以斜率,也就是155/30\approx 5.2 (图中橘色的垂直线段长度除以斜率)
    4. 然后用 x_{0} 减去 h_{0} ,得到x'_{0},也就是15-5.2=9.8。肉眼可见,该值向我们要求解的最终答案(x^{2}-70=0 的根)更近了一步。
    5. 然后重复步骤1到4,得到新的x''_{0},直到前后两次迭代在x轴上的距离小于某个极小值,比如10^{-5},我们就可以认为,得到一个误差足够小的正确解。

    回到我们的一元三次方程中来,我们已经知道 f(x) 以及1阶导数 f'(x) 的计算方法,按照上面例子中的步骤,一步步如法炮制,我们可以编写代码如下:

    1. def fun(a,b,c,d,x0):
    2. x = 1 # 题目要求为1附近
    3. while abs(x-x0)>1e-5: # 判定迭代结束条件,最后两次迭代的值距离小于0.00001时结束迭代
    4. x = x0
    5. f = a*x**3+b*x**2+c*x+d # 原方程式
    6. fd = 3*a*x**2+2*b*x+c # 步骤2,1阶导数方程式,代表该点切线的斜率
    7. h = f/fd # 步骤3,根据斜率求坐标上的距离
    8. x0 -= h # 步骤4,得到新的x0
    9. return x0

    其中,a,b,c,d为方程的系数,x0为我们估算的初始值,这里可以使用原书中的1.5,也可以换成其他值,通常情况下,该值越接近最终解,迭代次数越少,最终解越精确。比如已知最终解约等于2,你可以自己试试1.,8或者1.9? 

    输出

    1. print(fun(2,-4,3,-6,1.5))
    2. 2.0000000000163607

  • 相关阅读:
    支付漏洞的原理与防御
    vue3中的$refs 和$parent
    typescript声明文件学习笔记
    PIL中的P模式、P模式转为L模式
    React的类式组件和函数式组件之间有什么区别?
    electron实现静默打印(各种踩坑解决)
    【Java】1608. 特殊数组的特征值---使用桶排序
    关于我用python表白成功这件事【表白成功】
    防反接方案,NMOS & PMOS
    Vue3中全局配置 axios 的两种方式
  • 原文地址:https://blog.csdn.net/soonway2010/article/details/127648931