Created
May 11, 2014 06:19
-
-
Save tcurvelo/ed26f9e5787dd2d6b0bf to your computer and use it in GitHub Desktop.
Sistemas Lineares: Metodo de Eliminacao de Gauss
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/*************************************************** | |
Universidade Federal da Paraiba | |
Centro de Ciencias Exatas e da Natureza | |
Disciplina: Calculo Numerico | |
Thiago Curvelo dos Anjos - Matr.: 010211026 | |
**************************************************** | |
Sistemas Lineares: Metodo de Eliminacao de Gauss | |
***************************************************/ | |
#include <stdio.h> | |
/************* | |
* permuta(): Funcao que permuta duas linhas da matriz. | |
* (primeira operacao elementar do metodo de Gauss.) | |
* Entradas: n, ordem da matriz; | |
* matriz, arranjo bidimensional. | |
* a e b, linhas a serem permutadas. | |
**************/ | |
void Permuta(int n, float matriz[n][n+1], int a, int b){ | |
int i; | |
float aux[n+1]; | |
for(i=0; i<=n ;i++) | |
{ | |
aux[i]=matriz[a][i]; | |
matriz[a][i]=matriz[b][i]; | |
matriz[b][i]=aux[i]; | |
} | |
} | |
/************* | |
* Multip(): multiplica a toda uma linha por um numero real. | |
* (segunda operacao elementar do metodo de Gauss.) | |
* Entradas: n, ordem da matriz; | |
* matriz, arranjo bidimensional. | |
* L, a linha a ser multiplicada; | |
* fator, o que se multiplica L. | |
*************/ | |
void Multip(int n,float matriz[n][n+1],int L, float modif){ | |
int aux; | |
for(aux=0;aux<=n;aux++) | |
matriz[L][aux]*=modif; | |
} | |
/************* | |
* Soma(): Funcao que soma duas linhas. "L1 := L1 + M*L2" | |
* (terceira operacao elementar do metodo de Gauss) | |
* Entradas: n, ordem da matriz; | |
* matriz, arranjo bidimensional. | |
* L1 e L2, Linhas que serao somadas (L1 recebe a soma). | |
* modif, modificador que sera multiplicado a linha L2. | |
*************/ | |
void Soma(int n, float matriz[n][n+1],int L1,int L2,float modif){ | |
int aux; | |
for(aux=0;aux<=n;aux++) | |
matriz[L1][aux]=matriz[L1][aux]+(matriz[L2][aux]*modif); | |
} | |
/************* | |
* Funcao Escalona(): obtem a matriz triangular superior, bem | |
* como sua solucao, quando possivel e determinavel. | |
* Entrada: n, ordem da matriz; | |
* matriz, ponteiro para a matriz. | |
* resul, matriz onde sera armazenado o resultado. | |
* Saida: 0, se o sistema for possivel e determinado; | |
* 1, se o sistema for possivel e indeterminado; | |
* 2, se o sistema for impossivel. | |
*************/ | |
int Escalona(int n, float matriz[n][n+1], float resul[n]){ | |
int i,j,k; | |
for(i=0;i<n;i++){ | |
k=i; | |
while((matriz[i][i]==0)&&(k<n-1)) | |
Permuta(n,matriz,i,++k); | |
if (matriz[i][i]==0){ | |
if (matriz[i][n]!=0){ | |
return 2; | |
} else { | |
return 1; | |
} | |
} | |
Multip(n,matriz,i,(1/matriz[i][i])); | |
for(j=i+1;j<n;j++){ | |
Soma(n,matriz,j,i,(-matriz[j][i])); | |
} | |
} | |
for(i=n-1;i>=0;i--){ | |
resul[i]=matriz[i][n]; | |
for(j=n-1;j>=i+1;j--){ | |
resul[i]-=matriz[i][j]*resul[j]; | |
} | |
} | |
return 0; | |
} | |
/************* | |
* Imprime(): Funcao que imprime na tela, uma matriz de reais. | |
* Entradas: n, ordem da matriz; | |
* matriz, arranjo bidimensional. | |
*************/ | |
void Imprime(int n,float matriz[n][n+1]){ | |
int i,j; | |
for(i=0;i<n;i++){ | |
for(j=0;j<=n;j++) printf("%.4f\t",matriz[i][j]); | |
printf("\n"); | |
} | |
printf("\n"); | |
} | |
/************* | |
* Ler_Matriz(): funcao que ler a matriz que sera trabalhada. | |
* Entradas: n, ordem da matriz; | |
* matriz, arranjo bidimensional. | |
*************/ | |
void Ler_Matriz(int n,float matriz[n][n+1]){ | |
int i,j; | |
for(i=0;i<n;i++){ | |
printf("\n\nLendo a %da equacao:\n",i+1); | |
for(j=0;j<=n;j++){ | |
if(j==n) { | |
printf("Entre com o resultado da equacao : "); | |
} | |
else { | |
printf("Entre com o coeficiente da variavel X%d: ",j+1); | |
} | |
scanf("%f",&matriz[i][j]); | |
} | |
printf("\n%da Equacao ----> (%.4f*X%d)",i+1,matriz[i][0],1); | |
for(j=1;j<=n;j++){ | |
if(j==n) { | |
printf(" = %.4f",matriz[i][j]); | |
} | |
else { | |
printf(" + (%.4f*X%d)",matriz[i][j],j+1); | |
} | |
} | |
printf("\n"); | |
} | |
} | |
/****************** | |
* Funcao main(). * | |
******************/ | |
int main(void){ | |
int n,i,controle; | |
printf("Quantas serao as variaveis do sistema? "); | |
scanf("%d",&n); | |
printf("O sistema tera, entao, %d equacoes.",n); | |
float matriz[n][n+1],resul[n]; | |
Ler_Matriz(n,matriz); | |
printf("\n\nMatriz:\n"); | |
Imprime(n,matriz); | |
printf("\nEscalonando..............."); | |
controle=Escalona(n,matriz,resul); | |
printf("[OK]\n\nO Resultado obtido foi:\n"); | |
switch (controle){ | |
case 0: | |
printf("\nMatriz Triangular:\n"); | |
Imprime(n,matriz); | |
printf("Sistema Possivel e Determinado\nSolucao:\n"); | |
for(i=0; i<n; i++) | |
printf(" X%d = %.4f\n",i+1,resul[i]); | |
break; | |
case 1: | |
printf("Sistema Possivel e Indeterminado\n\n"); | |
break; | |
case 2: | |
printf("Sistema Impossivel\n\n"); break; | |
} | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment