利用牛顿公式求解方程的根并且实现牛顿下山法

实验要求
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 时我们来对比牛顿求根公式与牛顿下山法的区别 , 也可以明显地看出牛顿下山法对牛顿求根公式 收敛速度的优化效果 :
 
虚线上方为牛顿求根公式,虚线下方为牛顿下山法公式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值