目标函数极值求解的几种方法
题目:
min
2
1
你牛顿法,共轭梯度法编程实现。
x
1
2
2
2
x
2
,取初始点
x
1
3,1
T
,分别用最速下降法,
一维搜索法:
迭代下降算法大都具有一个共同点,这就是得到点
kx 后需要按某种规则确
定一个方向 kd ,再从
kx 出发,沿方向 kd 在直线(或射线)上求目标函数的极
小点,从而得到
kx 的后继点
1kx ,重复以上做法,直至求得问题的解,这里所
谓求目标函数在直线上的极小点,称为一维搜索。
一维搜索的方法很多,归纳起来大体可以分为两类,一类是试探法:采用这
类方法,需要按某种方式找试探点,通过一系列的试探点来确定极小点。另一类
是函数逼近法或插值法:这类方法是用某种较简单的曲线逼近本来的函数曲线,
通过求逼近函数的极小点来估计目标函数的极小点。本文采用的是第一类试探法
中的黄金分割法。原理书上有详细叙述,在这里介绍一下实现过程:
⑴ 置初始区间[
1,ba
1
]及精度要求 L>0,计算试探点 1 和 1 ,计算函数值
1f 和
1f ,计算公式是:
1
a
1
.0
382
b
1
1
a
,
1
a
1
.0
618
b
1
1
a
。令
k=1。
⑵ 若
b
k
a
k
L
则 停 止 计 算 。 否 则 , 当
f >
K
k
f 时 , 转 步 骤 ⑶ ; 当
f
K
k
f 时,转步骤⑷ 。
⑶ 置
ka
1
k
,
b
k
1
b
k
,
k 1
k
,
f ,转⑸。
1k
a
1
k
.0
618
b
k
1
1
a
k
k
1
,计算函数值
⑷ 置
a
k
1
a
k
,
kb 1
k
,
k 1
k
,
a
k
1
.0
382
b
k
1
1
a
k
k
1
,计算函数
值
f ,转⑸。
1k
⑸ 置 k=k+1 返回步骤 ⑵。
1. 最速下降法
实现原理描述:在求目标函数极小值问题时,总希望从一点出发,选择一个目
标函数值下降最快的方向,以利于尽快达到极小点,正是基于这样一种愿望提出
的最速下降法,并且经过一系列理论推导研究可知,负梯度方向为最速下降方向。
最速下降法的迭代公式是
x
k
1
x
k
k
d
k
kx 出发的搜索方
,其中 kd 是从
xf
xf
。 k 是从
k
k
d
。
k
向,这里取在点
kx 处最速下降方向,即
d
k
kx 出发沿方向 kd
进行的一维搜索步长,满足
xf
k
k
d
k
实现步骤如下:
min
0
⑴ 给定初点
x 1
nR
,允许误差 0 ,置 k=1。
⑵ 计算搜索方向
d
k
xf
k
。
⑶ 若
kd
索,求 k ,使
xf
k
kx 出发,沿方向
,则停止计算;否则,从
k
xf
d
。
d
k
k
k
min
0
kd 进行的一维搜
⑷
x
k
1
x
k
k
k
d
,置 k=k+1 返回步骤 ⑵。
2. 拟牛顿法
基本思想是用不包括二阶导数的矩阵近似牛顿法中的 Hesse 矩阵的逆矩阵,
因构造近似矩阵的方法不同,因而出现了不同的拟牛顿法。
牛 顿 法 迭 代 公 式 :
x
k
1
x
k
k
k
d
,
kd 是 在 点
kx 处 的 牛 顿 方 向 ,
k
d
2
xf
k
1
xf
k
, k 是从
kx 出发沿牛顿方向
kd 进行搜索的最优步长。
用 不 包 括 二 阶 导 数 的 矩 阵 kH 近 似 取 代 牛 顿 法 中 的 Hesse 矩 阵 的 逆 矩 阵
2
kxf
1
, 1kH 需满足拟牛顿条件。
实现步骤:
⑴ 给定初点 1x ,允许误差 0 。
⑵ 置
nIH 1 (单位矩阵),计算出在 1x 处的梯度
g
1
xf
1
,置 k=1。
⑶ 令
d
k
gH
k
k
。
kx 出 发 沿 方 向 kd 搜 索 , 求 步 长 k , 使 它 满 足
⑷ 从
,令
x
xf
1
k
d
。
d
d
x
k
k
k
k
k
k
xf
k
k
min
0
⑸ 检验是否满足收敛标准,若
1kyf
,则停止迭代,得到点
x
kx
1
,
否则进行步骤⑹。
⑹ 若 k=n,令
1
x
⑺ 令
g
1
k
1
kx
1
xf
k
,返回⑵;否则进行步骤⑺。
,
p
k
x
k
1
k
x
,
q
k
g
g
k
k
1
,
H
1
k
H
k
k
pp
Tk
q
p
Tk
k
Tk
k
HqqH
k
k
qHq
k
Tk
k
,置 k=k+1 。返回⑶。
3. 共轭梯度法
若
1
d
,
d
2
,
,
kd
是 nR 中 k 个 方 向 , 它 们 两 两 关 于 A 共 轭 , 即 满 足
Ti
d
Ad
j
,0
i
,;
ij
j
,1
,
k
,称这组方向为 A 的 k 个共轭方向。共轭梯度法的
基本思想是把共轭性与最速下降法相结合,利用已知点处的梯度构造一组共轭方
向,并沿这组方向进行搜索,求出目标函数的极小点,根据共轭方向的基本性质
这种方法具有二次终止性。
实现步骤如下:
⑴ 给定初点 1x ,允许误差 0 ,置
yf
1
1
,k=j=1。
y ,
1
1
x
d
jyf
⑵ 若
,则停止计算;否则,作一维搜索,求 j ,满足
,令
y
yf
yf
1
j
d
。
d
d
y
j
j
j
j
j
j
j
j
min
0
⑶ 若 n
j ,则进行步骤⑷,否则进行步骤⑸
⑷ 令
d
j
1
yf
j
1
j
j
d
,其中
j
yf
yf
j
1
j
2
2
,置 j=j+1,转⑵。
⑸ 令
x
k
1
n
y
1
,
1
y
kx
1
,
1
d
yf
1
,置 j=1,k=k+1,转⑵ 。
4. 实验结果
用以上三种方法通过 Matlab 编程得到实验数据。初始值
x
1
3,1
T
。迭
代精度 sum(abs(x1-x).^2)<1e-4。
第一次迭代
结果 2x
第二次迭代
结果 3x
第三次迭代
结果 4x
第四次迭代
结果 5x
12x
22x
13x
23x
14x
24x
15x
25x
实验结果分析:
最速下降法
拟牛顿法
共轭梯度法
1.5151631286
1.5151631286
1.5151631286
0.9393474854
0.939347485
0.9393474854
1.9730082275
2.0108108072
2.0000076259
1.0538992374
0.9861577108
1.0000419788
1.9869133934
2.005410162
2.0000038167
0.9983654378
0.9896269240
0.9999998271
1.9992739761
1.0014531964
由上表格可以看到最速下降法需要四次迭代实现所要求的精度,拟牛顿法和共轭
梯度法需要三次。
程序:
%精确一维搜索法的子函数,0.618(黄金分割)法,gold.m
%输入的变量 x 为初始迭代点是二维的向量,d 为初始迭代方向是二维的向量
%输出变量是在[0,10]区间上使函数取得极小值点的步长因子
function alfa=gold(x,d)
a=0;b=10;tao=0.618;
lanmda=a+(1-tao)*(b-a);
mu=a+tao*(b-a);alfa=lanmda;%初始化
f=((x(1)+alfa*d(1))-2)^2+2*(x(2)+alfa*d(2)-1)^2;%目标函数
m=f;alfa=mu;n=f;
while 1
if m>n
if abs(lanmda-b)<1e-4
alfa=mu;
return
else
a=lanmda;
lanmda=mu;
m=n;
mu=a+tao*(b-a);
alfa=mu;
n=((x(1)+alfa*d(1))-2)^2+2*(x(2)+alfa*d(2)-1)^2;
end
else
if abs(mu-a)<1e-4
alfa=lanmda;
return
else
b=mu;
mu=lanmda; n=m;
lanmda=a+(1-tao)*(b-a);
alfa=lanmda;
m=((x(1)+alfa*d(1))-2)^2+2*(x(2)+alfa*d(2)-1)^2;
end
end
end
%梯度子函数,tidu.m,输入的变量为二维的向量,返回梯度在 x 处的数值向量
function g=tidu(x)
%待求解的函数
f=(x(1)-2)^2+2*(x(2)-1)^2;
%求函数的梯度表达式
g=[2*(x(1)-2) 4*(x(2)-1)];
x1=x(1); x2=x(2);
%最速下降法极小化函数的通用子函数 zuisu.m
%输入变量为初始的迭代点,输出变量为极小值点
function x0=zuisu(x)
%判断梯度范数是否满足计算精度 1e-4 的要求.是,标志变量设为 1,输出结果;
%否,标志变量设为 0
if sum(abs(tidu(x)).^2)<1e-4
flag=1; x0=x;
else
end
flag=0;
%循环求解函数的极小点
while flag==0
d=-tidu(x);
a=gold(x,d);
x=x+a*d
%判断梯度范数是否满足计算精度的要求.是,标志变量设为 1,输出结果;
%否,标志变量设为 0,继续迭代
if sum(abs(tidu(x)).^2)<1e-4
flag=1;
x0=x;
else
end
flag=0;
End
%拟牛顿法极小化函数的通用子函数,gonge.m
%输入变量为初始的迭代点,输出变量为极小值点
function x0=ninewton(x)
%判断梯度范数是否满足计算精度的要求.是,标志变量设为 1,输出结果;
%否,标志变量设为 0,继续迭代
if sum(abs(tidu(x)).^2)<1e-4
flag=1;
x0=x;
else
end
flag=0;
%初始的 H 矩阵为单位矩阵
h0=eye(2);
%循环求解函数的极小点
while flag==0
%计算新的迭代方向
d=-h0*tidu(x)';
a=gold(x,d);
x1=(x'+a*h0*d)';
s=x1-x;
y=tidu(x1)-tidu(x);
v=s*y';
%校正 H 矩阵
h0=(eye(2)-s'*y./v)*h0*(eye(2)-y'*s./v)+s'*s./v;
%判断下一次和上一次迭代点之差是否满足计算精度的要求.是,标志变量设
为 1,输出结果;否,标志变量设为 0,继续迭代
if sum(abs(x-x1).^2)<1e-4
flag=1;
x0=x;
else
flag=0;
end
x=x1
end
%共轭剃度法极小化函数的通用子函数,gonge.m
%输入变量为初始的迭代点,输出变量为极小值点
function x0=gonge(x)
%判断梯度范数是否满足计算精度的要求.是,标志变量设为 1,输出结果;
%否,标志变量设为 0,继续迭代
if sum(abs(tidu(x)).^2)<1e-4
flag=1;
x0=x;
else
end
flag=0;
%第一次的迭代方法为负梯度方向
d1=-tidu(x);a=gold(x,d1);x1=x+a*d1;
%循环求解函数的极小点
while flag==0
g1=tidu(x);
g2=tidu(x1);
%利用 FR 公式求解系数 bata
bata=(g2*g2')/(g1*g1');
d2=-g2+bata*d1;
a=gold(x1,d2);
x=x1;
x1=x+a*d2
%判断下一次和上一次迭代点之差是否满足计算精度的要求.是,标志变量设
为 1,输出结果;否,标志变量设为 0,继续迭代
if sum(abs(x1-x).^2)<1e-4
flag=1;
x0=x1;
else
flag=0;
end
end