牛顿迭代法学习笔记
牛顿迭代
我们一般对一个函数求区间最值,通常单调的二分,单峰的三分。
但是这里有更快的方法。
下面给一个Wiki的动态图
我们发现对一个函数,求它的零点(也就是的点,与轴相交),我们先取一个点,然后求它的切线,切线与轴的交点的坐标为下一个点的坐标,我们会发现在函数收敛的情况下,它会越来越接近零点,接近速度取决于收敛速度。
但是如下图的函数则无法牛顿迭代(图片上的函数错了,应该为)。
所以我们要求一个函数的最值,可以先求它的一阶导数,然后牛顿迭代求它的一阶导数的零点即可。
公式如下:
可以通过迭代次数来控制精度。
下面给一个神奇的开根法:
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继续学习)