Skip to content

Instantly share code, notes, and snippets.

@tcurvelo
Created May 11, 2014 06:19
Show Gist options
  • Save tcurvelo/ed26f9e5787dd2d6b0bf to your computer and use it in GitHub Desktop.
Save tcurvelo/ed26f9e5787dd2d6b0bf to your computer and use it in GitHub Desktop.
Sistemas Lineares: Metodo de Eliminacao de Gauss
/***************************************************
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