实现强大的牛顿迭代法解任意一元方程

原谅我标题党了,牛顿迭代法不是万能的,但是它能解决工程上95%的解方程问题。

可能有人要问了,一元方程还用解?口算一下不就出来了!

但如果是x^5 +x^4 +x^3=100这种一元多次方程,就不是口算的问题了,笔算也算不出来。

五次及以上多项式方程没有根式解(就是没有像二次方程那样的万能公式),这个是被伽罗瓦用群论做出的最著名的结论。


但是没有根式不代表没有办法求解,牛顿迭代法就是通过迭代的方式,不断逼近正确解的万金油方法,并且,它在程序上非常好实现!

其方法是:取一个初始点,在该点做函数的切线,并以切线与x轴的交点作为下一个初始点,继续做切线……函数会很快收敛到零点附近。
在这里插入图片描述

取A点作为初始点,可以看到,四次迭代之后,就很接近函数的根了。

切线很好求,交点也很好求,我们可以简单推导出这样一个表达式:
在这里插入图片描述

然后就是代码实现。


做切线也就是求函数的导数,因此我们首先要做两件事

  1. 将函数用程序表示出来
  2. 将函数的导数用程序表示出来
    例如,x^4 +x^3-100=0这个函数,用笔算很难求解:

求出其导数为:4x^3 +3x^2=0

用代码表示出来:
JZCF 金证财富知识分享 > 实现强大的牛顿迭代法解任意一元方程 > image2020-11-23 18:6:6.png

然后,定义一个方法来进行迭代,方法的入参为(初始值,容许的最大精度,最大迭代次数):

JZCF 金证财富知识分享 > 实现强大的牛顿迭代法解任意一元方程 > image2020-11-23 18:7:16.png

设定初始值为1,精度为0.00000001,跑一下试试:

JZCF 金证财富知识分享 > 实现强大的牛顿迭代法解任意一元方程 > image2020-11-23 18:8:47.png

可以看到,9次迭代之后,精度就已经达到了6e-9,得出的结果为2.9390275687304728,把它代入原函数试一下:

JZCF 金证财富知识分享 > 实现强大的牛顿迭代法解任意一元方程 > image2020-11-23 18:8:59.png

结果为:
在这里插入图片描述

由于精度问题,就直接显示为0了,说明迭代出来的结果非常接近函数的根了,而我们想要的话完全可以调到更高的精度,求解完成!


由于实现的难度很低(唯一难点是将函数导数求出来,并且用代码表示),而由于其涉及导数,逼近的速度也不是简单的一次逼近,而是接近次方的速度,

因此时间复杂度也很低,消耗不大。

综上所述,牛顿迭代法在工程领域有相当广泛的应用,尤其在解复杂函数中尤为有效,犹如一把刺入黄油的尖刀。


但是,牛顿迭代法处理不了以下几种函数,先看定义:

牛顿迭代法收敛的充分条件:若f二阶可导,那么在待求的零点x周围存在一个区域,只要起始点x_{0}位于这个邻近区域内,那么牛顿-拉弗森方法必定收敛。

也就是说,错误初值的选择可能会导致解不收敛。

例如:

起始点不幸选择了驻点,在几何意义上该点切线根本没有根。

JZCF 金证财富知识分享 > 实现强大的牛顿迭代法解任意一元方程 > image2020-11-23 18:18:58.png

函数 x^(1/3):越迭代只会越远离零点。

JZCF 金证财富知识分享 > 实现强大的牛顿迭代法解任意一元方程 > image2020-11-23 18:19:56.png

|x|^(1/2):循环震荡,永远在那几个点波动。

JZCF 金证财富知识分享 > 实现强大的牛顿迭代法解任意一元方程 > image2020-11-23 18:20:31.png

有多个解的函数,会导致只能迭代出最近的那个根,而如果我们要的是另一个跟,就需要好好商榷初值的位置了。

JZCF 金证财富知识分享 > 实现强大的牛顿迭代法解任意一元方程 > image2020-11-23 18:21:11.png

