您的位置:首页 > 其它

牛顿(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]高立.数值最优化方法.北京大学出版社.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: