[Prévia] [Próxima] [Prévia por assunto] [Próxima por assunto]
[Índice cronológico]
[Índice de assunto]
Re: Gauss-Jordan
- Subject: Re: Gauss-Jordan
- From: Paulo Feofiloff <pf@ime.usp.br>
- Date: Thu, 12 Apr 2001 09:43:14 -0300
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