牛顿(Newton)方法
2016-07-17 14:45
363 查看
1、基本Newton方法
设f(x)具有连续的二阶偏导数,当前迭代点是xk.f(x)在xk处的Taylor展开式为f(xk+d)=fk+gTkd+12dTGkd+o(||d||2),其中d=x−xk.在点xk的邻域内,用二次函数
qk(d)=Δfk+gTkd+12dTGkd
近似f(xk+d),求解问题
min qk(d)=fk+gTk+12dTGkd.
若Gk可逆,则方程组
Gkd=−gk
的解dk=−G−1kgk为上面问题min qk(d)的唯一解.
迭代步骤:
步1 给出x0∈Rn,ϵ>0,k:=0;
步2 若终止准则满足,则输出有关信息,停止迭代;
步3 计算dk;
步4 xk+1:=xk+dk,k:=k+1,转步2.
下面是实现的代码
#include <math.h> #include <stdio.h> #define delta 1E-03 #define epsilon 1E-06 double funcValue(double s) { return pow(s,4)-6*pow(s,3)+1; } double derivation(double s) { double diff = funcValue(s+delta)-funcValue(s); return diff/delta; } double dederivation(double s) { double diff = derivation(s+delta)-derivation(s); return diff/delta; } int main() { double x = 1; while(abs(derivation(x))>epsilon) { printf("%f\n", derivation(x)); double d = -derivation(x)/dederivation(x); x = x+d; } printf("%f, %f", x, funcValue(x)); return 0; }
经过各种试验之后,发现基本的Newton法依赖于初始点的选择,当初始点接近极小点时,迭代序列很快收敛于极小点,否则会出现迭代序列收敛到鞍点或极大点的情形,这会使迭代失败。
由收敛性证明也可得知,它的收敛是局部的。
2、阻尼Newton方法
阻尼牛顿法比基本牛顿法多了一步一维搜索步长α的方法:xk+1=xk+αkdk,
此法能保证对正定的Gk,{fk}单调下降;即使xk离x∗稍远,该方法产生的点列{xk}仍可能收敛至x∗.
其中一维搜索步长的方法有黄金比例法、多项式插值法、信赖域法等。
这里介绍一下黄金比例法(0.618比例法):
首先我们需要确定一个初始区间,使其包含
ϕ(α)=f(xk+αdk),α>0
的极小点,这是建立在满足单峰函数的基础上的. 即使不是单峰函数,可以先用进退法得到一个满足单峰函数的区间. 这是迭代步骤:
步1 给定α0∈[0,∞),γ0>0,t>1,i:=0.
步2 计算αi+1=αi+γi.若αi+1≤0,则令αi+1:=0,转步4;若ϕ(αi+1)≥ϕ(αi),则转步4.
步3 令γi+1=tγi,α:=αi,αi:=αi+1,i:=i+1,转步2.
步4 若i=0,令γi:=−γi,α:=αi+1,转步2;否则
a=min{α,αi+1},b=max{α,αi+1},
输出a,b,迭代停止.
0.618方法的迭代步骤:
步1 给定a0>0,b0>0,i:=0,ϵ>0,τ:=0.618.
步2 若bi−ai<ϵ,则α∗:=bi+ai2,输出α∗,停止线搜索.
步3 计算
αli:=ai+(1−τ)(bi−ai),αri:=ai+τ(bi−ai).
步4 若ϕ(αli)<ϕ(αri),则ai+1:=ai,bi+1:=αri;否则ai+1:=αli,bi+1:=bi,i:=i+1,转步2.
后面的编程实现可以参考这位作者写的文章:http://dataunion.org/20714.html,里面有python写的详细实现方式。
参考资料:
[1]高立.数值最优化方法.北京大学出版社.
相关文章推荐
- poj 1611 The Suspects
- CSS基础课程笔记
- javascript4-数组
- Maven 引入oracle jdbc jar包
- 剑指offer-6-面试43:n 个骰子的点数()
- fetch和XMLHttpRequest讲解
- 常用算法
- mybatis----批量增加与批量删除
- 【POJ3415】 Common Substrings(后缀数组|SAM)
- 中山题解
- Android MVP开发模式实例
- matlab GUI
- 双连通性
- 搜索二叉树
- Unicode,GBK和UTF8
- 常用算法
- C++异常处理基础
- 安装JDK8u91之后打开Eclipse报错:
- CALayer Animatable Properties
- OpenFileDialog的基本操作