共轭梯度法是Hestenes和Stiefel(1952年)在求解大规模线性方程组时创立的一种迭代算法。1964年,Fletcher和Reeves将其引入非线性最优化问题,创立了非线性共轭梯度法。
该方法基于前一迭代点的搜索方向对当前迭代点的负梯度方向进行修正来产生新的搜索方向,即搜索方向为当前迭代点的负梯度方向与前一搜索方向的线性组合。
本期大纲
1 共轭方向 在介绍共轭梯度法之间,小编首先介绍一个重要的定义—— 共轭方向 ,并给出共轭方向的一些性质。1. 共轭方向
2. 共轭方向法
3. 正定二次函数的共轭梯度法
4. 一般函数的共轭梯度法
5. 算法实现
6. 总结
定义(共轭方向):设Q是一个n×n的对称正定矩阵,若n维向量空间中的非零向量满足
则称是Q的共轭向量或称向量是关于Q共轭的(简称共轭),也称是Q的m个共轭方向。
例如:
注:当 Q=I(单位矩阵)时,公式(1)变为
即向量 互相正交。由此可见,正交是共轭的一种特殊情况,共轭是正交的推广。
性质(线性无关性):设Q是一个n×n的对称正定矩阵,若是Q的m个非零共轭向量,则这m个向量是线性无关的。
注:在n维的向量空间中,非零的共轭向量个数不超过n
2 共轭方向法 共轭方向 法的算法步骤如下:在考虑普通函数之前,首先考虑如下的正定二次函数
定理1:设有二次函数
其中Q是一个n×n的对称正定矩阵,若是Q的m个非零共轭向量,从任意一点出发出发,依次沿这组向量进行一维搜索
则有
即当前点的梯度方向与之前所有搜索方向正交。
定理2(算法收敛性——二次终止性):设有二次函数
其中Q是一个n×n的对称正定矩阵,若是Q的m个非零共轭向量,从任意一点出发出发,依次沿这组向量进行一维搜索
则至多经过n步算法收敛,即是f(x)在上的极小值点。
因此,对于任意n元正定二次函数,我们可以从任意点出发,然后沿着n个共轭方向最多做n次线搜索,就可以求的目标函数的最优点。3 正定二次函数的共轭梯度法 在共轭方向法中,我们需要预先给定共轭方向,这在实际应用中是很难实现的,下面我们给出一种新的算法——共轭梯度法,它可以随着迭代的进行不断产生共轭方向。 共轭梯度法基本思想: 在FR共轭梯度法中,初始点处的搜索方向取为该点的负梯度方向,即取 而之后点 的搜索方向 由该点的负梯度 与已得的共轭向量 的线性组合来确定。命题1:设有二次函数
其中Q是一个n×n的对称正定矩阵。若选取初始点为,取。依次从出发,沿在最优步长规则下做一维线搜索,可得:
共轭梯度法的算法步骤如下:
Step 0. 选取初始点,允许误差ε> 0,令 k=1;
Step 1. 计算。若,算法停止;.否则,转 Step 2;
Step 2. 依次计算
并置k=k+1,转 step 1.
定理3:对于正定二次函数,最优步长规则下的共轭梯度法经过m≤n次一维搜索后终止,且对任意的1≤i≤m,下列关系式成立:
注: 定理3中,(1)说明共轭梯度法生成的搜索方向是关于Q共轭的;(2)说明共轭梯度法生成的点列的梯度是相互正交的。命题2:
注: 共轭梯度法中β的取值不同又可细分FR、PRP等方法,上述命题β的取值所对应的方法被称为FR共轭梯度法。4 一般函数的共轭梯度法上面所讲的迭代公式要想适用于非二次函数,存在以下问题:
(1) 步长 不能再用公式 计算,必须使用其他的一维搜索方法来确定; (2) 凡用到矩阵Q之处,需要用现行点处的Hessian矩阵 代替; (3) 有限步内迭代达不到极小点。
迭代的延续:
(1) 直接搜索:即总用公式构造搜索方向。
(2) 重新开始,把n步作为一轮,每搜索一轮之后,取一次最速下降方向,开始下一轮。一般函数的FR共轭梯度法的算法步骤如下:
5 算法实现例1:求解无约束优化问题
该问题有精确解
解:调用格式如下:
function [X,Y,Error] = frcg(x0)
%使用FR共轭梯度法求解无约束问题:min f(x)
%使用非精确Armijo搜索步长规则
%输入:x0为初始点,fun为目标函数,grad为梯度函数
%输出:X,Y分别为每一步的迭代点及相应函数值,Error为误差
tic
%% 初始化参数
f = @(x)100*(x(1)^2-x(2))^2+(x(1)-1)^2; %目标函数
g = @(x)[400*x(1)*(x(1)^2-x(2))+2*(x(1)-1);-200*(x(1)^2-x(2))]; %一阶导数
G = @(x)[1200*x(1)^2-400*x(2)+2, -400*x(1);-400*x(1), 200 ]; %二阶导数
%% 初始化算法参数
k = 1;
n = length(x0);
e = norm(g(x0));
X = x0;
Y = f(x0);
Error = e;
rho=0.6;sigma=0.4;
%% 设定终止条件
N = 5000; %最大迭代步
E = 1e-6; %给定误差
%% 迭代
while k < N && e > E
% 计算搜索方向
if(k == 1)
d = -g(x0);
else
beta = (g(x0)'*g(x0))/(g0'*g0);
d = -g(x0) + beta*d0;
if(g(x0)'*d>=0)
d = -g(x0);
end
end
%使用Armijo法求步长
m=0; mk=0;
while(m<20)
if(f(x0+rho^m*d)
mk=m; break;
end
m=m+1;
end
g0 = g(x0);
d0 = d;
x0 = x0+rho^mk*d; %迭代公式
k = k+1;
X(:,k) = x0;
Y(k) = f(x0);
e = norm(g(x0));
Error(k) = e;
end
toc
end
调用格式如下:
x0 = [0;0]; %迭代初始点(可以根据需要修改)
[X,Y,E]=frcg(x0);
本问题求解结果如下:
6 总结 共轭方向法是介于最速下降法和Newton法之间的一种方法——它的收敛速度(二阶收敛)比最速下降法(线性收敛)快;它克服了最速下降法的锯齿现象,同时它的计算量和存储量又比牛顿法要小。 共轭梯度法不需要预先给定Q的共轭方向,而是随着迭代的进行不断产生Q的共轭方向——在每次的迭代中,利用前一个搜索方向和当前迭代点的梯度的线性组合构造一个新的方向。 几种下降算法的迭代过程往期回顾
算法丨优化算法之牛顿法
算法丨优化算法之最速下降法
算法丨经典优化算法大合集(比赛备用,值得收藏)
算法丨优化算法系列之遗传算法原理
算法丨优化算法系列之遗传算法MATLAB程序设计及应用实例
算法丨优化算法系列之模拟退火算法(1)
算法丨优化算法系列之模拟退火算法(2)——0-1背包问题
参考文献:马昌凤.最优化方法及其 Matlab 程序设计[M]. 科学出版社, 2010.