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

发布时间 2023-07-08 17:53:36作者: XNEF

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

考虑无约束最优化问题


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

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

最速下降法
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)