Você está na página 1de 3

//Trabalho de transferencia de calor e mecanica dos fluidos computacional //Resolver Matriz pelo mtodo de Gauss-Seidel #include<stdio.h> #include<math.h> #include<malloc.

h> double **a, *b, *x, *z, *diferenca, *modulo; int i, j, n, y, w; float erro, diferenca_maior, maior, tol, checagem_break; // prottipos da funo void aloc_var(int m, int n); void gauss_Seidel(int m, int n); double somat(int i, int n); int main() { //void gauss_Seidel(), aloc_var(); int s, m, n; s = 0; while(s == 0) { printf("\n Digite a ordem da matriz A(m,n)"); printf("\n m= "); scanf("%d", &m); printf("\n n= "); scanf("%d", &n); aloc_var(m,n); gauss_Seidel(m,n); printf("\nDeseja continuar no programa? <0>Sim, <1>Nao : "); scanf("%d", &s); } } void gauss_Seidel(int m, int n) { //double somat(); int k; printf("\n Defina a matriz A[%dx%d]\n",m,n); for(i=0; i<= m-1; i++) { for(j=0; j<=n-1; j++) { printf("\n a[%d,%d]= ",i+1,j+1); scanf("%lf",&a[i][j]); } } printf("\n Defina o vetor B(%d)\n",m); for(i=0; i<=m-1; i++) { printf("\n b[%d]= ",i+1); scanf("%lf",&b[i]); } //obter os valores iniciais dos chutes printf("\n Defina o vetor x(%d)\n",n); for(i=0; i<=n-1; i++) { printf("\n x[%d]= ",i+1); scanf("%lf",&x[i]); } printf("\n Especifique a tolerancia minima de erro = "); scanf("%f", &tol);

k=0; do { for(i=0; i<=n-1; i++) { y=i+1; z[i] = x[i]; x[i] = (b[i] - somat(i,n) + a[i][i]*x[i])/a[i][i]; modulo[i]=sqrt(x[i]*x[i]); diferenca[i] = x[i]-z[i]; if(diferenca[i]<0) { diferenca[i]=diferenca[i]*-1; } if(i!=0) { if(modulo[i]>maior) { maior=modulo[i]; } if(diferenca[i]>diferenca_maior) { diferenca_maior=diferenca[i]; } } else{ diferenca_maior=diferenca[i]; maior=modulo[i]; } } erro=diferenca_maior/maior; k=k+1; if(k>=3) { if(erro>checagem_break) { printf("\no resultado divergiu, o programa ir reiniciar"); printf("\npor favor coloque o maior valor em a[1,1]"); break; } }else{ checagem_break=erro; diferenca_maior=0; maior=0; } }while(erro>=tol); if(erro<checagem_break) { printf("\n Resultado = \n"); for (i = 0; i <= n-1; i++) { y=0; y=i+1; printf(" X %d = %g \n",y, x[i]); } printf("\nO resultado foi encontrado com %d iteracoes",k); printf("\nO erro final eh de %f\n",erro); } } double somat(int i, int n)

{ double soma; soma = 0.0; for(j=0; j<=n-1; j++) { soma = soma + a[i][j]*x[j]; } return soma; } void aloc_var(int m, int n) { int i; printf("\n Valor de m , n = %d,%d\n",m,n); a=(double **) malloc((m+1)*sizeof(double *)); b=(double *) malloc((m+1)*sizeof(double)); x=(double *) malloc((n+1)*sizeof(double)); z=(double *) malloc((n+1)*sizeof(double)); diferenca=(double *) malloc((n+1)*sizeof(double)); modulo=(double *) malloc((n+1)*sizeof(double)); for(i=0;i < n+1;i++) { a[i]=(double *)malloc((n+1)*sizeof(double)); } }

Você também pode gostar