看牛顿法的改进与验证局部收敛

看牛顿法的改进

今天继续看Numerical Optimization这本书,在看第六章,实用牛顿法。

 

6.1 提到“不准确”的牛顿法。意思是每次确定迭代方向都要解方程,很慢,实际上也不一定要解出非常精确的迭代方向。于是尝试用一些迭代解法(例如,共轭梯度法)去解 H*x + G = 0这个方程。

 

6.2 提到通过共轭梯度法解 Ax = b 找搜索方向p = x的具体做法。

一旦发现一个点x有 x^T * A * x <= 0此时A非正定,若当前为第一次迭代,以此迭代方向更新牛顿法,否则,以上一次迭代方向更新。前一种情况实际等价于最速下降法。

初始位置x0可以设置为0,也可以设置为上一帧的搜索方向。两种方法差不多。

此法不需要显式的H(共轭梯度法每次更新迭代方向需要的都只是H*某个向量),只需要H * p。因此节省了计算H的时间。

 

具体的修改方法有:修改Cholesky分解,Gershgorin修改,对称不定矩阵修改。具体的算法以后研究。

 

验证局部收敛

当前想解决的问题是,完全证实之前迭代失败是由于收敛到局部极值。

想到的具体做法是,对于之前的例子,把有方向和无方向参数的迭代结果分别记录下来,以后在有方向参数的情形下,看看在无方向的解附近,牛顿迭代是否能够收敛。

 

经过试验,确定牛顿法确实收敛到局部极值。具体做法是,在有方向参数的迭代过程中,加载无方向参数最终的迭代结果,看迭代是否收敛到无方向的结果。

有方向的收敛函数值为231.68。

加载无方向结果后,收敛函数值为111.98,与无方向参数的模拟方法收敛值一样。

说明在有方向参数的情况下,231.68并不是全局最小值。

 

出现收敛到局部极值的原因为变量太多。下一步尝试不再求解内部点的位置(用外部点的权重表示),或把内部点的位置按静态平衡条件解算,不考虑加速度。

 

posted @ 2015-01-16 12:04  dydx  阅读(1060)  评论(0)    收藏  举报