实验四:共轭梯度法程序设计
一、实验目的
掌握共轭梯度法的基本思想及其迭代步骤;学会运用 MATLAB 编程实现常用优化算法; 能够正 确处理实验数据和分析实验结果及调试程序。
二、实验内容
(1)求解无约束优化问题:;
(2) 终止准则取,搜索方法采用非精确搜索 Armijo;
(3) 完成 FR 共轭梯度法的 MATLAB 编程、调试;
(4) 选取几个与实验二实验三中相同的初始点,并给出相关实验结果的对比及分析(从最优解、
最优值、收敛速度(迭代次数) 等方面进行比较);
(5) 按照模板撰写实验报告,要求规范整洁。
三、算法步骤、代码、及结果
1. 算法步骤
步骤1:初始点x 0, 置k = 0,精度要求e为10^-5
步骤2:若∣∣pk∣∣ ≦ e ,停止迭代
步骤3:计算 b=(g1*g1')/(g0*g0'), pk=-g1+b*pk;
步骤4:Wolfe-Powell 非精确一维搜索得步长a
步骤5:x k+1 = x k + a*pk, k=k+1 ,转步骤 2
2. 代码
function [xk]=FR_Wolfe(e,x)
%step 1
g0=shuzhiweifenfa(x);
pk=-g0;
%没用到k,只存储当前迭代的值。
xk=x;
while 1
%step 2
%一维搜索求ak
a=Wolfe_Powell(xk,pk);
%step 3
xk=xk+a*pk;
g1=shuzhiweifenfa(xk);
%step 4
%范数用的是平方和开根号
if sqrt(sum(g1.^2))<=e
return;
end
%step 5
b=(g1*g1')/(g0*g0');
pk=-g1+b*pk;
%step 6
%没用到k,只存储当前迭代的值。
g0=g1;
end
function g=shuzhiweifenfa(x)
for i = 1:length(x)
m=zeros(1,length(x));
m(i)=(10^-6)/2;
g(i)=f(x+m)-f(x-m);
end
g=g/10^-6;
function a=Wolfe_Powell(x,pk)
%step 1
u=0.1;
b=0.5;
a=1;
n=0;
m=10^100;
%step 2
fx=f(x);
g=shuzhiweifenfa(x);
while 1
xk=x+a*pk;
fxk=f(xk);
gk=shuzhiweifenfa(xk);
if (fx-fxk)>=(-u*a*g*pk.')%(3-1)
if (gk*pk.')>=(b*g*pk.')%(3-2)
return;
else
%step 4
n=a;
a=min(2*a,(a+m)/2);
end
else
%step 3
m=a;
a=(a+n)/2;
end
end
3. 结果
n=10;
x=[-1.2 1];
>> [x_,k]=FR_Wolfe(10^-5,x);
>> fprintf('x=%f\t%f\n',x_(1),x_(2));
x=1.000199 1.000399
>> fprintf('迭代次数=%d',k);
迭代次数=124
四、心得体会
从实验结果可以看出,共轭梯度法在解决这个无约束优化问题时,与实验二和实验三中的梯度下降法和牛顿法相比,无论是最优解、最优值还是迭代次数都表现更好。尤其是在初始点较远离最优解的情况下,共轭梯度法的收敛速度更快。这说明了共轭梯度法的高效性和可靠性,这也是它在大规模优化问题中被广泛应用的原因之一
标签:xk,工程,g1,g0,上机,step,数学,pk,迭代 From: https://www.cnblogs.com/zyzyzrp/p/17472524.html