最速下降法的C语言实现

对于无约束优化问题,一般是采用迭代法进行计算,其标准格式为:

x(k+1)=x(k)+a*s 其中a称作步长,s称作方向。步长a一般可以通过一维不精确线搜索(Armijo准则)计算,而根据方向s选择的不同,无约束优化问题一般有最速下降法、BFGS、共轭梯度法,牛顿及拟牛顿法等等,今天只讲最速下降法。

最速下降法的前进方向是目标函数f(x)的负梯度方向。其C语言代码如下:

// Zhuxu12-4.cpp : 定义控制台应用程序的入口点。

  1. #include "stdafx.h"
  2. #include <math.h>
  3. float fun(float x, float y)
  4. {
  5. return (1 - x)*(1 - x) + 100 * (y - x*x)*(y - x*x);
  6. }
  7. void gfun(float x, float y, float& g1, float& g2)
  8. {
  9. g1 = (-2)*(1 - x) - 400*x*(y - x*x);
  10. g2 = 200*(y - x*x);
  11. }
  12. float min(float a, float b)
  13. {
  14. return (a<b) ? a : b;
  15. }
  16. int armijo(float x, float y, float rho, float sigma, float dx, float dy)
  17. {
  18. float x1, y1;
  19. float g1, g2;
  20. gfun(x, y, g1, g2);
  21. int i = 0;
  22. int imax = 100;
  23. while (i<=imax)
  24. {
  25. x1 = x + pow(rho,i)*dx;
  26. y1 = y + pow(rho, i)*dy;
  27. if (fun(x1, y1) <= fun(x, y) + sigma*pow(rho, i)*(g1*dx + g2*dy))
  28. break;
  29. i = i + 1;
  30. }
  31. return i;
  32. }
  33. int main(int argc, char* argv[])
  34. {
  35. float x0, y0;
  36. float x, y;
  37. printf("Please input the initial value:x0,y0\n");
  38. scanf_s("%f ,%f", &x0, &y0);
  39. printf("x=%f,y=%f\n", x0, y0);
  40. int max_iter = 50000;
  41. float g1,g2,s1,s2;
  42. x = x0;
  43. y = y0;
  44. float rho=0.5f;
  45. float sigma = 0.2f;
  46. float EPS = 1e-4f;
  47. int i = 0;
  48. int j = 0;
  49. while (i <= max_iter)
  50. {
  51. i = i + 1;
  52. printf("第%d次:\n", I);
  53. gfun(x, y, g1, g2);
  54. if (sqrt(pow(g1, 2) + pow(g2, 2)) < EPS)
  55. break;
  56. s1 = -g1;
  57. s2 = -g2;
  58. j= armijo(x, y, rho, sigma, s1, s2);
  59. printf("搜索次数:%d\t", j);
  60. printf("最佳步长:%f\n", pow(rho,j));
  61. x =  x + pow(rho, j)*s1;
  62. y = y + pow(rho, j)*s2;
  63. }
  64. printf("最优解是:x=%f,y=%f\n", x,y);
  65. return 0;
  66. }



 

 

登录后您可以享受以下权益:

×
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

举报

选择你想要举报的内容(必选)
  • 内容涉黄
  • 政治相关
  • 内容抄袭
  • 涉嫌广告
  • 内容侵权
  • 侮辱谩骂
  • 样式问题
  • 其他
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回顶部