[Prévia] [Próxima] [Prévia por assunto] [Próxima por assunto]
[Índice cronológico] [Índice de assunto]

Re: Gauss-Jordan



Humberto Goulart Rigotti writes:
 > /* Eis o programa */
 > /* Qualquer sugestao sera bem-vinda */                    
 > /* P.S.: Não está otimizado */
 . . .
 > 
 > main()
 > {
 > float E[M][N], D[M][N], F[M][N], G[M][N], C[M][N], ah, ai;
 > int p, q, h, k, i, j, limiteN, limiteM, P[M], MM[M], Q[N];


Eis algumas sugestões sobre o código:

1. Sugiro melhorar o layout, para tornar o código mais legível
   (veja http://www.ime.usp/br/~pf/algoritmos/aulas/layout.htm).

2. Sugiro melhorar a documentação, para tornar o código mais legível
   (veja http://www.ime.usp/br/~pf/algoritmos/aulas/docu.htm).
   Por exemplo, é fundamental acrescentar comentários que expliquem
   o que é P[i], MM[i] e Q[i] para cada i.

3. No lugar de P, acho melhor usar um vetor p definido da seguinte
   maneira: para cada índice i que esteja na base de linhas, p[i]
   é o único elemento j da base Q de colunas para o qual E[i,j] = 1.

4. De um modo geral, o código não é muito eficiente:  ele faz e 
   refaz muitas coisas sem necessidade.  Por exemplo, a representação 
   das bases (que está nos vetores P, MM e Q) não é eficiente.  Outro 
   exemplo de ineficiência: o teste de matriz escalonada.

 . . .
 > while (escalonada(E, P, limiteM, limiteN)==FALSE) {
 . . .
 > int escalonada(float E[M][N], int P[M], int limM, int limN)
 > {
 >     int di, dj, escal = TRUE;
 >     for (di=0;di<limM;di++)
 >         if (linha_OK(di, P, limM)==TRUE) /* di nao pertence a P */
 >             for(dj=0;dj<limN;dj++)
 >                 if (E[di][dj] != 0) { escal = FALSE; break; }
 >     return escal;
 > }


5. Como os dados são representados em float, os erros de arredondamento
   podem estragar completamente os resultados ...  Para minorar esse 
   efeito seria necessário fazer uma escolha mais cuidadosa de h e k.  
   Mas esse já é assunto mais delicado e avançado, que deveremos 
   estudar mais tarde.


--Paulo