如果高等数学最后只记下一个东西的话,那就是泰勒展式了。 --摘自(葡)Luís Torgo著的《数据挖掘与R语言》一书
牛顿迭代法是数值计算方法中一个重要的方法,经常在求解f(x)=0的非线性方程求根时引入。但是它的使用却远远不仅于此,基本上涉及到泛函优化问题的求解时,常常能够见到它的身影。
原始的牛顿法,一言而蔽之:在某点附近,函数表达式使用它的泰勒展式的前两项去近似。而关于泰勒展式中从第三项开始的项舍去,由于前两项只涉及到常数项和一次项,所以也可以理解成将非线性问题转化为线性问题的一种方法。
牛顿法编程简单,收敛速度快,在合理的假设下,它能够达到平方收敛速度,这是它的优点。缺点主要有以下几点:算法收敛有时候和初值的选取密切相关,如果初值选择不恰当的话,收敛速度会变慢甚至不收敛;在每一步的迭代中,需要计算函数在某点的导数值,而当函数比较麻烦,甚至导数很难解析求得的时候,它会占据很大的计算量,这在实际问题中经常遇到。而关于牛顿法的改进,基本上都是基于它的缺点的。
针对第一个缺点,改进牛顿法主要的思想是,增加参数,调整步长,使得算法收敛。一种方式是在函数的导数基础上在增加一项,使得问题正则化,来达到求解的目的;另一种方式是,为了使迭代向着收敛结果进行,改变每次前进的步长,称为阻尼牛顿法。有理论结果表明,满足一定的条件,阻尼牛顿法产生的迭代序列收敛到问题的解上面去。
针对第二个缺点,一个基本思路是使用函数值的信息去取代导数值的信息后者减少导数值信息的计算次数。一个能想到的方法是用一个常数去代替每次迭代过程中的函数值,但是这种方法收敛速度较慢。改进的方案是,折中,每迭代几步更新一次函数的导数值信息,即萨马斯基技巧。
另一个途径是逆牛顿法。它给出了一个算法的框架,而细节的设置专注于计算的减少,将其中的一个序列的变化看成是增量的方式,而增量的计算就可以做些文章了,比如增加约束条件,限制增量的秩,由此产生Broyden秩1算法。算法在推导过程中,利用矩阵加上一个增量之后的逆和原来矩阵的逆以及增量之间的一个关系式,有效地缩减了矩阵逆的运算。
不同于简单函数的牛顿迭代法,多值多变量函数以及泛函中在牛顿迭代过程中增量的计算中要涉及到线性方程组的求解,实际上,实现过程中分成两步,一步是求解线性方程组,得到自变量的增量,第二步是自变量按照增量的方式前进一步。而线性方程组的求解主要有直接法(如QR方法)和迭代法(J迭代,GS迭代和SOR迭代),如果在使用牛顿法求解线性方程组采用的是迭代法,那么就构成了双层迭代。如使用的是J迭代,相应的双层迭代方法称为N-J迭代法,同样可以定义N-GS迭代和N-SOR迭代。
参考文献:
《非线性数值分析的理论与方法》第三章, 黄象鼎等著,武汉大学出版社,2004年9月。