工程数学实验二
所花时间: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. 结果
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)