O programa abaixo foi desenvolvido no compilador Dev-Pascal, e utiliza a Eliminação de Gauss para o Escalonamento (Triangularização Superior da Matriz Ampliada) e Pivoteamento Parcial, para evitar pivôs nulos, resolvendo o sistema equivalente por retrossubstituição.
Download do Código em Pascal e Executável do Programa:
http://www.4shared.com/file/Fyh79JY1/Eliminacao_Gauss_Pivot_Parcial.html
Download do Compilador Dev-Pascal: http://www.bloodshed.net/devpascal.html
Código:
Program Gauss_pivoteamento_parcial; Uses crt;
Var
a : Array[1..100,1..100] Of Real; //se desejar uma matriz maior, basta criar arrays maiores//
x, b : Array[1..100] Of Real;
i, j, n, ji, ii, ipivo, k : Integer; // i's sao variaveis auxiliares//
m, soma, pivo, baux, aux : Real;
resposta : char;
nome : String;
erro : Boolean;
resultado : Text;
Begin
Repeat
repeat
Clrscr;
Textcolor (White);
Writeln ('Resolucao de sistemas de equacoes lineares utilizando o metodo da eliminacao');
Writeln ('de Gauss (triangularizacao) com pivoteamento parcial.');
Writeln;
Write ('Digite a ordem do sistema (n), no maximo n=100: ');
Readln (n);
until n >= 2;
//le os coeficientes da matriz A//
for j:=1 to n do
begin
Repeat
clrscr;
Writeln ('AX = B');
Writeln;
Writeln ('Matriz ampliada do sistema');
Writeln;
Writeln ('Digite os elementos da coluna ',j,' da matriz A (coeficientes de x',j,'):');
Writeln;
for i:=1 to n do
begin
Write('a[',i,'x',j,']= ');
readln(a[i,j]);
end;
writeln;
writeln;
Textcolor (White);
Write ('Confira os valores digitados, estao corretos? (digite s=sim, n=nao): ');
Readln (resposta);
Until (resposta = 'S') Or (resposta = 's');
end;
//le os coeficientes da matriz B//
repeat
clrscr;
Writeln ('AX = B');
Writeln;
Writeln ('Matriz ampliada do sistema');
Writeln;
Writeln ('Digite os elementos da matriz B (termos independentes)');
Writeln;
for i:=1 to n do
begin
Write('b[',i,']= ');
readln(b[i]);
end;
writeln;
writeln;
Write ('Confira os valores digitados, estao corretos? (digite s=sim, n=nao): ');
Readln (resposta);
Until (resposta = 'S') Or (resposta = 's');
//Metodo da eliminacao de Gauss (Triangularizacao)//
k := 1; //Passo//
erro := False; //A variavel erro se tornara True caso haja erros de divisao por zero//
For j:=1 To n Do
Begin
For i:=k+1 To n Do
Begin
pivo := Abs(a[j,k]); //Pivoteamento Parcial//
ipivo := j; //Encontra em qual linha da coluna k esta o maior elemento//
For ii:=j to n Do
Begin
If Abs(a[ii,k]) > pivo Then
Begin
pivo := a[ii,k];
ipivo := ii;
End;
End;
If ipivo <> j Then //Se ipivo = j e porque o maior elemento ja esta na linha do pivo, e a permutacao nao e necessaria//
Begin
For ji:=1 to n Do //Permuta as linhas necessarias para o pivoteamento parcial//
Begin
aux := a[j,ji];
a[j,ji] := a[ipivo,ji];
a[ipivo,ji] := aux;
End;
baux := b[j];
b[j] := b[ipivo];
b[ipivo] := baux;
End;
If a[j,j] <> 0 Then //Evita erros de divisao por zero//
Begin
m := -1*(a[i,j]/a[j,j]);
For ji:=1 To n Do
a[i,ji] := a[i,ji] + (m*(a[j,ji]));
b[i] := b[i] + m*b[j];
End
Else
erro := True;
End;
k := k + 1;
End;
If erro = True Then
Begin
Clrscr;
Writeln ('Erro! Talvez este sistema linear nao tenha solucao (sistema impossivel)');
End
Else
Begin
//Metodo de resolucao de sistemas triangulares (Retrossubstituicao)//
If a[n,n] <> 0 Then
x[n] := b[n] / a[n,n]
Else
x[n] := 0;
For i := n-1 Downto 1 Do
Begin
soma := 0;
For j := i+1 To n Do
soma := soma + a[i,j]*x[j];
If a[i,i] <> 0 Then
x[i] := (1/a[i,i]) * (b[i] - soma)
Else
x[i] := (b[i] - soma);
End;
//Imprime na tela o resultado//
clrscr;
Writeln ('AX = B');
Writeln;
Textcolor (Lightcyan);
For i := 1 To n Do
Writeln ('x', i, ' = ', x[i]);
writeln;
//Grava o resultado em um arquivo de texto .txt//
Writeln;
Textcolor (White);
Write ('Deseja salvar os resultados em um arquivo de texto? (digite s=sim, n=nao): ');
Readln (resposta);
If (resposta = 's') Or (resposta = 'S') Then
Begin
Writeln;
Write ('Digite o nome do arquivo a ser salvo: ');
Readln (nome);
nome := (nome + '.txt');
Assign(resultado, nome);
Rewrite (resultado);
Writeln (resultado, 'valores de x (incognitas):');
Writeln (resultado);
For i:=1 To n Do //Escreve X//
Writeln (resultado,'X',i, ' = ',x[i]);
Close (resultado);
Writeln;
Writeln ('O arquivo foi salvo no mesmo diretorio do arquivo executavel!');
End;
End;
Writeln;
Textcolor (White);
Write ('Deseja reiniciar o programa? (digite s=sim, n=nao): ');
Readln (resposta);
Until (resposta <> 'S') And (resposta <> 's');
End.
Se desejarem fazer qualquer melhoria, correção de algum eventual erro, fiquem a vontade! ; )
Como criar o mesmo programa em C++?
ResponderExcluirNesse programa, cada matriz tem 100 linhas e 100 colunas?
Bem, para criar o programa em C++ não é complicado, a lógica é a mesma, basta ir trocando a linguagem pascal por pela linguagem C, a sintaxe. Esse programa pode ler uma matriz n x n, n linhas e n colunas, sendo que n é escolhido durante a execução do programa, pode ser uma matriz 2 x 2 ate uma matriz 100 x 100. Na verdade eu coloquei 100 como o máximo por convenção, se quiser uma matriz maior basta aumentar o tamanho das variáveis a, b, x.
ExcluirPoderiamos difundir esse algoritmo, eu poderia fornece-lo em python
ResponderExcluirSeria bem legal! Fique a vontade para difundi-lo e reescreve-lo em outras linguagens. O link abaixo é do código escrito em linguagem C: http://pascalmath.blogspot.com.br/2014/04/cc-programas-para-resolucao-de-sistemas.html
ResponderExcluirLuiz,
ResponderExcluirMuito bacana ela em C, estava precisando. Me ajudou muito!
Depois me mande seu email, tenho algumas resoluções bacanas de calculo de autovalores, multiplicação de matrizes.
Grande Abraço
Parabens!
Olá Michelle! Seria interessante compartilhar seus trabalhos! Me interessa bastante procedimentos com matrizes. Meu email é: lvmsoglia@hotmail.com
ExcluirAbraço!