牛顿迭代法
2015-07-07 10:40
190 查看
目前接触到的牛顿迭代法主要应用于两个方面:(1)方程求根问题(2)最优化问题。
1、求解方程。
并不是所有的方程都有求根公式,或者求根公式很复杂,导致求解困难。利用牛顿法,可以迭代求解。
原理是利用泰勒公式,在x0处展开,且展开到一阶,即f(x) = f(x0)+(x-x0)f'(x0)
求解方程f(x)=0,即f(x0)+(x-x0)*f'(x0)=0,求解x = x1=x0-f(x0)/f'(x0),因为这是利用泰勒公式的一阶展开,f(x) = f(x0)+(x-x0)f'(x0)处并不是完全相等,而是近似相等,这里求得的x1并不能让f(x)=0,只能说f(x1)的值比f(x0)更接近f(x)=0,于是乎,迭代求解的想法就很自然了,可以进而推出x(n+1)=x(n)-f(x(n))/f'(x(n)),通过迭代,这个式子必然在f(x*)=0的时候收敛。整个过程如下图:
2、牛顿法用于最优化
在最优化的问题中,线性最优化至少可以使用单纯行法求解,但对于非线性优化问题,牛顿法提供了一种求解的办法。假设任务是优化一个目标函数f,求函数f的极大极小问题,可以转化为求解函数f的导数f'=0的问题,这样求可以把优化问题看成方程求解问题(f'=0)。剩下的问题就和第一部分提到的牛顿法求解很相似了。
这次为了求解f'=0的根,把f(x)的泰勒展开,展开到2阶形式:
这个式子是成立的,当且仅当 Δx 无线趋近于0。此时上式等价与:
求解:
得出迭代公式:
一般认为牛顿法可以利用到曲线本身的信息,比梯度下降法更容易收敛(迭代更少次数),如下图是一个最小化一个目标方程的例子,红色曲线是利用牛顿法迭代求解,绿色曲线是利用梯度下降法求解。
在上面讨论的是2维情况,高维情况的牛顿迭代公式是:
其中H是hessian矩阵,定义为:
高维情况依然可以用牛顿迭代求解,但是问题是Hessian矩阵引入的复杂性,使得牛顿迭代求解的难度大大增加,但是已经有了解决这个问题的办法就是Quasi-Newton methond,不再直接计算hessian矩阵,而是每一步的时候使用梯度向量更新hessian矩阵的近似.
3、牛顿迭代法应用
应用牛顿迭代法求解方根,只需要迭代几次便可以得到相当精确的结果。
首先设x^m=a,
因此应用牛顿迭代法我们可以快速寻找平方根,下面的这种方法可以很有效地求出根号a的近似值:首先随便猜想一个近似值x,然后不断令x等于x和a/x的平均数即(x+a/x)/2,迭代个六七次后x的值就已经相当精确了。(x+a/x)/2的迭代公式我们可以利用牛顿迭代法求解f(x)=x^2-a的0点的迭代公式推导出。
1、求解方程。
并不是所有的方程都有求根公式,或者求根公式很复杂,导致求解困难。利用牛顿法,可以迭代求解。
原理是利用泰勒公式,在x0处展开,且展开到一阶,即f(x) = f(x0)+(x-x0)f'(x0)
求解方程f(x)=0,即f(x0)+(x-x0)*f'(x0)=0,求解x = x1=x0-f(x0)/f'(x0),因为这是利用泰勒公式的一阶展开,f(x) = f(x0)+(x-x0)f'(x0)处并不是完全相等,而是近似相等,这里求得的x1并不能让f(x)=0,只能说f(x1)的值比f(x0)更接近f(x)=0,于是乎,迭代求解的想法就很自然了,可以进而推出x(n+1)=x(n)-f(x(n))/f'(x(n)),通过迭代,这个式子必然在f(x*)=0的时候收敛。整个过程如下图:
2、牛顿法用于最优化
在最优化的问题中,线性最优化至少可以使用单纯行法求解,但对于非线性优化问题,牛顿法提供了一种求解的办法。假设任务是优化一个目标函数f,求函数f的极大极小问题,可以转化为求解函数f的导数f'=0的问题,这样求可以把优化问题看成方程求解问题(f'=0)。剩下的问题就和第一部分提到的牛顿法求解很相似了。
这次为了求解f'=0的根,把f(x)的泰勒展开,展开到2阶形式:
这个式子是成立的,当且仅当 Δx 无线趋近于0。此时上式等价与:
求解:
得出迭代公式:
一般认为牛顿法可以利用到曲线本身的信息,比梯度下降法更容易收敛(迭代更少次数),如下图是一个最小化一个目标方程的例子,红色曲线是利用牛顿法迭代求解,绿色曲线是利用梯度下降法求解。
在上面讨论的是2维情况,高维情况的牛顿迭代公式是:
其中H是hessian矩阵,定义为:
高维情况依然可以用牛顿迭代求解,但是问题是Hessian矩阵引入的复杂性,使得牛顿迭代求解的难度大大增加,但是已经有了解决这个问题的办法就是Quasi-Newton methond,不再直接计算hessian矩阵,而是每一步的时候使用梯度向量更新hessian矩阵的近似.
3、牛顿迭代法应用
应用牛顿迭代法求解方根,只需要迭代几次便可以得到相当精确的结果。
首先设x^m=a,
因此应用牛顿迭代法我们可以快速寻找平方根,下面的这种方法可以很有效地求出根号a的近似值:首先随便猜想一个近似值x,然后不断令x等于x和a/x的平均数即(x+a/x)/2,迭代个六七次后x的值就已经相当精确了。(x+a/x)/2的迭代公式我们可以利用牛顿迭代法求解f(x)=x^2-a的0点的迭代公式推导出。
const double eps = 1e-6; double sqrt(double x) { if(fabs(x) < eps) return 0.0; double result = x; double xhalf = 0.5 * result; int i = *(int*)&result; i = 0x5f375a86 - (i>>1); result = *(double*)&i; result = result * (1.5 - xhalf * result * result); result = result * (1.5 - xhalf * result * result); return 1.0 / result; }
相关文章推荐
- 前端学习书籍推荐
- C++ 二维数组中的二分查找
- C++ 复制构造函数为啥用引用作为对象
- Linux内核启动常见错误
- MongoVUE下实现MongoDB的Group分组查询
- 【c++】随机化和枚举
- Android面试题3之描述下Android的系统架构
- leetCode(32):Power of Two
- 计算机网络中的帧封装(C实现)
- leetCode(32):Power of Two 分类: leetCode 2015-07-07 10:40 205人阅读 评论(0) 收藏
- 无法更新 EntitySet“W_ReceiveData”,因为它有一个 DefiningQuery,而 <ModificationFunctionMapping> 元素中没有支持当前操作的 <InsertFunction> 元素。
- MySQL事务处理和锁机制
- HDU 3844 Mining Your Own Business(割点,经典)
- C#语法基础和面向对象编程
- ASP.NET中使用Razor语法(C#)怎样获取当前浏览器的cookie
- SQL语句实现查询SQL Server内存使用状况
- 【概率DP入门】
- Android跨语言篇
- spring注解
- JS中的!=、== 、!==、===的用法和区别。