• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

NEFCODER

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

2023-07-08 《数值优化方法》-庞丽萍,肖现涛-无约束最优化(五).md

2023-07-08 《数值优化方法》-庞丽萍,肖现涛-无约束最优化(五)

数值优化方法Matlab最速下降法

考虑无约束最优化问题


其中是一阶连续可微的 (记作), 也就具有连续的一阶偏导数. 最速下降法的基本思想正如其名字一样,就是在当前迭代点处寻找一个使目标函数下降最快的方向. 这样的方向由下述问题(下降量)

的解给出,因此为函数在处的最速下降方向。

最速下降法
Step 1. 选取初始点, 给定精度, 置.

Step 2. 计算, 若, 则停止,置最优解为, 否则转下步.

Step 3. 取, 作精确线搜索


得解, 令, , 转 Step 1.

下面给出最速下降法的收敛性证明:

定理1 设函数二阶连续可微有下界,存在满足, 若最速下降法产生无穷点列, 则.#673AB7

证明:由算法和定义可知序列单调有界,即收敛. 对任意, 存在, 使得


由假设和可得

考虑合并,得到

令, 由精确线搜索可知


由于收敛,因此.

最速下降法迭代路径呈锯齿状的原因: 由于采用的是精确线搜索方法,在当前下降方向已经充分下降了。从这也可以知道如果是一维优化问题,最速下降法一步即可达到最优 (精确线搜索).

下面的程序可求解多维优化问题,使用的是成功-失败法搜索

  1. % 最速下降法 

  2. function [x xlog] = SteepestDes(f, x0, epsilon) 

  3. % f 目标函数,函数句柄 

  4. % g 梯度函数 函数句柄 

  5. % epsilon 精度要求 

  6. % method 线搜索方法 

  7. k = 0; 

  8. while k <= 1e4 

  9. diff_x = -My_Gradient(f, x0); 

  10. if norm(diff_x) < epsilon 

  11. x = x0; 

  12. xlog(k+1) = norm(diff_x); 

  13. break 

  14. end 

  15. [alpha tx] = SuccFa(f, 1, x0, diff_x, 1, epsilon, 1e4); 

  16. x0 = x0 + alpha * diff_x; 

  17. k = k + 1; 

  18. xlog(k) = norm(diff_x); 

  19. end 

  20.  

  21. end 

  22.  

  23. function [alphak xlog] = SuccFa(fun, alpha, x0, diff_x, h, epsil, maxIt) 

  24. k = 0; 

  25. xlog = alpha; 

  26. while k <= maxIt 

  27. alphak = alpha + h; 

  28. if fun(x0 + alphak * diff_x) < fun(x0 + alpha * diff_x) 

  29. h = 2 * h; 

  30. alpha = alphak; 

  31. else 

  32. h = - h / 4; 

  33. end 

  34. k = k + 1; 

  35. xlog(k) = alphak; 

  36. if abs(h) < epsil 

  37. break 

  38. end 

  39. end 

  40. end 

  41.  

  42. function [x] = F_alpha(alpha) 

  43. x = f(x0 + alpha * diff_x); 

  44. end 

  45.  

  46.  

  47. function [gd] = My_Gradient(f, x) 

  48. gd = x; 

  49. epsil = 1e-5; 

  50. d = [-2* epsil, -epsil 0 epsil 2*epsil]; 

  51. tx = [x x x x x]; 

  52. fx = [0,0,0,0,0]; 

  53. for i = 1:length(x) 

  54. tx(i,:) = tx(i,:) + d; 

  55. for h = 1:5 

  56. fx(h) = f(tx(:,h)); 

  57. end 

  58. gf = gradient(fx); 

  59. gd(i) = gf(3); 

  60. end 

  61. end 

测试程序

  1. f = @(x) sin(x(1)) + cos(x(2)); 

  2. x0 = [1 ,2]'; 

  3. epsilon = 1e-8; 

  4. [x xlog] = SteepestDes(f, x0, epsilon) 

  5.  

  6. f = @(x) sin(x); 

  7. x0 = 1; 

  8. epsilon = 1e-8; 

  9. [x xlog] = SteepestDes(f, x0, epsilon) 

posted on 2023-07-08 17:45  XNEF  阅读(201)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3