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); }
void test_mat_transposta() { double a[9] = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0}; double** A = mat_from_vector(a, 3, 3); double** TA = mat_cria(3, 3); mat_transposta(3, 3, A, TA); assert(TA[0][0] == 1.0); assert(TA[0][1] == 4.0); assert(TA[0][2] == 7.0); assert(TA[1][0] == 2.0); assert(TA[1][1] == 5.0); assert(TA[1][2] == 8.0); assert(TA[2][0] == 3.0); assert(TA[2][1] == 6.0); assert(TA[2][2] == 9.0); }
void test_mat_libera() { int i; double** A = mat_cria(100, 200); mat_libera(100, A); }
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 (void){ double ** A0 = mat_cria(3,3); double *b0 = (double*)malloc(3*sizeof(double)); double ** A1 = mat_cria(3,3); double *b1 = (double*)malloc(3*sizeof(double)); double *x0 = (double*)malloc(3*sizeof(double)); double *x1 = (double*)malloc(3*sizeof(double)); A0[0][0] = 1; A0[0][1] = -1; A0[0][2] = 0; A0[1][0] = -1; A0[1][1] = 2; A0[1][2] = 1; A0[2][0] = 0; A0[2][1] = 1; A0[2][2] = 2; b0[0] = 0; b0[1] = 2; b0[2] = 3; A1[0][0] = 1; A1[0][1] = -1; A1[0][2] = 0; A1[1][0] = -1; A1[1][1] = 2; A1[1][2] = 1; A1[2][0] = 0; A1[2][1] = 1; A1[2][2] = 5; b1[0] = 3; b1[1] = -3; b1[2] = 4; printf("Vetor Solucao 1 \n"); x0[0] = 0;x0[1] = 0;x0[2] = 0; ConjugateGradient(3, A0, b0, x0); printv(3, x0); printf("Matriz R1 \n"); Cholesky(3, A0); printm(3, A0); printf("Vetor Solucao 2 \n"); x1[0] = 0;x1[1] = 0;x1[2] = 0; ConjugateGradient(3, A1, b1, x1); printv(3, x1); printf("Matriz R2 \n"); Cholesky(3, A1); printm(3, A1); free(A0); free(A1); free(b0); free(b1); free(x0); free(x1); 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); } }