工程数学上机实验(四)

 

共轭梯度法程序设计

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

运行结果:

posted @   意い十三章  阅读(30)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
点击右上角即可分享
微信分享提示