FR共轭梯度法
Posted studyer_domi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了FR共轭梯度法相关的知识,希望对你有一定的参考价值。
Fletcher-Reeves共轭梯度法,简称FR法。
共轭梯度法的基本思想是把共轭性与最速下降方法相结合,利用已知点处的梯度构造一组共轭方向,并沿这组方向进行搜素,求出目标函数的极小点。根据共轭方向基本性质,这种方法具有二次终止性。
对于二次凸函数的共轭梯度法:
min f(x) = 1/2 xTAx + bTx + c,
其中x∈ Rn,A是对称正定矩阵,c是常数。
具体求解方法如下:
首先,任意给定一个初始点x(1),计算出目标函数f(x)在这点的梯度,若||g1|| = 0,则停止计算;否则,令
d(1) = -▽f(x(1)) = -g1。
沿方向d(1)搜索,得到点x(2)。计算在x(2)处的梯度,若||g2|| ≠ 0,则利用-g2和d(1)构造第2个搜索方向d(2),在沿d(2)搜索。
一般地,若已知点x(k)和搜索方向d(k),则从x(k)出发,沿d(k)进行搜索,得到
x(k+1) = x(k) + λkd(k) ,
其中步长λk满足
f(x(k) + λkd(k)) = min f(x(k)+λd(k))。
此时可求出λk的显示表达
计算f(x)在x(k+1)处的梯度。若||gk+1|| = 0,则停止计算;否则,用-gk+1和d(k)构造下一个搜索方向d(k+1),并使d(k+1)和d(k)关于A共轭。按此设想,令
d(k+1) = -gk+1 + βkd(k),
上式两端左乘d(k)TA,并令
d(k)TAd(k+1) = -d(k)TAgk+1 + βkd(k)TAd(k) = 0,
由此得到
βk = d(k)TAgk+1 / d(k)TAd(k)。
再从x(k+1)出发,沿方向d(k+1)搜索。
在FR法中,初始搜索方向必须取最速下降方向,这一点决不可忽视。因子βk可以简化为:βk = ||gk+1||2 / ||gk||2。
实现算法如下:
主函数
clear
clc
close all
%%
F=@(x) 3/2*x(1)^2+1/2*x(2)^2-x(1)*x(2)-2*x(1);
gradF=@(x) [3*x(1)-x(2)-2; -x(1)+x(2)];
x0=[-2 4]';%初始点
TolGrad=1e-5; %容忍误差
MaxIter=5e5;%最大迭代次数
[x,f1,k,diedai,var,ff]=ConjGrad(F,gradF,x0,TolGrad,MaxIter);
x
f1
k
figure(1)
plot(1:k,diedai,'linewidth',2)
xlabel 迭代次数
ylabel 误差
title 目标函数迭代曲线
set(gcf,'color','w')
%% 验证结果有效性 暴力求解极小值
xx=linspace(-10,10,500);
yy=linspace(-10,10,500);
[x,y]=meshgrid(xx,yy);
z=3/2*x.^2+1/2*y.^2-x.*y-2*x;
figure(2)
surf(x,y,z)
min(min(z))
set(gcf,'color','w')
子函数
function [x,f1,iter,diedai,var,ff]=ConjGrad(F,gradF,x0,TolGrad,MaxIter)
%功能:用FR共轭梯度法求解无约束问题minf(x)
%输入:F原函数,grad F函数梯度,x0是初始点,TolGrad....容忍误差,MaxIter....最大迭代次数
%输出:x,f1,iter分别是取得极小值的x,近似最优点和迭代次数,diedai迭代信息
iter = 0;
f0 = F(x0);
c = gradF(x0);
Converged = norm(c) < TolGrad;
alpha = 1e-6*norm(c);
while iter<MaxIter && ~Converged
iter = iter + 1;
d = -c;
f = @(alpha) F(x0+alpha*d);
alphaUpper = bracket( f, 0, 0.1*alpha );
[alpha,f1] = fminbnd( f, 0, alphaUpper );
x = x0 + alpha*d;
var(iter,1:2) = x;
ff (iter) = f1;
c = gradF(x);
diedai(iter) = norm(c);
Converged = (norm(c) < TolGrad);
x0 = x;
end
end
结果:
迭代次数 | 设计变量 | 目标函数值 | |
x1 | x2 | ||
1 | 1.52941176 | 2.235294118 | -0.47059 |
2 | 0.94117647 | 1.058823529 | -0.98962 |
3 | 1.01038062 | 1.024221453 | -0.9998 |
4 | 0.9988466 | 1.001153403 | -1 |
5 | 1.00020354 | 1.00047493 | -1 |
6 | 0.99997739 | 1.000022634 | -1 |
7 | 1.000004 | 1.000009328 | -1 |
x =
1.0000
1.0000
f1 =
-1.0000
k =
7
ans
-0.9997
查看迭代曲线误差,在第三步的时候,结果就基本收敛,收敛速度较快,通过求解列举法,求出了该函数的极小值,与我们的FR算法对比,可以发现结果一样,验证了FR算法的有效性,
以上是关于FR共轭梯度法的主要内容,如果未能解决你的问题,请参考以下文章
线性共轭梯度法求解正定二次函数极小点以及线性方程组的解--MATLAB源程序
线性共轭梯度法求解正定二次函数极小点以及线性方程组的解--MATLAB源程序