实验要求
a. 实现牛顿公式,并分别找到收敛和发散的例子
算法介绍
牛顿公式原理如下图:

为了防止牛顿迭代发散并且加速迭代速度,所以我们在这里引入一个新的方法——
牛顿下山法:

根据牛顿公式原理以及牛顿下山法的原理,我们可以将算法进行代码实现。
算法步骤
牛顿求根法
1. 定义x与y,x为所要求得根的大概位置,y为我们要求得根的精度;
2. 计算f(x);
3. 计算f(x)的导数f'(X);
4. 计算x = 1 - f(X) / f'(x);
5. 比较误差|f(x) - x| 是否小于y,若大于y则返回第二步,若小于y则跳出循环输出结果;
6. 注:在牛顿求根法中还要设置一个最大迭代次数,以免一些发散的例子导致一直循环而无法跳出循环。
牛顿下山法
1. 定义x、y与k,x为所要求得根的大概位置,y为我们要求得根的精度,k为下山因子初始值为1;
2. 计算f(x)并将其绝对值值赋给一个中间量mid;
3. 计算f(x)的导数f'(X);
4. 计算x = 1 -k * (f(X) / f'(x)) ;
5. 计算f(x)
6. 比较|f(x)|与mid的大小,若|f(x)|小于mid,则继续计算,否则k = k/2,返回上一步;
7. 比较误差|f(x) - x| 是否小于y,若大于y则返回第二步,若小于y则跳出循环输出结果;
算法实现
实现算法所用语言:Python
牛顿求根公式实现代码牛顿下山法实现代码:

对比函数代码:实验结果

在这里我们选取一个特殊的函数作为例子:


这个函数在x = 1和 x=2 处对于牛顿法不收敛,并且有两个根分别是-1与3.23483652635
当 x = 1 时,我们可以发现在发散部分牛顿求根公式根本没有办法求根,但是牛顿下山公式却可以求出方程的根:

虚线上方为牛顿求根公式,虚线下方为牛顿下山法公式。
当 x = 2.6 时,我们可以发现即便牛顿求根公式也可以求出方程的根但是收敛速度远远不如牛顿下山法:

虚线上方为牛顿求根公式,虚线下方为牛顿下山法公式。
同理,若我们选取一个收敛的例子:

当x = 0.6时我们来对比牛顿求根公式与牛顿下山法的区别,也可以明显地看出牛顿下山法对牛顿求根公式收敛速度的优化效果:

虚线上方为牛顿求根公式,虚线下方为牛顿下山法公式。