因此牛顿迭代法虽然好用,但是也有几点需要注意:
1. 初值的选择
2. 迭代范围的选择

因为大多数的不规则函数,可以在某个区间近似为规则的,而我们业务上一般需要求的值都在某个区间内,规定了区间,
并确定在这个区间有解的话,就可以放心大胆的使用牛顿迭代法了。

参考:https://blog.csdn.net/ccnt_2012/article/details/81837154

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 目的: (1)通过采用牛顿迭代法、弦截法和二分法求根的程序设计,使学生更加系统地理和掌握C语言函数间参数传递方法、数组和指针的应用等编程技巧。培养学生综合利用C语言进行科学计算,使学生将所学知识转化为分析和设计数学中的实际问题的能力,学会查资料和工具书。 (2)提高学生建立程序文档、归纳总结的能力。 (3)进一步巩固和灵活运用先修课程《计算机文化基础》有关文字处理、图表分析、数据归整、应用软件之间图表、数据共享等信息技术处理的综合能力。 2. 基本要求: (1)要求用模块化设计和C语言的思想来完成程序的设计; (2)要求分别编写牛顿迭代法、弦截法和二分法求根的函数,分别存到不同的.CPP文件中; (3)在VC++6.0环境中,学会调试程序的方法,及时查究错误,独立调试完成。 (4)程序调试通过后,完成程序文档的整理,加必要的注释。 一般一元方程,常用采用的方法有:牛顿迭代法、弦截法和二分法等。 牛顿迭代法求根 〖〖f(x)=a〗_0 x〗^n 〖〖 + a〗_1 x〗^(n-1) +⋯+〖 a〗_(n-2) x^2 +〖 a〗_(n-1) x +〖 a〗_n=0 求f(x)在〖 x〗_0附近的根。 计算公式:〖 x〗_(n+1)=〖 x〗_n- f(〖 x〗_n )/(f(〖 x〗_n)) ́ 精度:ε=|〖 x〗_(n+1)-〖 x〗_n|<1.0e-m ,m=6。 牛顿迭代法 所求的根:满足精度的〖 x〗_n 二分法 任取两点〖 x〗_1和〖 x〗_2,判断(〖 x〗_1, 〖 x〗_2)有无实根。如下图所示,如果f(〖 x〗_1 )和f(〖 x〗_2 )符号相反,说明(〖 x〗_1, 〖 x〗_2)之间有一实根。取(〖 x〗_1, 〖 x〗_2)的中点x,检查f(x)和f(〖 x〗_1 )是否同符号,如果不同号,说明实根在(〖 x〗_1,x)区间,x作为新的〖 x〗_2,舍弃(x, 〖 x〗_2)区间;若同号,则实根在(x, 〖 x〗_2)区间,x作为新的〖 x〗_1, 舍弃(〖 x〗_1,x)区间。再根据新的〖 x〗_1 、 〖 x〗_2,找中点,重复上述步骤。直到|〖 x〗_1-〖 x〗_2|〖<10〗^(-6)时,x =(〖 x〗_1+〖 x〗_2)/2为所求。 (3)弦截法 取f(〖 x〗_1 )与f(〖 x〗_2 )连线与x轴的交点x,从(〖 x〗_1, x)和(x, 〖 x〗_2)两个区间中取舍的方法与二分法相同。 计算公式为: 判断f(〖 x〗_1 )与f(〖 x〗_2 )是否同符号的方法与二分法采用的方法相同。直到先后两次求出的x的值之差小于〖10〗^(-6)为止。 分别用牛顿迭代法、弦截法和二分法求下列方程的根,分析比较各种方法的迭代次数及精度。 〖f(x)=x〗^3 〖- 2x〗^2 +7x +4=0 牛顿迭代法的初值:x=0.5; 弦截法〖 x〗_1,〖 x〗_2的初值:-1,1 二分法〖 x〗_1,〖 x〗_2的初值:-1,0 精度要求:|〖 x〗_1-〖 x〗_2| 〖<10〗^(-6)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值