实验二:最速下降法程序设计
一、实验目的
通过最速下降法的程序设计,为今后的约束优化方法的学习和编程奠定基础;掌握负梯度方向的定义和最速下降法的迭代公式;
通过此次实验,进一步巩固最速下降法的基本 原理和思想
二、实验内容
(1)求解无约束优化问题: ;
(2)终止准则取 ;
(3)完成最速下降法(负梯度法)的 MATLAB 编程、调试;
(4)要求选取多个不同的初始点,并给出迭代次数,最优函数值等相关信息,有能力的同学尝
试画出最优值随迭代次数变化的曲线图;
(5)按照模板撰写实验报告,要求规范整洁
三、算法步骤、代码、及结果
1. 算法步骤
第1步:选取初始点 x^0给定终止误差 ε > 0 ,令 k = 0 ;
第2步:计算 ∇ f(x^k),若 ∣ ∣ ∇ f ( x^k ) ∣ ∣ ≤ ε 停止迭代,输出x^k 。否则进行第三步;
第3步:取 p^k = −∇f(x^k ) ;
第4步:进行一维搜索,求 λ k ,使得
f ( x k + λ k p k ) = min λ ≥ 0 f ( x k + λ p k )
令 x^{k+1} = x^k + p^k,k=k+1,转第 2 步
% 定义目标函数 f = @(x) 100*(x(2)-x(1)^2)^2 + (1-x(1))^2; % 最速下降法求解 % 设定初始点和迭代终止准则 x0_list = [-1, 1; -2, 7; 3,10]; % 多个不同的初始点 max_iter = 10000; tol = 1e-5; for i = 1:length(x0_list) x0 = x0_list(i,:); x = x0'; a = 0.01; % 步长 iter = 0; grad_norm = inf; % 初始化为正无穷 while grad_norm > tol && iter < max_iter iter = iter + 1; grad = [400*x(1)^3-400*x(1)*x(2)+2*x(1)-2; 200*(x(2)-x(1)^2)]; x_new = x - a*grad; if f(x_new) < f(x) x = x_new; a = a * 1.1; % 放大步长 else a = a * 0.5; % 缩小步长 end grad_norm = norm(grad); end fprintf('初始点 (%g, %g)\n', x0(1), x0(2)); fprintf('迭代次数: %d\n', iter); fprintf('最优点: (%g, %g)\n', x(1), x(2)); fprintf('最优函数值: %g\n', f(x)); fprintf('\n'); End % 绘制最优值随迭代次数的变化曲线 x = linspace(1, 413, 413); y = NaN(size(x)); for i = 1:413 y(i) = f([-0.300609; 0.00015509]); %第一个初始点 end plot(x, y); hold on; x = linspace(1, 560, 560); y = NaN(size(x)); for i = 1:560 y(i) = f([-0.300585; 0.000152774]); %第二个初始点 end plot(x, y); x = linspace(1, 87, 87); y = NaN(size(x)); for i = 1:87 y(i) = f([1; 1]); %第三个初始点 end plot(x, y); title('Optimal function value vs. Iteration'); xlabel('Iteration'); ylabel('Optimal function value'); legend('(-2,2)', '(-3,3)', '(0.5,-1.5)');
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统