Advertisement
Guest User

Untitled

a guest
Apr 27th, 2017
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.40 KB | None | 0 0
  1. //gradient descent
  2. #define n 2
  3. #include <stdio.h>
  4. #include <math.h>
  5. #include <stdlib.h>
  6.  
  7.  
  8. double f(double *x)
  9. {
  10. double out = 0;
  11.  
  12. for (int i = 0; i < n; i++)
  13. {
  14. out += (x[i] - 2)*(x[i] - 2);
  15. }
  16. return out;
  17. }
  18.  
  19. void grad(double* x, double *g)
  20. {
  21. for (int i = 0; i < n; i++)
  22. {
  23. g[i] = 2 * x[i] - 4;
  24. }
  25. }
  26.  
  27. double dist(double* x1, double* x2)
  28. {
  29. double d = 0;
  30. for (int i = 0; i < n; i++)
  31. {
  32. d += (x1[i] - x2[i])*(x1[i] - x2[i]);
  33. }
  34. return sqrt(d);
  35. }
  36.  
  37. int descent(double alpha, int pasi, double* x)
  38. {
  39. double g[n] = { 0,0 };
  40. for (int i = 0; i < pasi; i++)
  41. {
  42. grad(x, g);
  43. printf("gradient: %lf %lf \n", g[0], g[1]);
  44. for (int j = 0; j < n; j++)
  45. {
  46. x[j] -= alpha*g[j];
  47. }
  48. printf("pas: %d x: %lf %lf f: %lf \n", i, x[0], x[1], f(x));
  49. }
  50. return pasi;
  51. }
  52.  
  53. int descent2(double alpha, double eps, double * x)
  54. {
  55. double g[n] = { 0,0 };
  56. double old[n];
  57. double d = 999;
  58. int pasi = 0;
  59. while (d > eps)
  60. {
  61. for (int j = 0; j < n; j++)
  62. {
  63. old[j] = x[j];
  64. }
  65. pasi++;
  66. grad(x, g);
  67. printf("gradient: %lf %lf \n", g[0], g[1]);
  68. for (int j = 0; j < n; j++)
  69. {
  70. x[j] -= alpha*g[j];
  71. }
  72. printf("pas: %d x: %lf %lf f: %lf \n", pasi, x[0], x[1], f(x));
  73. d = dist(old, x);
  74. }
  75. return pasi;
  76. }
  77.  
  78. int main()
  79. {
  80. double x[] = { -3, 5 };
  81. double y[] = { 5, 8 };
  82. descent(0.3, 10, x);
  83. descent2(0.3, 0.01, y);
  84. system("pause");
  85. return 0;
  86. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement