[关闭]
@su 2014-06-10T04:28:50.000000Z 字数 3531 阅读 2702

数值优化方法实验报告

matlab 计算

共轭梯度法及改进

信计12 苏泽明
学号:2110902035

共轭梯度法

题目

minxR5f(x)=12xTGxbTx,

其中
G=411421143114411451146114711481149114101,b=518662581026409816386655382621461048577

代码

使用共轭梯度法求解该题,代码如下:
main 函数

  1. function GG_main()
  2. G = zeros(10);
  3. for t = 1:10
  4. G(t,t) = 4^t;
  5. if t>=2
  6. G(t,t-1) = 1;
  7. end
  8. if t<=9
  9. G(t,t+1) = 1;
  10. end
  11. end
  12. disp(G);
  13. b =[5 18 66 258 1026 4098 16386 65538 262146 1048577];
  14. x0 = zeros(1,10);
  15. max_iter = 1000;
  16. fprintf('\n')
  17. fprintf('Conjugate Gradient Methord:\n');
  18. fprintf('=============================');
  19. [y,iter] = frcg(G, b, x0, max_iter );
  20. fprintf('\n')
  21. fprintf(' Iterative number: \n %d \n',iter);
  22. fprintf(' Solution:\n');
  23. fprintf(' %10.6f',y);
  24. fprintf('\n\n==========================\n')

cg 函数

  1. function [x iter] = cg(G, b, x0, max_iter)
  2. x = x0';
  3. b=b';
  4. tolerance = 1.0e-6;
  5. fprintf('\n x0=');
  6. fprintf(' %10.6f',x0);
  7. %save sb.mat G b x
  8. size(x);
  9. size(b);
  10. size(G);
  11. r = G*x-b;
  12. d=-r;
  13. for k=1:max_iter
  14. if norm(r,2) <= tolerance
  15. iter = k-1;
  16. fprintf('\n Algorithm finds a solution!');
  17. return
  18. end
  19. alpha = (r'*r)/(d'*G*d);
  20. xx = x+alpha*d;
  21. rr = r+alpha*G*d;
  22. beta = (rr'*rr)/(r'*r);
  23. d = -rr+beta*d;
  24. x = xx;
  25. r = rr;
  26. fprintf('\n x%d = ',k);
  27. fprintf(' %10.6f',x);
  28. end
  29. iter = max_iter;
  30. return

结果如图所示:

结果

改进共轭梯度法

题目

minxR5f(x)=12xTGxbTx,

其中
G=411421143114411451146114711481149114101,b=518662581026409816386655382621461048577
参考《一种新线性搜索下的FR共轭梯度法》 利用wolfe准则来寻找共轭梯度法的步长 α,然后进行迭代,最后获得求解的结果。

代码

main 函数:

  1. function GG_main()
  2. G = zeros(10);
  3. for t = 1:10
  4. G(t,t) = 4^t;
  5. if t>=2
  6. G(t,t-1) = 1;
  7. end
  8. if t<=9
  9. G(t,t+1) = 1;
  10. end
  11. end
  12. disp(G);
  13. b =[5 18 66 258 1026 4098 16386 65538 262146 1048577];
  14. x0 = zeros(1,10);
  15. max_iter = 1000;
  16. fprintf('\n')
  17. fprintf('Conjugate Gradient Methord:\n');
  18. fprintf('=============================');
  19. [y,iter] = frcg(G, b, x0, max_iter );
  20. fprintf('\n')
  21. fprintf(' Iterative number: \n %d \n',iter);
  22. fprintf(' Solution:\n');
  23. fprintf(' %10.6f',y);
  24. fprintf('\n\n==========================\n')

frcg 函数:

  1. function [x iter] = frcg(G, b, x0, max_iter)
  2. x = x0';
  3. b=b';
  4. tolerance = 1.0e-6;
  5. fprintf('\n x0=');
  6. fprintf(' %10.6f',x0);
  7. r = G*x-b;
  8. d=-r;
  9. rou = 0.1;
  10. deta = 0.75;
  11. alphamax = 1;
  12. alpha1 = 0;
  13. alpha2 = alphamax;
  14. for k=1:max_iter
  15. if norm(r,2) <= tolerance
  16. iter = k-1;
  17. fprintf('\n Algorithm finds a solution!');
  18. return
  19. end
  20. %temp1 = main(-r'*r,norm(r,2));
  21. %fprintf('%d',k);
  22. if k >= 2
  23. fai1 = 0.5*x'*G*x - b'*x;
  24. fai1d = -(G*x-b)'*d;
  25. alpha = 0.618*(alpha2- alpha1)+alpha1;
  26. fai = 0.5*(x+ alpha*d)'*G*(x+ alpha*d) - b'*(x+ alpha*d);
  27. while true
  28. if (fai-fai1) > -rou*alpha*min(fai1d'*d, norm((G*x - b)'*d,2));
  29. alphab = alpha1 + 0.5*(alpha -alpha1)/(1+(fai1-fai)/((alpha-alpha1)*fai1d));
  30. alpha2 = alpha;
  31. alpha = alphab;
  32. end
  33. faid =-(G'*(x+alpha*d)-b)'*d;
  34. if abs(faid'*d) >= deta*min(faid,norm(fai1d,2))
  35. alphab = alpha + (alpha - alpha1)*faid/(fai1d-faid);
  36. alpha1 = alpha;
  37. fai1d = faid;
  38. fai1 = fai;
  39. alpha = alphab;
  40. else
  41. alpha = abs(alpha);
  42. break
  43. end
  44. end
  45. else
  46. %fprintf('wo zei')
  47. alpha = (r'*r)/(d'*G*d);
  48. end
  49. fprintf('\n Wolfe alpha: %d',alpha)
  50. alpha = (r'*r)/(d'*G*d);
  51. fprintf('\n cg alpha: %d',alpha)
  52. xx = x+alpha*d;
  53. rr = r+alpha*G*d;
  54. beta = (rr'*rr)/(r'*r);
  55. d = -rr+beta*d;
  56. x = xx;
  57. r = rr;
  58. fprintf('\n x%d = ',k);
  59. fprintf(' %10.6f',x);
  60. disp(alpha)
  61. end
  62. end

结果

结果
可以看出wolfe 准则求解获得的 α,与共轭梯度法精确线性搜索获得 的步长大小几乎相同。

总结

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注