Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ////metoda gradientów sprzężonych
- solution CG(matrix x0, double h0, double epsilon, int Nmax, matrix* ud, matrix* ad) {
- int n = get_len(x0);
- solution X, X1;
- X.x = x0;
- matrix d(n, 1), * P = new matrix[2];
- solution h;
- double* ab, beta;
- X.grad();
- //d0 jest rowne gradientowi
- d = -X.g;
- while (true) {
- if (h0 < 0) {
- P[0] = X.x;
- P[1] = d;
- ab = expansion(0, 1, 1.2, Nmax, ud, P);
- h = golden(ab[0], ab[1], epsilon, Nmax, ud, P);
- X1.x = X.x - h.x * d;
- }
- else
- X1.x = X.x + h0 * d;
- #if LAB_NO == 5 && LAB_PART == 2
- ud->add_row(trans(X1.x));
- #endif
- if (norm(X.x - X1.x) < epsilon || solution::f_calls > Nmax || solution::g_calls > Nmax) {
- X1.fit_fun(ud);
- return X1;
- }
- X1.grad();
- // betda do okreslania kolejnych wartosci kierunku
- beta = pow(norm(X1.g), 2) / pow(norm(X.g), 2);
- d = -X1.g + beta * d;
- X = X1;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement