guozi6

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

实验四:共轭梯度法

一、实验目的

掌握共轭梯度法的基本思想及其迭代步骤;学会运用MATLAB编程实现常用优化算法;能够正确处理实验数据和分析实验结果及调试程序。

 

 

二、实验内容

 

(1)求解无约束优化问题:

(2)终止准则取;

(3)完成FR共轭梯度法的MATLAB编程、调试;

(4)选取几个与实验二实验三中相同的初始点,并给出相关实验结果的对比及分析(从最优解、最优值、收敛速度(迭代次数)等方面进行比较);

(5)按照模板撰写实验报告,要求规范整洁。

 

 

三、算法步骤、代码、及结果

1. 算法步骤

 

初始化

定义目标函数 func,它是一个字符串表达式,描述了优化问题的目标。

初始化起始点 x0,它是一个向量,表示在搜索空间中的起始位置。

设置容忍度 tol,用于确定何时停止迭代(当梯度的范数小于此值时)。

设置最大迭代次数 max_iter,以防止无限循环。

定义变量和函数

使用 length(x0) 确定变量的数量 n

使用符号变量 vars 定义符号表达式中的变量。

将目标函数字符串 func 转换为符号表达式 funf_sym

计算目标函数的梯度 gradf_sym 和海森矩阵 hessf_sym(尽管FR方法通常不需要海森矩阵,但这里被计算了)。

将符号表达式转换为MATLAB函数句柄 funfgradf  hessf,以便在数值计算中使用。

迭代过程

初始化当前点 x 为起始点 x0

计算当前点的梯度 g

初始化搜索方向 d 为负梯度方向 -g

初始化迭代计数器 k 0

主循环

当梯度的范数大于 tol 且迭代次数小于 max_iter 时,进行以下迭代:

计算搜索方向 d 与海森矩阵 Hd 的乘积(尽管FR方法不使用这个值来计算步长,但这里计算了)。

使用FR公式计算步长 alphaalpha = -(g' * d) / (d' * Hd)(注意:这里通常使用线搜索来找到最佳步长,而不是直接用这个公式)。

更新当前点 xx = x + alpha * d

计算新点的梯度 g_new

使用FR公式更新搜索方向 dd = -g_new + beta * d,其中 beta = (g_new' * g_new) / (g' * g)

更新梯度 g  g_new

递增迭代计数器 k

输出

迭代完成后,输出最优解 x 和迭代次数 k

2. 代码

function [x, iter] = FR(func, x0, tol, max_iter)

 

 

n = length(x0);

vars = sym('x', [1 n]);

 

 

funf_sym = str2sym(func);

 

 

gradf_sym = gradient(funf_sym, vars);

hessf_sym = hessian(funf_sym, vars);

 

 

funf = matlabFunction(funf_sym, 'Vars', {vars.'});

gradf = matlabFunction(gradf_sym, 'Vars', {vars.'});

hessf = matlabFunction(hessf_sym, 'Vars', {vars.'});

 

x = x0;

g = gradf(x);

d = -g;

k = 0;

 

while norm(g) > tol && k < max_iter

   

    Hd = hessf(x) * d;

    alpha = -(g' * d) / (d' * Hd);

   

  

    x = x + alpha * d;

   

    g_new = gradf(x);

   

 

    beta = (g_new' * g_new) / (g' * g);

   

 

    d = -g_new + beta * d;

 

    g = g_new;

   

    k = k + 1;

end

 

iter = k;

 

end

 

 

func = '(x1 + 10*x2)^2 + 5*(x3 - x4)^2 + (x2 - 2*x3)^4 + 10*(x1 - x4)^4';

 

 

x0 = [2; 2; 2; 2];

 

 

tol = 1e-6;

 

 

max_iter = 1000;

 

 

[x, iter] = FR(func, x0, tol, max_iter);

 

disp('Optimal solution x:');

disp(x);

disp(['Number of iterations: ', num2str(iter)]);

 

3. 结果

 

四、心得体会

通过本次实验我知道了共轭梯度法的实验原理

FR共轭梯度法是一种用于求解无约束优化问题的迭代算法,它结合了梯度下降法的迭代格式和共轭梯度法的思想。该方法在每一步迭代中,利用前一步的搜索方向和当前点的梯度信息来构造新的搜索方向,并通过一定的步长调整来更新迭代点。FR共轭梯度法具有二次终止性,即对于二次函数,该方法可以在有限步内达到精确解。

我对比了FR共轭梯度法与之前实验中使用的方法的性能差异,并分析了在最优解、最优值以及收敛速度等方面的差异。这次实验不仅加深了我对优化算法的理解,还提高了我的编程和调试能力。同时,我也认识到了不同算法在求解实际问题时的优缺点和适用范围。在未来的学习和研究中,我将继续探索更多的优化

posted on 2024-04-16 23:02  汀幻  阅读(1)  评论(0编辑  收藏  举报