共轭梯度法程序设计
一、实验目的
掌握共轭梯度法的基本思想及其迭代步骤;学会运用MATLAB编程实现常用优化算法;能够正确处理实验数据和分析实验结果及调试程序
二、实验内容
(1)求解无约束优化问题:
(2)终止准则取;
(3)完成FR共轭梯度法的MATLAB编程、调试;
(4)选取几个与实验二实验三中相同的初始点,并给出相关实验结果的对比及分析(从最优解、最优值、收敛速度(迭代次数)等方面进行比较);
三、算法步骤、代码、及结果
1. 算法步骤
FR共轭梯度法的步骤
初始化:
x = x0:将初始点设为x0。
g = gradf(x):计算目标函数在x处的梯度g。
d = -g:将搜索方向设为梯度的负值-g。
iter = 0:迭代次数初始化为0。
delta_new = g' * g:计算当前梯度范数的平方delta_new。
delta0 = delta_new:记录初始梯度范数的平方delta0。
迭代条件:
while (sqrt(delta_new) > tol * sqrt(delta0)) && (iter < maxIter):
当当前梯度范数的平方根大于tol乘以初始梯度范数的平方根,且迭代次数小于最大迭代次数时,进行迭代。
线搜索:
alpha = lineSearch(f, gradf, x, d):进行线搜索,找到合适的步长alpha。
x = x + alpha * d:更新当前点x。
更新梯度和计算beta:
g = gradf(x):计算新的梯度g。
delta_old = delta_new:保存旧的梯度范数平方delta_old。
delta_new = g' * g:计算新的梯度范数平方delta_new。
beta = delta_new / delta_old:计算共轭方向系数beta。
更新搜索方向:
d = -g + beta * d:更新搜索方向d。
iter = iter + 1:迭代次数加1。
返回结果:
当迭代结束时,返回最优解x、最优值fval及迭代次数iter。
fval = f(x):计算最优解处的目标函数值。
2. 代码
function [x, fval, iter] = FR_ConjugateGradient(f, gradf, x0, tol, maxIter)
% 输入:
% f - 目标函数句柄
% gradf - 目标函数的梯度句柄
% x0 - 初始点
% tol - 终止准则
% maxIter- 最大迭代次数
% 输出:
% x - 最优解
% fval - 最优值
% iter - 迭代次数
% 初始化
x = x0;
g = gradf(x);
d = -g;
iter = 0;
delta_new = g' * g;
delta0 = delta_new;
% 迭代
while (sqrt(delta_new) > tol * sqrt(delta0)) && (iter < maxIter)
% 线搜索
alpha = lineSearch(f, gradf, x, d);
x = x + alpha * d;
g = gradf(x);
delta_old = delta_new;
delta_new = g' * g;
% 计算beta
beta = delta_new / delta_old;
% 更新搜索方向
d = -g + beta * d;
iter = iter + 1;
end
fval = f(x);
end
function alpha = lineSearch(f, gradf, x, d)
% 简单线搜索算法,可以根据需求修改
alpha = 1;
rho = 0.1;
c = 1e-4;
while f(x + alpha * d) > f(x) + c * alpha * gradf(x)' * d
alpha = rho * alpha;
end
end
3. 结果
最优解:
-0.0018
0.0002
-0.0069
-0.0069
最优值:
4.5406e-08
迭代次数:
311