void Cholesky (int n, double **A) { int i,j, k = 0; double **R = mat_cria(n,n); double **ut = mat_cria(n,1); double **u = mat_cria(1,n); double **uut = mat_cria(n,n); for(i = 0; i < n; i++) { R[i][i] = sqrt(A[i][i]); for(k = i+1; k < n; k++) ut[k][0] = (1/R[i][i])*A[i][k]; mat_transposta(n,1,ut, u); mat_multm(n,1,n,ut, u, uut); for(k = i+1; k < n; k++) { for(j = i+1; j < n; j++) { A[k][j] = A[k][j] - uut[k][j]; } } } }
void test_mat_multm() { double a[6] = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0}; double** A = mat_from_vector(a, 2, 3); double b[6] = {10.0, 20.0, 30.0, 40.0, 50.0, 60.0}; double** B = mat_from_vector(a, 3, 2); double** C = mat_cria(2, 2); mat_multm(2, 3, 2, A, B, C); assert(C[0][0] == 22.0); assert(C[0][1] == 28.0); assert(C[1][0] == 49.0); assert(C[1][1] == 64.0); }
int main (void) { double** A = mat_cria(3,3); double** B = mat_cria(3,2); double** C = mat_cria(3,3); double** D = mat_cria(3,2); double** E = mat_cria(2,5); double x[5]; double v[3]; double w[3]; double XE[2]; // Vetor v v[0] = 0; v[1] = 1; v[2] = 2; // vetor x x[0] = 1; x[1] = 2; x[2] = 3; x[3] = 4; x[4] = 5; // Matriz A A[0][0] = 1; A[0][1] = 2; A[0][2] = 3; A[1][0] = 4; A[1][1] = 5; A[1][2] = 6; A[2][0] = 7; A[2][1] = 8; A[2][2] = 9; // Matriz B B[0][0] = 0; B[0][1] = 1; B[1][0] = 0; B[1][1] = 1; B[2][0] = 0; B[2][1] = 1; //Matriz E E[0][0] = 1; E[0][1] = 2; E[0][2] = 3; E[0][3] = 4; E[0][4] = 5; E[1][0] = 1; E[1][1] = 2; E[1][2] = 3; E[1][3] = 4; E[1][4] = 5; // Imprime a matriz printf(" Matriz A \n"); printm(3,3,A); mat_transposta(3,3, A, C); printf("\n\n Matriz Transposta C \n"); printm(3,3,C); printf("\n\n Vetor resultante da multiplicacao Matriz A x Vetor V \n"); mat_multv(3,3, A, v, w); printf("%g\n%g\n%g\n", w[0], w[1], w[2]); mat_multm(3,3,2, A, B, D); printf(" Matriz resultante da multiplicacao Matriz A x Matriz B \n"); printm(3,2,D); printf("\n\n Vetor resultante da multiplicacao vetor x * matriz E \n"); mat_multv(2,5, E, x, XE); printf("%g\n%g\n\n", XE[0], XE[1]); mat_libera(3, A); mat_libera(3, B); mat_libera(3, C); mat_libera(3, D); return 0; }
int main(){ double *x,*b, *bbarra; int n =100, i, tol =5; Matriz*** A, ***M, ***N; for(n=100; n<=10000;n=n*10){ A = mat_esparsa(n); x = (double*) calloc(n+IDX,sizeof(double)); b = (double*) calloc(n+IDX,sizeof(double)); bbarra = (double*) calloc(n+IDX,sizeof(double)); //Vetor solução for(int i =IDX; i< n+IDX; i++) x[i]=1; // Calculo do vetor b correto obtido atraves de Ax = b mat_multv(n,A,x,b); /*****SEM PRECOND*****/ //Redefinição de x[] para estimativa inicial vetor nulo for(int i =IDX; i< n+IDX; i++) x[i]=0; printf("\n\tMetodo gradiente Conjugado com pre condicionador de Sem PreCond , n= %d \n",n ); i = ConjugateGradient(n, A, b, x,tol); printf("\n\ti = %d \t\n",i ); /******Jacobi*********/ //Redefinição de x[] para estimativa inicial vetor nulo for(int i =IDX; i< n+IDX; i++) x[i]=0; // Matriz pre condicionador de Jacobi M = JacobiPC(A, n); //Minv Ax = Minv b/ N = mat_cria(n,n); mat_multm(n,M,A,N); mat_multv(n, M, b, bbarra); printf("\n\tMetodo gradiente Conjugado com pre condicionador de Jacobi , n= %d \n",n ); // Metodo gradiente Conjugado com pre condicionador de Jacobi , n= 1000 i = ConjugateGradient(n, N, bbarra, x,tol); printf("\n\ti = %d \t\n",i ); mat_libera(n,M); mat_libera(n,N); /******Gaus Seidel****/ //Redefinição de x[] para estimativa inicial vetor nulo for(int i =IDX; i< n+IDX; i++) x[i]=0; printf("\n\tMetodo gradiente Conjugado com pre condicionador de GaussSeidel , n= %d \n",n ); M = pre_cond(A,n,1); i = ConjugateGradientPC(n, A, M, b, x, tol); printf("\n\ti = %d \t\n",i ); mat_libera(n,M); /***** SSOR *********/ //Redefinição de x[] para estimativa inicial vetor nulo for(int i =IDX; i< n+IDX; i++) x[i]=0; printf("\n\tMetodo gradiente Conjugado com pre condicionador de SSOR , n= %d \n",n ); M = pre_cond(A,n,1.5); i = ConjugateGradientPC(n, A, M, b, x, tol); printf("\n\ti = %d \t\n",i ); mat_libera(n,M); //=======Fim do Loop======// free(x); free(b); free(bbarra); mat_libera(n,A); } for(n=100; n<=10000;n=n*10){ A = mat_esparsa_extend(n); x = (double*) calloc(n+IDX,sizeof(double)); b = (double*) calloc(n+IDX,sizeof(double)); bbarra = (double*) calloc(n+IDX,sizeof(double)); //Vetor solução for(int i =IDX; i< n+IDX; i++) x[i]=1; // Calculo do vetor b correto obtido atraves de Ax = b mat_multv(n,A,x,b); /*****SEM PRECOND*****/ //Redefinição de x[] para estimativa inicial vetor nulo for(int i =IDX; i< n+IDX; i++) x[i]=0; printf("\n\tMetodo gradiente Conjugado com pre condicionador de Sem PreCond , n= %d \n",n ); i = ConjugateGradient(n, A, b, x,tol); printf("\n\ti = %d \t\n",i ); /******Jacobi*********/ //Redefinição de x[] para estimativa inicial vetor nulo for(int i =IDX; i< n+IDX; i++) x[i]=0; // Matriz pre condicionador de Jacobi M = JacobiPC(A, n); //Minv Ax = Minv b/ N = mat_cria(n,n); mat_multm(n,M,A,N); mat_multv(n, M, b, bbarra); printf("\n\tMetodo gradiente Conjugado com pre condicionador de Jacobi , n= %d \n",n ); // Metodo gradiente Conjugado com pre condicionador de Jacobi , n= 1000 i = ConjugateGradient(n, N, bbarra, x,tol); printf("\n\ti = %d \t\n",i ); mat_libera(n,M); mat_libera(n,N); /******Gaus Seidel****/ //Redefinição de x[] para estimativa inicial vetor nulo for(int i =IDX; i< n+IDX; i++) x[i]=0; printf("\n\tMetodo gradiente Conjugado com pre condicionador de GaussSeidel , n= %d \n",n ); M = pre_cond(A,n,1); i = ConjugateGradientPC(n, A, M, b, x, tol); printf("\n\ti = %d \t\n",i ); mat_libera(n,M); /***** SSOR *********/ //Redefinição de x[] para estimativa inicial vetor nulo for(int i =IDX; i< n+IDX; i++) x[i]=0; printf("\n\tMetodo gradiente Conjugado com pre condicionador de SSOR , n= %d \n",n ); M = pre_cond(A,n,1.5); i = ConjugateGradientPC(n, A, M, b, x, tol); printf("\n\ti = %d \t\n",i ); mat_libera(n,M); //=======Fim do Loop======// free(x); free(b); free(bbarra); mat_libera(n,A); } }