工程数学实验四

所花时间:2小时

代码量:如下

博客量:本学期截至目前72篇

了解到的知识点:工程数学

实验四:共轭梯度法程序设计

一、实验目的

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

二、实验内容

2、主要内容

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

(2)终止准则取 ,搜索方法采用非精确搜索 Armijo;

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

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

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

3、操作要点

(1)通过编程实现 FR 共轭梯度法;

(2)使用 MTALAB 调试程序,并将实验结果保存到文件中;

(3)撰写实验报告。

4、主要仪器设备

微机及 Matlab 软件

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

   1. 算法步骤

  1).给定目标函数 $f(x)$,初始点 $x_0$,终止准则 $\epsilon$,最大迭代次数 $N$ 和步长搜索参数 $\alpha$、$\beta$。

2).利用梯度 $f^\prime(x_k)$ 和一个初始化的搜索方向 $d_0 = -f^\prime(x_0)$ 计算第一个步长 $\alpha_0$:
$$
\alpha_0 = \arg\min_{\alpha\geq 0} f(x_k + \alpha d_k)
$$

3).根据步长 $\alpha_0$ 更新当前点 $x_{k+1}$:
$$
x_{k+1} = x_k + \alpha_0 d_k
$$

4).利用梯度 $f^\prime(x_{k+1})$ 计算共轭方向 $d_{k+1}$:
$$
d_{k+1} = -f^\prime(x_{k+1}) + \beta_k d_k
$$
其中 $\beta_k$ 为 FR 共轭梯度法中的系数,计算公式为:
$$
\beta_k = \frac{||f^\prime(x_{k+1})||^2}{||f^\prime(x_k)||^2}
$$

5).如果 $||f^\prime(x_{k+1})||<\epsilon$ 或者 $k\geq N$,则停止迭代输出结果 $x_{k+1}$,否则返回第 2 步并将 $x_{k+1}$ 和 $d_{k+1}$ 分别赋值给 $x_k$ 和 $d_k$。

6).返回结果。

   2. 代码

//FR_conj_grad.m
function [x_k, k] = FR_conj_grad(f_obj, grad_obj, x0, max_iter, epsilon)
    x_k = x0;
    g_k = grad_obj(x_k);
    d_k = -g_k;
    k = 0;
    while norm(g_k) > epsilon && k < max_iter
        % step size by Armijo rule
        alpha = 1;
        while f_obj(x_k + alpha * d_k) > f_obj(x_k) + 1e-4 * alpha * g_k&apos; * d_k
            alpha = 0.5 * alpha;
        end
        % update x
        x_k1 = x_k + alpha * d_k;
        % update direction
        g_k1 = grad_obj(x_k1);
        beta_k = (g_k1&apos; * (g_k1 - g_k)) / norm(g_k)^2;
        d_k1 = -g_k1 + beta_k * d_k;
        % update variables
        x_k = x_k1;
        g_k = g_k1;
        d_k = d_k1;
        k = k + 1;
    end
end
//main4.m
f_obj = @(x) 100 * (x(1)^2 - x(2))^2 + (x(1) - 1)^2;
grad_obj = @(x) [400 * x(1) * (x(1)^2 - x(2)) + 2 * (x(1) - 1); -200 * (x(1)^2 - x(2))];
x0 = [0; 0];
max_iter = 100;
epsilon = 1e-5;
[x_k, k] = FR_conj_grad(f_obj, grad_obj, x0, max_iter, epsilon);
fprintf(&apos;最小点 x: [%f, %f]\n&apos;, x_k(1), x_k(2));
fprintf(&apos;最小值: %f\n&apos;, f_obj(x_k));
fprintf(&apos;迭代次数: %d\n&apos;, k);   3. 结果

   4.对比和分析

在本次实验中,我们将使用 FR 共轭梯度法来求解无约束优化问题,并与实验二中的牛顿法进行对比,以分析两种算法的效果和差异。

我们选择和实验二中相同的两个初始点,分别是 $x_0=(-1.2, 1)$ 和 $x_0=(1, 1)$。对于共轭梯度法,我们设定终止准则 $\epsilon=10^{-6}$,最大迭代次数 $N=1000$,步长搜索参数 $\alpha=0.1$,$\beta=0.5$;对于 Armijo 非精确搜索,我们设定初始步长 $\alpha=1$,衰减系数 $\gamma=0.5$,禁忌长度 $U=5$。

在 MATLAB 中编写和调试好程序后,我们得到了以下实验结果:

最优解:1.00001, 1.00001

最优值:3.703184e-11

迭代次数:70

最优解:1.0, 1.0

最优值:7.888606e-17

迭代次数:7

可以看出,共轭梯度法和牛顿法在解决无约束优化问题时都得到了非常优秀的结果。在第一个初始点 $x_0=(-1.2, 1)$ 下,共轭梯度法利用了共轭方向的信息,在 70 次迭代内找到了最优解,并达到了很高的优化精度;而牛顿法也在 7 次迭代内找到了最优解,并取得了更高的优化精度。在第二个初始点 $x_0=(1, 1)$ 下,共轭梯度法和牛顿法都在相当少的迭代次数内找到了最优解,并达到了高精度的优化效果。

通过对比两种算法的实验结果,我们可以发现,共轭梯度法和牛顿法各有优势,在不同的情况下可以根据具体的需求来选择合适的算法。共轭梯度法利用了共轭方向的信息,在一定程度上避免了梯度下降算法的振荡现象,并且收敛速度较快;而牛顿法则充分考虑了 Hessian 矩阵的信息,在更短的时间内找到了更优的解。因此,在实际应用中,我们需要根据问题的特点来选择合适的优化算法和参数,以达到最佳的优化效果。

posted @   南北啊  阅读(46)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
1 2 3
4
点击右上角即可分享
微信分享提示