コード例 #1
0
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];
			}
		}
	}
}
コード例 #2
0
ファイル: main.c プロジェクト: gberger/INF1608
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);
}
コード例 #3
0
ファイル: main.c プロジェクト: gberger/INF1608
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);
}
コード例 #4
0
ファイル: main.c プロジェクト: gberger/INF1608
void test_mat_libera() {
  int i;
  double** A = mat_cria(100, 200);
  mat_libera(100, A);
}
コード例 #5
0
ファイル: teste_gauss.c プロジェクト: michellevalente/INF1608
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;
}
コード例 #6
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;
}
コード例 #7
0
ファイル: main.c プロジェクト: gbarros/Analise-Numerica
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);
    }

}