实验四:共轭梯度法程序设计
一、实验目的
掌握共轭梯度法的基本思想及其迭代步骤;学会运用MATLAB编程实现常用优化算法;能够正确处理实验数据和分析实验结果及调试程序。
二、实验内容
(1)求解无约束优化问题:
(2)终止准则取;
(3)完成FR共轭梯度法的MATLAB编程、调试;
(4)选取几个与实验二实验三中相同的初始点,并给出相关实验结果的对比及分析(从最优解、最优值、收敛速度(迭代次数)等方面进行比较);
(5)按照模板撰写实验报告,要求规范整洁。
三、算法步骤、代码、及结果
1. 算法步骤
1.选择初始点:选择初始点( x_0 ),并计算初始的梯度( \nabla f(x_0) )。
2.初始化变量:设初始搜索方向( d_0 = -\nabla f(x_0) )。
3.迭代计算:
a. 对于第( k )次迭代:
- 线搜索:选择步长( \alpha_k ),满足一定的下降条件(如Armijo条件)。
- 更新参数:( x_{k+1} = x_k + \alpha_k d_k )。
- 计算梯度:( \nabla f(x_{k+1}) )。
- 计算共轭方向:( \beta_k = \frac{\nabla f(x_{k+1})^\top \nabla f(x_{k+1})}{\nabla f(x_k)^\top \nabla f(x_k)} )。
- 更新搜索方向:( d_{k+1} = -\nabla f(x_{k+1}) + \beta_k d_k )。
4.收敛条件:通常使用梯度范数( ||\nabla f(x_k)|| )或函数值差别作为收敛条件。
5.终止条件:当满足收敛条件时,停止迭代。
2. 代码
function fr_conjugate_gradient_optimization
% 定义初始点
initial_points = [1, 1, 1, 1; 10, -10, 5, -5]; % 二维矩阵,每行代表一个初始点
% 迭代结果变量
results = [];
for i = 1:size(initial_points, 1)
x0 = initial_points(i, :)';
[x_opt, f_opt, iter_count] = fr_conjugate_gradient(@obj_func, @grad_func, x0, 1e-6, 1000);
results = [results; x_opt', f_opt, iter_count]; %#ok<AGROW>
end
% 输出结果
disp('Results (each row: x_opt, f_opt, iter_count):');
disp(results);
end
function [x_opt, f_opt, iter_count] = fr_conjugate_gradient(f, grad_f, x0, tol, max_iter)
x = x0;
g_old = grad_f(x);
d = -g_old;
for iter_count = 1:max_iter
% 线搜索确定步长alpha
alpha = line_search(f, grad_f, x, d);
% 更新x
x = x + alpha * d;
% 计算新的梯度g_new
g_new = grad_f(x);
% 终止准则
if norm(g_new) < tol
break;
end
% 计算beta
beta = (g_new' * g_new) / (g_old' * g_old);
% 更新方向d
d = -g_new + beta * d;
% 更新旧梯度
g_old = g_new;
end
x_opt = x;
f_opt = f(x);
end
function alpha = line_search(f, grad_f, x, d)
% 一个简单的线搜索实现,可考虑更复杂的线搜索策略(如Wolfe条件)
alpha = 1;
c = 1e-4;
rho = 0.9;
while f(x + alpha * d) > f(x) + c * alpha * grad_f(x)' * d
alpha = rho * alpha;
end
end
% 目标函数
function f = obj_func(x)
f = (x(1) + 10*x(2))^2 + 5*(x(3) - x(4))^2 + (x(2) - 2*x(3))^4 + 10*(x(1) - x(4))^4;
end
% 梯度函数
function g = grad_func(x)
g = zeros(4, 1);
g(1) = 2*(x(1) + 10*x(2)) + 40*(x(1) - x(4))^3;
g(2) = 20*(x(1) + 10*x(2)) + 4*(x(2) - 2*x(3))^3;
g(3) = 10*(x(3) - x(4)) - 8*(x(2) - 2*x(3))^3;
g(4) = 10*(x(4) - x(3)) + 40*(x(1) - x(4))^3;
end
标签:opt,end,梯度,nabla,6.14,grad,alpha,程序设计,共轭 From: https://www.cnblogs.com/xuan-2004/p/18250295