使用牛顿迭代法实现求y=(x-2)^3的解

关于牛顿迭代法:
牛顿迭代法又称为牛顿-拉夫逊(拉弗森)方法,它是牛顿在17世纪提出的一种在实数域和复数域上近似求解方程的方法。
针对大部分函数,都有如下特点
在这里插入图片描述
如上图,我们随机选取一点x0,得到函数f(x)上的一点y0,通过点(x0,y0)得到函数f(x)关于该点的切线f0,切线f0是一条直线又会在x轴上得到一点x1,同样通过x1在f(x)上得到y1,然后又在点(x1,y1)得到f(x)关于该点的切线f1,又重复下去得到x2,会发现每次得到的xi渐渐趋近我们函数和x轴的交点,这个就是利用切线不断趋近方程根的一个性质。

那么我们要求解方程的近似解,就需要不断更新xi,我们随机输入x0,那么可以得到(x0,y0)点处f(x)的切线方程为:f0(x)=kx+b,k为f(x)在x0处的导数,假设导函数为g(x),于是k=g(x0),又因为kx0+b=f(x0),也就是g(x0)*x0+b=f(x0)->b=f(x0)-g(x0)*x0,所以f0(x)=g(x0)*x+f(x0)-g(x0)*x0,切线f0又交于x轴于x1点,于是f0(x1)=g(x0)*x1+f(x0)-g(x0)*x0=0,所以x1=[g(x0)*x0-f(x0)]/g(x0)
所以x1=x0-[f(x0)/g(x0)],于是我们通过这个关系不断更新xi,
也就是

x1=x0-[f(x0)/g(x0)],x0=x1进行更新
于是直接
x0=x0-[f(x0)/g(x0)]
就可以不断更新。

那么什么时候停下来呢?
首先f(x0)可以得到一个值,我们希望的是f(x0)近可能为0,这样就找到了解,但是不可能完全为0,所以我们设置误差E,如果abs(f(x0))<E我们就可以停下来了。

关于利用牛顿迭代法实现求解y=(x-2)^3,代码如下:

#include<bits/stdc++.h>
using namespace std;
double f(double x)
{
	return pow((x-2),3);
} 
//f(x)的导函数 
double g(double x)
{
	return 3*pow((x-2),2);
}
int main()
{
	//起始点x0和误差E 
	double x0,E;
	cout<<"输入起始点x0=";
	cin>>x0;
	cout<<"输入误差E=";
	cin>>E; 
	//迭代次数 
	int step=0;
	cout<<"\n迭代过程...\n";
	while(abs(f(x0))>E)
	{
		printf("%-4d %-20.8lf %-20.8lf\n",step,x0,f(x0));
		x0=x0-(f(x0)/g(x0));
		step++;
	}
	cout<<"近似解="<<x0<<" 函数值="<<f(x0)<<" 迭代次数="<<step<<endl;
	return 0;
}

运行结果
在这里插入图片描述
补充:牛顿迭代法可以解决大部分复杂函数求解问题,但不是所有函数都可以求解,比如典型的
y=x^3的函数,在原点其导函数为0,如果利用我们的迭代方程x0=x0-(f(x0)/g(x0))显然是错误的,因为g(x0)=0,不能除0运算。有的函数会使得每次更新的x0点越来越远离根节点,有的对称函数会让每次更新的x0一直在y轴左右反复跳转陷入死循环,总之利用牛顿迭代法非常需要注意函数的类型,最好的方式是把函数曲线MATLAB画图出来进行分析,再考虑牛顿迭代法是否受用。

希望我的分享对你的学习有所帮助,如果有错误请及时指出,谢谢~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值