Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //gradient descent
- #define n 2
- #include <stdio.h>
- #include <math.h>
- #include <stdlib.h>
- double f(double *x)
- {
- double out = 0;
- for (int i = 0; i < n; i++)
- {
- out += (x[i] - 2)*(x[i] - 2);
- }
- return out;
- }
- void grad(double* x, double *g)
- {
- for (int i = 0; i < n; i++)
- {
- g[i] = 2 * x[i] - 4;
- }
- }
- double dist(double* x1, double* x2)
- {
- double d = 0;
- for (int i = 0; i < n; i++)
- {
- d += (x1[i] - x2[i])*(x1[i] - x2[i]);
- }
- return sqrt(d);
- }
- int descent(double alpha, int pasi, double* x)
- {
- double g[n] = { 0,0 };
- for (int i = 0; i < pasi; i++)
- {
- grad(x, g);
- printf("gradient: %lf %lf \n", g[0], g[1]);
- for (int j = 0; j < n; j++)
- {
- x[j] -= alpha*g[j];
- }
- printf("pas: %d x: %lf %lf f: %lf \n", i, x[0], x[1], f(x));
- }
- return pasi;
- }
- int descent2(double alpha, double eps, double * x)
- {
- double g[n] = { 0,0 };
- double old[n];
- double d = 999;
- int pasi = 0;
- while (d > eps)
- {
- for (int j = 0; j < n; j++)
- {
- old[j] = x[j];
- }
- pasi++;
- grad(x, g);
- printf("gradient: %lf %lf \n", g[0], g[1]);
- for (int j = 0; j < n; j++)
- {
- x[j] -= alpha*g[j];
- }
- printf("pas: %d x: %lf %lf f: %lf \n", pasi, x[0], x[1], f(x));
- d = dist(old, x);
- }
- return pasi;
- }
- int main()
- {
- double x[] = { -3, 5 };
- double y[] = { 5, 8 };
- descent(0.3, 10, x);
- descent2(0.3, 0.01, y);
- system("pause");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement