牛顿法在数值计算中可以用来求解方程式,也可以在优化问题中求极值,分别对应下面两个例子~

牛顿迭代求解Sqrt问题

求解x=Sqrt(n),令,如下图所示:

newton-sqrt

求得点的切线方程为:,其中

由于我们要求使的点,所以,令,得:

之后就可以通过上面迭代公式求解:

public int sqrt(int x){
  double res = 1;
  double last = 0;
  
  while(res != last){
    last = res;
    res = (res + x/res)/2;
  }
  
  return (int)res;
}

参考:1

牛顿法求解优化问题

牛顿法求解优化问题的思路和上面求解一致,唯一不同的是优化问题中都是求最小(大)值,需要转化一下,考虑到极值点梯度为0,所以牛顿法就是通过求解梯度为0来解决优化问题的

考虑无约束优化问题:

假设具有连续二阶偏导数,第k次迭代值为,将处进行二阶泰勒展开:

其中,点的梯度向量;点的海赛矩阵(Hesse matrix)

函数f(x)有极值的必要条件是在极值点处梯度向量为0,假如第k+1次的迭代值是极值的话,有:

对泰勒展开式求导得:,所以,最后得迭代公式为:

牛顿法就是根据上面的迭代公式求最优值的,一般求值曲线如下:

newton_optimization_vs_grad_descent

上图对比了梯度下降法(绿线)和牛顿法(红线)求解最小化问题的过程。梯度下降使用梯度(一阶导数)寻找下降最快的方向,而牛顿法通过曲率(二阶导数)寻找下降最快的方向,因此牛顿法的路径更直接。

从几何上说,牛顿法就是用一个二次曲面去拟合你当前所处位置的局部曲面,而梯度下降法是用一个平面去拟合当前的局部曲面,通常情况下,二次曲面的拟合会比平面更好,所以牛顿法选择的下降路径会更符合真实的最优下降路径。

拟牛顿法

在牛顿法的迭代中,需要计算海赛矩阵的逆,计算复杂度很高,考虑使用一个n阶矩阵近似代替。这就是逆牛顿法的思路

Hesse矩阵在拟牛顿法中是不计算的,拟牛顿法是构造与Hesse矩阵相似的正定矩阵,这个构造方法,使用了目标函数的梯度(一阶导数)信息和两个点的“位移”(Xk-Xk-1)来实现。有人会说,是不是用Hesse矩阵的近似矩阵来代替Hesse矩阵,会导致求解效果变差呢?事实上,效果反而通常会变好。

拟牛顿法与牛顿法的迭代过程一样,仅仅是各个Hesse矩阵的求解方法不一样。

在远离极小值点处,Hesse矩阵一般不能保证正定,使得目标函数值不降反升。而拟牛顿法可以使目标函数值沿下降方向走下去,并且到了最后,在极小值点附近,可使构造出来的矩阵与Hesse矩阵“很像”了,这样,拟牛顿法也会具有牛顿法的二阶收敛性。

下面给出DFP法的求解过程:

上面我们对二阶泰勒公式求导得到:

时:

可以推导出一组解为:

这样就得到了的迭代公式

[](http://www.cnblogs.com/zhangchaoyang/articles/2600491.html)

TOP