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) 的计算方法,按照上面例子中的步骤,一步步如法炮制,我们可以编写代码如下:

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

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

输出

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

  • 2
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

请叫我问哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值