牛顿迭代法学习笔记

牛顿迭代


我们一般对一个函数求区间最值,通常单调的二分,单峰的三分。
但是这里有更快的方法。
下面给一个Wiki的动态图

我们发现对一个函数,求它的零点(也就是y=0y=0的点,与xx轴相交),我们先取一个点,然后求它的切线,切线与xx轴的交点的xx坐标为下一个点的xx坐标,我们会发现在函数收敛的情况下,它会越来越接近零点,接近速度取决于收敛速度。

但是如下图的函数则无法牛顿迭代(图片上的函数错了,应该为y=51+ex1y=frac{5}{1+e^{-x}}-1)。
eg

所以我们要求一个函数的最值,可以先求它的一阶导数,然后牛顿迭代求它的一阶导数的零点即可。
公式如下:
xn+1=xnf(xn)f(xn) x_{n+1}=x_n-frac{f(x_n)}{f'(x_n)}
可以通过迭代次数来控制精度。

下面给一个神奇的开根法:

const double eps=1e-15;
double Newton_Sqrt(double a){
	double x=0x5f375a86;
	while(x*x<a)x*=2;
	while(x*x-a>eps){x=x-(x*x-a)/(2*x);}
	return x;
}

那个系数,很多讲牛顿迭代的博客都有,是一款游戏源码中的(作者tql%%%)。

如果迭代二阶导数的零点,就是求的原函数的斜率的极值。


后期再更新吧,留坑(QAQ继续学习)

原文地址:https://www.cnblogs.com/VictoryCzt/p/10053414.html