实验四:共轭梯度法程序设计
一、实验目的
掌握共轭梯度法的基本思想及其迭代步骤;学会运用 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/fuchuchu/p/17472583.html