🚀个人主页:欢迎访问Ali.S主页
📆 最近更新:2022年7月19日
⛽ Java框架学习系列:Mybatis框架
⛳ Java基础学习系列:面向对象飞机大战
🏆 通信仿真学习系列:【硬件】【通信】【MATLAB】【最优化】
🍄 个人简介:通信工程本硕🌈、Java程序员🚴。目前只会CURD😂
💌 点赞 👍 收藏 💗留言 💬 都是我最大的动力💯

前面介绍过为了解决牛顿法中可能出现在某步迭代时,目标函数数值上升的问题,引入阻尼牛顿法进行修正,但是在牛顿法和阻尼牛顿法中都存在计算Hesse矩阵的问题,使得在多次迭代时可能会出现计算量过大的问题,为解决Hesse矩阵的问题,这里引入共轭梯度法对优化问题进行处理。共轭梯度法是介于最速下降法与牛顿法之间的一个方法,它不需要对Hesse矩阵进行计算,只需要对函数的一阶导数进行处理,不仅克服了最速下降法收敛慢的缺点,而且避免了牛顿法需要计算Hesse矩阵并求逆的缺陷,共轭梯度法是非常重要的一种求解无约束问题的算法,其优点是超线性收敛,且算法简单,编程容易实现。
在求解n维正定二次函数时,极小值点产生一组共轭方向作为搜索方向,在最优步长的搜索下,迭代n步得到极小点,经过适当修正之后,可以推广到其它阶函数的优化问题的求解上来。下面以严格凸二次函数进行讨论:
对于严格二次凸函数:A为对称正定矩阵;

取:

下式中a0为最优步长,

由前面最速下降法中:

可以类比得到:

令:

其中B的选取需要满足:

从上式可以解出:

所以就得到dk的迭代关系为:

多次重复上述步骤得到:

最终整理得到共轭梯度法的迭代公式为:


共轭梯度函数
function [k,x,val]=linecg(A,b,x0,epsilon,N)
if nargin<5,
N=1000;
end
if nargin<4,
epsilon=1.e-5;
end
if nargin<3,
x0=zeros(length(b),1);
end
k=0;
gk=A*x0-b;
dk=-gk;
while(k<N)
temp=A*dk;
alpha=-gk'*dk/(dk'*temp);
x=x0+alpha*dk;
gk=A*x-b;
betak=gk'*temp/(dk'*temp);
dk=-gk+betak*dk;
if(norm(gk)<epsilon),
break;
end
x0=x;
k=k+1;
end
val=0.5*x'*A*x-b'*x;
梯度函数
function gf=gfun(x)
gf=[4*x(1)-2*x(2);2*x(2)-2*x(1)-2];

function f=fun(x)
f=2*x(1)^2+x(2)^2-2*x(1)*x(2)-2*x(2);
k =
10
x =
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
val =
-101.0000

共轭梯度法是介于最速下降法与牛顿法之间的一个方法,它不需要对Hesse矩阵进行计算,只需要对函数的一阶导数进行处理,不仅克服了最速下降法收敛慢的缺点,而且避免了牛顿法需要计算Hesse矩阵并求逆的缺陷,共轭梯度法是非常重要的一种求解无约束问题的算法,其优点是超线性收敛。