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算法的有效性,
總結
- 上一篇: MTK优美代码赏析6:电话本里的快速排序
- 下一篇: 值不值得入手_iPhone11现在还值不