工程数学上机实验(四)
共轭梯度法程序设计
1、实验目的
掌握共轭梯度法的基本思想及其迭代步骤;学会运用 MATLAB 编程实现常用优化算法;能够正确处理实验数据和分析实验结果及调试程序。
2、实验内容
(1)求解无约束优化问题;
(2)终止准则取,搜索方法采用非精确搜索 Armijo;
(3)完成 FR 共轭梯度法的 MATLAB 编程、调试;
(4)选取几个与实验二实验三中相同的初始点,并给出相关实验结果的对比及分析(从最优解、最优值、收敛速度(迭代次数)等方面进行比较);
(5)按照模板撰写实验报告,要求规范整洁。
3、操作要点
(1)通过编程实现 FR 共轭梯度法;
(2)使用 MTALAB 调试程序,并将实验结果保存到文件中;
(3)撰写实验报告。
4、主要仪器设备
微机及 Matlab 软件
代码:
FR_CG.m
function [x, fval, k] = FR_CG(fun, x0, max_iter, tol) % FR 共轭梯度法求解非线性方程组 % fun: 目标函数 % x0: 初始点 % max_iter: 最大迭代次数 % tol: 容许误差 % x: 最优解 % fval: 目标函数的最小值 % k: 迭代次数 % 初始化 k = 0; x = x0; g = gradient(fun, x); d = -g; fval = feval(fun, x); while (k < max_iter) && (norm(g) > tol) % 确定步长 alpha = fminbnd(@(alpha) feval(fun, x+alpha*d), 0, 1); % 更新解和梯度 x_new = x + alpha*d; g_new = gradient(fun, x_new); % 更新 FR 共轭方向 beta = (g_new'*(g_new - g)) / norm(g)^2; d_new = -g_new + beta*d; % 更新变量 x = x_new; g = g_new; d = d_new; fval = feval(fun, x); k = k + 1; end end function g = gradient(fun, x) % 计算梯度 h = 1e-8; n = length(x); g = zeros(n, 1); for i = 1:n x1 = x; x1(i) = x1(i) + h; g(i) = (feval(fun, x1) - feval(fun, x)) / h; end end
main.m
% 定义目标函数 f = @(x) 100*(x(2)-x(1)^2)^2 + (1-x(1))^2; % 设置不同的初始点并调用 FR 共轭梯度法求解 x0_list = [1.2, 1.2; -1.2, 1.2; -1.2, -1.2; 1.2, -1.2; 0, 0]; max_iter = 1000; % 设置最大迭代次数 tol = 1e-5; % 设置容许误差 for i = 1:size(x0_list, 1) x0 = x0_list(i,:)'; % 设置当前初始点 [x, fval, k] = FR_CG(f, x0, max_iter, tol); % 调用 FR_CG 函数求解 % 输出结果 fprintf('初始点 (%.1f, %.1f):\n', x0(1), x0(2)); fprintf('最优解为:(%.2f, %.2f)\n', x(1), x(2)); fprintf('迭代次数为:%d\n\n', k); end
运行结果:
本文作者:万事胜意k
本文链接:https://www.cnblogs.com/ysk0904/p/17401198.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步