Método de eliminação de Gauss com pivotamento parcial
Publicado por Daniel Moreira dos Santos 25/07/2009
[ Hits: 26.476 ]
Homepage: http://www.danielmoreira.wordpress.com
Esse script executa o método de eliminação de Gauss com pivotamento parcial e dá o vetor solução X de um sistema linear da forma AX=b. O código está comentado passo a passo para ficar bem claro o que foi feito em cada passagem.
Program GaussPivot; var //declaração de variáveis i, j, k, z, n, cont, comp, c: integer; // n é a ordem da matriz quadrada A A: array[1..50, 1..50] of real; // matriz A a ser usada no método de Gauss com pivoteamento parcial b, x: array[1..50] of real; // vetor b do sistema linear (Ax=b) aux, pivo, primeiro, q, blinha: real; begin writeln('Entre com a ordem da matriz A: '); readln(n); // armazena em n a ordem da matriz quadrada A for i:=1 to n do // percorre as linhas begin for j:=1 to n do //percorre as colunas begin writeln('Entre com A', i, j, ': '); readln(A[i,j]); // lê um elemento por vez end; end; for i:=1 to n do // percorre as linhas do vetor b begin writeln('Entre com B', i, ': '); readln(b[i]); // lê um elemento por vez end; for i:=1 to n do // imprime a matriz A antes do processo begin for j:=1 to n do begin write(A[i,j],' '); end; writeln(''); end; writeln(''); for i:=1 to n do // imprime o vetor b antes do processo begin writeln(b[i]); end; writeln(''); writeln(''); j:=1; while(j<n) do begin i:=1; while(i<=(n-j)) do begin if( abs(A[j+i,j])>abs(A[j,j]) )then // [j,j] é a posição onde ficará o pivô, se o elemento da mesma coluna e de uma linha abaixo for maior em módulo então begin k:=j; while(k<=n) do // troca-se a linha inteira begin aux:=A[j+i,k]; // aux: variável para auxiliar a troca dos valores poisição por posição A[j+i,k]:=A[j,k]; A[j,k]:=aux; k:=k+1; // incrementa k, k percorre as colunas de A nas linhas envolvidas no processo de troca end; aux:=b[j+i]; // troca as linhas correspondentes no vetor b b[j+i]:=b[j]; b[j]:=aux; end; pivo:=A[j,j]; // depois da troca temos o pivô (maior elemento) no local correto [j,j] (diagonal) primeiro:=A[j+i,j]; // primeiro elemento da coluna do pivô (j) e da linha i+j if(pivo<>0) then // se o pivo for diferente de zero begin b[j+i]:=b[j+i] - (primeiro/pivo)*b[j]; // subtrai (fator)*b[j] do elemento de b na posição i+j z:=j; while(z<=n) do // produz zeros abaixo do pivô begin A[j+i,z]:=A[j+i,z]-(primeiro/pivo)*A[j,z]; // quando z=j, A[j,j] é o pivô e então A[j+i,j]=A[j+i,j]-A[j+i,j]=0 z:=z+1; end; end; i:=i+1; end; j:=j+1; end; for i:=1 to n do // imprime a matriz A depois do processo terminado begin for j:=1 to n do begin write(A[i,j],' '); end; writeln(''); end; writeln(''); for i:=1 to n do // imprime o vetor b depois do processo terminado begin writeln(b[i]); end; //calcula o vetor solução x do sistema linear Ax=b cont:=0; // cntará o numero de elementos (na posição pivô) nulos j:=n; if(A[j,j]<>0) then // verifica se o ultimo pivô não é nulo begin x[j]:=b[j]/A[j,j]; // calcula o ultimo elemento do vetor solução end else begin cont:=cont+1; // conta um pivô nulo blinha:=b[j]; // blinha é o b[j] da linha correspondente ao pivô nulo for c:=1 to (n-1) do begin blinha:=blinha-(A[j,c]*x[c]); end; if(blinha=0)then //se blinha é zero begin comp:=1; // sistema compativel e indeterminado end else comp:=2; // senão incompativel end; j:=j-1; while(j>=1) do // faz o mesmo para os pivôs das outras linhas begin if(A[j,j]<>0) then begin i:=n; x[j]:=b[j]; while(i>j) do begin x[j]:=x[j]-(x[i]*A[j,i]); i:=i-1; end; x[j]:=x[j]/A[j,j]; end else begin cont:=cont+1; blinha:=b[j]; for c:=1 to (n-1) do begin blinha:=blinha-(A[j,c]*x[c]); end; if(blinha=0)then begin comp:=1; end else comp:=2; end; j:=j-1; end; if(cont=0) then begin writeln(''); writeln('X:'); for i:=1 to n do // imprime o vetor solução x begin writeln(x[i]); end; end else if(comp=1)then begin writeln('Sistema compativel e indeterminado. '); end else begin writeln('Sistema incompativel.'); end; readln(q); end.
Crivo de Eratóstenes Simples em Pascal
Nenhum comentário foi encontrado.
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Como renomear arquivos de letras maiúsculas para minúsculas
Imprimindo no formato livreto no Linux
Vim - incrementando números em substituição
Efeito "livro" em arquivos PDF
Como resolver o erro no CUPS: Unable to get list of printer drivers
SysAdmin ou DevOps: Qual curso inicial pra essa área? (3)
É cada coisa que me aparece! - não é só 3% (3)
Melhorando a precisão de valores flutuantes em python[AJUDA] (5)
[Python] Automação de scan de vulnerabilidades
[Python] Script para analise de superficie de ataque
[Shell Script] Novo script para redimensionar, rotacionar, converter e espelhar arquivos de imagem
[Shell Script] Iniciador de DOOM (DSDA-DOOM, Doom Retro ou Woof!)
[Shell Script] Script para adicionar bordas às imagens de uma pasta