牛顿法又称牛顿迭代法。
最近看machine learning中的线性回归(linear regression)中的梯度下降法(gradient descent)时候,我立刻回想起了学习C语言的时候课堂讲的牛顿迭代法求函数的零点。细想想这两者还是有一定联系的。他们都用到了导数,利用导数无限逼近最优解。数学啊数学,万物之宗也!好了,废话不多说,言归正传。
上面的函数是任意的,我们的任务是求出x使等式成立。
用牛顿迭代法解决:
1)首先随便猜一个数x0 很可能不是解,除非你是神人
2)更新x0,得到x1,使他更接近于解
3)迭代:
最终xn就逼近与解了。
下面用牛顿法解决求平方根的问题,看下面问题:
的值是多少?
显然,需要对2.5求平方根。问题转化为求方程x^2-2.5=0的解了。好了用牛顿法:
f(x)=x^2-2.5
f(x)导数:2x
利用上面的公式更新就可以了,下面编程实现以下看看效果如何。
double sqrt(int a)
{
double x1=a;// 猜的值,索性就为a吧
double x2=x1-(x1*x1-a)/(2*x1);//第一次逼近就是这么算的。参考我上边解释的公式
while(x1-x2 > 5e-7)// 精度控制,循环结束条件
{
x1=x2;
x2=x2-(x2*x2-a)/(2*x2);
}
return x1;
}
int main()
{
printf("2.5^0.5=%.6lf\n",sqrt(2.5));
return 0;
}