工程数学实验二

所花时间:2小时

代码量:如下

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

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

实验二:最速下降法程序设计

一、实验目的

通过最速下降法的程序设计,为今后的约束优化方法的学习和编程奠定基础;掌握负梯度方向 的定义和最速下降法的迭代公式 ;通过此次实验,进一步巩固最速下降法的基本 原理和思想。

二、实验内容

    1、主要内容

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

(2)终止准则取 ;

(3)完成最速下降法(负梯度法)的 MATLAB 编程、调试;

(4)要求选取多个不同的初始点,并给出迭代次数,最优函数值等相关信息,有能力的同学尝 试画出最优值随迭代次数变化的曲线图;

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

2、操作要点

(1)最速下降法 Matlab 的实现;

(2)学会分析实验结果;

(3)撰写实验报告;

3、主要仪器设备

微机及 Matlab 软件

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

   1. 算法步骤

1)  .选择初始点$x_0$和迭代停止准则。迭代停止准则通常有两种:一种是预设的最大迭代次数,另一种是设定一个小于零的目标函数相对误差,当误差小于该值时认为已达到最优解。

2)  .计算当前点$x_k$的梯度$g_k=f’(x_k)$。

3)  .计算沿最陡峭方向的步长$t_k$。最陡峭方向就是负梯度方向$-g_k$,步长可以使用线性搜索或其他优化算法来确定。一般使用线搜索,即求解$\min\limits_{t>0}f(x_k-tg_k)$。

4)  .更新当前点$x_k$,即$x_{k+1}=x_k-t_kg_k$。

5)  .判断是否满足迭代停止准则。如果满足,算法停止;否则回到第2步,继续迭代。

   2. 代码

代码一:

function [x, fval, iter] = steepestDescent(f, gradient, x0, epsilon)
% 最速下降法求解无约束优化问题
% 输入:
%     f: 目标函数句柄
%     gradient: 目标函数梯度句柄
%     x0: 初始点
%     epsilon: 终止准则
% 输出:
%     x: 最优解
%     fval: 最优函数值
%     iter: 迭代次数

k = 0;  % 迭代次数
x = x0;  % 初始点为 x0
fx = feval(f, x);  % 计算目标函数值
grad = feval(gradient, x);  % 计算目标函数梯度
while norm(grad) > epsilon
    % 使用 Armijo 搜索确定步长
    alpha = 1;  % 初始步长
    while feval(f, x - alpha * grad) > fx - 1e-4 * alpha * norm(grad)^2
        alpha = 0.5 * alpha;  % 减少步长
    end
    
    % 更新点
    x = x - alpha * grad;
    fx = feval(f, x);
    grad = feval(gradient, x)
    % 统计迭代次数
    k = k + 1;
end
% 返回结果
fval = fx;
iter = k;
end

代码二:% 目标函数
f = @(x) (x(1)-1)^2 + (x(2)-2)^2;
% 梯度函数
grad = @(x) [2*(x(1)-1); 2*(x(2)-2)];
% 初始点
x0 = [0; 0];
% 终止准则
epsilon = 1e-6;
% 求解
[x, fval, iter] = steepestDescent(f, grad, x0, epsilon);
% 输出结果
disp(['最优解为:(', num2str(x(1)), ', ', num2str(x(2)), ')']);
disp(['最优函数值为:', num2str(fval)]);
disp(['迭代次数:', num2str(iter)]);

   3. 结果

 

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