#include #include typedef void (*MatrixAction) (double*, double*, int n); // y = alpha*x (x,y - vectors, alpha - scalar) inline void vector_copy(double *y, double *x, int n, double alpha = 1.0) { for(int i=0; i eps) && (iter < max_iter)) { iter++; //Step 1: A(temp,p,n); //temp = Ap(matrix vector product) alpha = r_norm / vector_inner_product(temp,p,n); // alpha = (r_n,r_n) / (Ap_n,p,n) vector_add(x,p,n,alpha); // x_(n+1) = x_n + alpha p_n //Step 2: vector_add(r,temp,n,-alpha); //r_(n+1) = r_n - alpha A p_n //Step 3: beta = r_norm; //(r_n,r_n) r_norm = vector_inner_product(r,r,n); //(r_(n+1),r_(n+1)) beta = r_norm / beta; // (r_(n+1),r_(n+1)) / (r_n,r_n) vector_copy(temp,r,n); vector_add(temp,p,n,beta); //p_(n+1) = (temp) = r_(n+1) + beta p_n vector_copy(p,temp,n); } delete p; delete r; delete temp; return iter; }