Hession矩阵与牛顿迭代法

  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矩阵的近似。Quasi-Newton method的详细情况我还没完全理解,且听下回分解吧。。。

  http://blog.sina.com.cn/s/blog_5364f9f20101dkyr.html

时间: 2024-09-26 07:47:09

Hession矩阵与牛顿迭代法的相关文章

c语言-C语言牛顿迭代法,正常运行输出错误结果,求助

问题描述 C语言牛顿迭代法,正常运行输出错误结果,求助 求方程ax^3+bx^2+c^x+d=0的解,其中xn+1=xn-f(xn)/f'(xn) 我的代码这样写的: #include #include int main(void) { int a,b,c,d; printf("Please input four integers:"); scanf("%d %d %d %d",&a,&b,&c,&d); double x,y; x=

C语言实现牛顿迭代法解方程

利用迭代算法解决问题,需要做好以下三个方面的工作: 一.确定迭代变量 在可以用迭代算法解决的问题中,我们可以确定至少存在一个可直接或间接地不断由旧值递推出新值的变量,这个变量就是迭代变量. 二.建立迭代关系式 所谓迭代关系式,指如何从变量的前一个值推出其下一个值的公式(或关系).迭代关系式的建立是解决迭代问题的关键,通常可以使用递推或倒推的方法来完成. 三.对迭代过程进行控制 在什么时候结束迭代过程?这是编写迭代程序必须考虑的问题.不能让迭代过程无休止地执行下去.迭代过程的控制通常可分为两种情况

如何用c语言解决牛顿迭代法

问题描述 如何用c语言解决牛顿迭代法 用c语言解决牛顿迭代法,要求显示表达式,求大神帮助,期末作业,完不成要挂科,谢谢了 解决方案 一元任意阶次方程求解,注意初始值不正确也有可能得不到解.http://blog.csdn.net/qq_27183003/article/details/49808191 解决方案二: #include <stdio.h> #include <math.h> //y=x^3-5x^2+16x-80 float f(float x) { return (

C语言OJ项目参考(2405)牛顿迭代法求根

2405: 牛顿迭代法求根 Description 用牛顿迭代法求根.方程为ax3+bx2+cx+d=0.系数a,b,c,d的值一次为1,2,3,4,由主函数输入.求x在1附近的一个实根.求出根后由主函数输出.结果保留两位小数. Input 系数a,b,c,d的值 Output x在1附近的一个实根 Sample Input 1 2 3 4 Sample Output -1.65 HINT 主函数已给定如下,提交时不需要包含下述主函数 /* C代码 */ int main() { double

算法之【牛顿迭代法】

众所周知,计算机的基本数值算法是加减乘除,甚至只是加减法.而次方和开根算法都是由四则运算混合表示而成的,因而根号计算比四则运算要慢很多.无理数如√2的浮点数计算就是由牛顿迭代法得出的.牛顿迭代法是一种用于计算曲线方程根的精确算法(尤其是幂函数方程),比二分法更加高效,因为它基于微分. As we all know, basic numerical calculation in the computer is: addition, subtraction, multiplication and d

牛顿迭代法

     牛顿迭代法(Newton's method)又称为牛顿-拉夫逊(拉弗森)方法(Newton-Raphson method),它是牛顿在17世纪提出的一种在实数域和复数域上近似求解方程的方法. 牛顿迭代公式     设r是\(f(x)=0\)的根,选取\(x_0\)作为r的初始近似值,过点\((x_0,f(x_0))\) ,做曲线 \(y=f(x)\)的切线L,L的方程为\(y=f(x_0)+f'(x_0)(x-x_0)\) ,求出L与x轴交点的横坐标 \[x_1=x_0-\frac{f

matlab实现牛顿迭代法求解非线性方程组

已知非线性方程组如下 3*x1-cos(x2*x3)-1/2=0 x1^2-81*(x2+0.1)^2+sin(x3)+1.06=0 exp(-x1*x2)+20*x3+(10*pi-3)/3=0 求解要求精度达到0.00001 ---------------------------------------------------------分--割--线--------------------------------------------------------- 首先建立函数fun 储存方

牛顿迭代法求多项式在1.5附近的值2*x的3次幂--4x平方+3*x-6=0的实现代码_C 语言

代码如下所示: 复制代码 代码如下: #include <stdio.h>#include <math.h> int main(){   float x,x0,f,f0;   x=1.5;   do   {    x0=x;      f0=((2*x-4)*x+3)*x-6;  //求得在x0处解    f=(6*x0-8)*x0+3;     // 在(x0 ,f0)处导数    x=x0-f0/f;        }while(fabs(x-x0)>=1e-6);   

程序设计基础(C语言)课程主页-2016级

时间很快,2016级的小鲜肉们已经在猜测老贺长什么样子了. 从在线作业到翻转课堂,几届的学生跟着我受了不少苦.话虽这么说,并不代表2016级的就要轻松了(老贺虚伪到底!).不过,苦孩子们,享受吧. 话说回来,老贺在这一届身上也不会太轻松.翻转课堂的模式不陌生了,但新生出来的想解决的问题并不少,让学生学得有效.学得有趣.学得轻松是我的追求.做过不少资源,但随着培养方案的变化,选用教材的变化,中间的调整.补充要花不少时间.最大的变化,是实践体系要完全改变,不再按以前历届的安排去做,更多按课程组的共识