Documente Academic
Documente Profesional
Documente Cultură
4-1
(1)
Formulao Matricial
As equaes representadas em (1) podem ser descritas na forma matricial como: [A][x] = [b] para o qual:
(2)
a n3
Nesta representao, a soluo direta pode ser obtida fazendo-se: [x] = [A]-1[b] (4)
para a qual emprega-se os mtodos de inverso de matrizes utilizados em cursos de lgebra Linear. O clculo da matriz inversa pode ser feito atravs da propriedade da matriz identidade: [I] = [A]-1[A] (5)
Se os coeficientes da matriz inversa [A]-1 so as incgnitas do problema, ento o clculo desses coeficientes resume-se a encontrar a soluo do seguinte sistema de equaes:
Clculo Numrico e Computacional C.Y. Shigue
a13 a 23 a 33
a1n x1 b1 x b a 2n 2 2 , [x ] = x 3 , [b] = b 3 a 3n x n b n a nn
(3)
4-2
Assim, o problema do clculo de sistemas de equaes lineares atravs do produto da matriz inversa resulta num problema de clculo de sistemas de equaes lineares. seguir, apresentaremos um mtodo direto para a soluo de sistemas de equaes lineares denominado mtodo de eliminao gaussiana e outro mtodo, iterativo, chamado mtodo de Gauss-Seidel. Alm desses mtodos, inmeros outros apropriados para cada tipo de sistema de equaes lineares existem, mas que no trataremos neste texto.
x n2
a n2
x 11 x 1 [A ] [A ] = 21 x n1
x 12 x 22
x 1n a 11 x 2 n a 21 x nn a n1
a 12 a 22
a 1n 1 0 a 2 n 0 1 = a nn 0 0
0 0 = [I ] 1
(6)
C.Y. Shigue
4-3
a 13 a 23 a 33 a 43
a 14 x1 b1 x b a 24 , [x] = 2 , [b] = 2 x3 b3 a 34 a 44 x4 b4 a 13 a 14 a 23 a 24 a 33 a 34 a 43 a 44 b1 b2 b3 b4
a11 a 12 a a [A]+ = 21 22 a 31 a 32 a 41 a 42
(7)
Os seguintes passos descrevem o procedimento para a triangularizao da matriz [A]: 1o Passo: Calcular p1 = mx{|a11|, |a21|, |a31|, |a41|}. Certamente p1 0, pois caso contrrio |A| = 0 e o sistema no teria soluo nica. Caso p1 |a11|, permutar a 1a linha pela linha que contm p1. 2o Passo: Definir um multiplicador para cada linha:
a a a m 2 = 21 , m 3 = 31 , m 4 = 41 a11 a11 a11
(8)
3a Linha:
a a = a 31 m3a11 = a 31 31 a 11 = 0 31 a 11 a = a 32 m 3a12 32 a = a 33 m3a 13 33 a = a 34 m 3a14 34
C.Y. Shigue
4-4
b = b 3 m3 b1 3
(18)
4a Linha:
a a = a 41 m4 a 11 = a 41 41 a11 = 0 41 a11 a = a 42 m 4 a12 42 a = a 43 m4 a 13 43 a = a 44 m 4 a14 44 b = b 4 m 4 b1 4
Repetindo os passos de 1 a 3 para a coluna 2: 1o Passo: Calcular p2 = mx { a , a , a } . Novamente p2 0, seno |A| = 0. Caso p2 |a21|, permutar 22 32 42 a 2a linha pela linha que contm p2. 2o Passo: Definir um multiplicador para cada linha:
a a m = 32 , m = 42 3 4 a a 22 22
(24)
C.Y. Shigue
4-5
4a Linha:
a a = a m a = a 42 a = 0 42 42 4 22 42 22 a 22 a = a m a 43 43 4 23 a = a m a 24 44 44 4 b = b m b 4 4 4 2
(33)
Repetindo os passos 1 a 3 para as duas ltimas linhas: 1o Passo: Calcular p3 = mx { a , a } . Novamente p3 0, seno |A| = 0. Caso p3 |a31|, permutar a 3a 33 43 linha pela 4a linha. 2o Passo: Definir um multiplicador para a 4a linha:
a m = 43 4 a 33
(34)
a a = a m a = a 43 a = 0 43 43 4 33 43 33 a 33 a = a m a 34 44 44 4 b = b m b 4 4 4 3
(38)
C.Y. Shigue
4-6
Re-escrevendo a matriz [A]+ triangularizada sem as linhas nos expoentes dos coeficientes aij e bj de modo a tornar mais clara as equaes:
a11 a12 0 a 22 [A]+ = 0 0 0 0 a 13 a 14 a 23 a 24 a 33 a 34 0 a 44 b1 b2 b3 b4
(39)
observando que os coeficientes aij e bj da matriz triangularizada acima no so os mesmos coeficientes da matriz [A]+ original. Resolvemos o sistema por recorrncia atravs da frmula:
4 bi a ij x j j= i +1 xi = , i = 4,3,2,1 a ii
(40)
O determinante da matriz de coeficientes [A] calculado a partir do produto dos coeficientes aii da diagonal principal: |A| = a ii = a11a 22 a 33a 44
i =1 4
(41)
Exemplo:
Seja o sistema de trs equaes e trs incgnitas:
2x1 + 3x2 -x1 + x3 = 0
x2 + 4x3 = 3 x3 = 1
x1 8x2 -
cuja matriz aumentada [A]+ descrita como: 3 1 0 2 1 1 [A]+ = 4 3 1 8 1 1 Utilizando o programa de clculo de eliminao gaussiana em preciso simples (com arredondamento de sete casas decimais), cuja listagem aparece adiante neste texto, obtm-se a matriz triangularizada:
C.Y. Shigue
4-7
3 1 2 0 [A] = 9 ,5 0,5 0 0,0000001 3,3684211 cujo determinante vale |A| = -64,0000009. A soluo do sistema calculada pelo mesmo programa resulta: 0 ,718750 [x] = 0,156250 0,968750 Observar que a soluo do problema exata, exceto pelo valor do determinante da matriz [A], cuja soluo exatamente 64. O algarismo 9 na stima casa decimal resultado do erro de arredondamento pelo clculo das variveis reais com preciso simples. Neste problema simples o erro de arredondamento no afetou o vetor soluo [x] do sistema, porm em problemas que envolvam um nmero maior de equaes ou em problemas cujos coeficientes da matriz [A] j possuam erro de arredondamento na sua formulao, acarretam em severo erro de arredondamento, inviabilizando a utilizao do mtodo de clculo direto de eliminao gaussiana. Nestes tipos de problema, um mtodo iterativo, como o mtodo de Gauss-Seidel apresentado a seguir, mais aconselhvel.
10
510 500
530
C.Y. Shigue
4-8
540
580 570
600 590
610
620 50 60 65 70 80 100
TEMP = A(I,J) A(I,J) = A(L,J) A(L,J) = TEMP CONTINUE END IF PIVOT = A(I,I) NEXTR = I + 1 DO 550 J = NEXTR, NN CONST = A(J,I) / PIVOT DO 560 K = I, NN+1 A(J,K) = A(J,K) - CONST*A(I,K) CONTINUE CONTINUE CONTINUE DO 570 I = 1, NN IREV = NN + 1 - I Y = A(IREV,NN+1) IF (IREV .NE. NN) THEN DO 580 J = 2, I K = NN + 2 - J Y = Y - A(IREV,K)*X(K) CONTINUE END IF X(IREV) = Y / A(IREV,IREV) CONTINUE WRITE(*,60) WRITE(*,65) DO 590 I = 1, NN DO 600 J = 1, NN+1 WRITE(*,70) I, J, A(I,J) CONTINUE CONTINUE DET = 1.0 DO 610 I = 1, NN DET = DET * A(I,I) CONTINUE WRITE(*,80) DET DO 620 I = 1, NN WRITE(*,100) I, X(I) CONTINUE FORMAT(1X, 'A(',I2,',',I2,'): ') FORMAT(/10X,'SOLUCAO'/) FORMAT(/5X,'COEFICIENTES DA MATRIZ TRIANGULARIZADA'/) FORMAT(5X, 'A(',I2,',',I2,') = ',F12.7) FORMAT(1X/, 5X, 'DETERMINANTE DO SISTEMA = ', F12.7/) FORMAT(5X, 'X(',I2,') = ', F12.7) END
Linguagem C
/* Programa elimina.c */
#include <stdio.h> #include <stdlib.h> #include <math.h> #define NMAX 50 int int float float i, j, k, l; neq, nmais, last, rev; a[NMAX][NMAX+1], x[NMAX+1]; coef, big, term, temp, pivot, nextr, cnt, y;
void main() { printf("Numero de equacoes: "); scanf("%d", &neq); for(i = 1; i <= neq; i++) {
C.Y. Shigue
4-9
nmais = neq +1; for (j = 1; j <= nmais; j++) { printf("A( %d , %d ) = ", i, j); scanf("%f", &coef); a[i][j] = coef; } } last = neq - 1; for (i = 1; i <= last; i++) { big = 0.f; for (k = i; k <= neq; k++) { term = fabs(a[k][i]); if ((term - big) > 0.f) { big = term; l = k; } } if (big == 0.f) { printf("Matriz singular\n"); exit(0); } if (i != l) { for (j = 1; j <= nmais; j++) { temp = a[i][j]; a[i][j] = a[l][j]; a[l][j] = temp; } } pivot = a[i][i]; nextr = i + 1; for (j = nextr; j <= neq; j++) { cnt = a[j][i] / pivot; for (k = i; k <= nmais; k++) { a[j][k] = a[j][k] - cnt*a[i][k]; } } } for (i = 1; i <= neq; i++) { rev = neq + 1 - i; y = a[rev][nmais]; if (rev != neq) { for (j = 2; j <= i; j++) { k = neq + 2 - j; y -= a[rev][k]*x[k]; } } x[rev] = y / a[rev][rev]; } printf("\nMatriz triangularizada\n"); for (i = 1; i <= neq; i++) { for (j = 1; j <= nmais; j++) { printf("A( %d , %d ) = %f\n", i, j, a[i][j]); } } printf("\nSolucao\n"); for (i = 1; i <= neq; i++) { printf("X( %d ) = %f\n", i, x[i]); } }
C.Y. Shigue
410
Nestes casos podemos utilizar um mtodo iterativo que, em geral, no seja muito sensvel propagao de erros de arredondamento, desde que a soluo seja convergente. Entre os mtodos iterativos de resoluo de sistemas de equaes, vamos abordar o mtodo iterativo de Gauss-Seidel, que um dos mtodos iterativos mais comuns e simples para ser programado em computador. Como em todos os mtodos iterativos, o erro de arredondamento pequeno, mas o mtodo converge para a soluo somente sob certas condies e normalmente conduz a um nmero significativamente maior de operaes aritmticas em comparao aos mtodos de resoluo direta. Seja o sistema de equaes: a11x1 + a12x2 + a13x3 + ... + a1nxn = b1 a21x1 + a22x2 + a23x3 + ... + a2nxn = b2 a31x1 + a32x2 + a33x3 + ... + a3nxn = b3 an1x1 + an2x2 + an3x3 + ... + annxn = bn onde os termos da diagonal a11, a22, ..., ann so todos supostos no nulos; se necessrio, as equaes devem ser reordenadas para que todos estes termos sejam no nulos. Encontramos o valor de x1 a partir da primeira equao, x2 a partir da segunda e assim sucessivamente, para obtermos: x1 = (b1 - a12x2 - a13x3 - ... - a1nxn)/a11 x2 = (b2 - a21x1 - a23x3 - ... - a2nxn)/a22 x3 = (b3 - a31x1 - a32x2 - ... - a3nxn)/a33 xn = (bn - an1x1 - an2x2 - ... - an,n-1xn-1)/ann
A iterao iniciada tomando-se um conjunto inicial de estimativas para todos os xi , onde k o nmero da iterao. Tomamos o valor inicial de x2, x3, ..., xn para calcular o valor de x1 na primeira equao acima. Com o valor de x1 calculado mais os valores iniciais de x3, x4, ..., xn calcula-se o novo valor de x2 na segunda equao e assim sucessivamente at a n-sima equao, quando ento obtemos o valor de xn (e, anteriormente, os valores de x1, x2, ..., xn-1) para a primeira iterao. Voltamos, ento, para a primeira equao e calculamos novamente x1 e sucessivamente todos os xi na segunda iterao. Este procedimento prossegue at que haja convergncia, isto , at que todos os valores de xi simultaneamente parem de variar. Deste modo, este mtodo exigir provavelmente muitas iteraes antes de obtermos uma exatido razovel. Alm disto, na maioria das vezes pode no ocorrer convergncia e os resultados se afastarem de um valor constante e finito. O problema da convergncia deste mtodo no simples e o principal empecilho ao seu uso. Podemos empregar alguns critrios para se verificar quando necessrio parar a iterao:
C.Y. Shigue
411
1. 2.
O nmero de iteraes excedeu um valor mximo m pr-determinado; As diferenas entre dois valores sucessivos de todos os xi so menores do que um valor pr-determinado : x1 - x1
(k) (k-1)
< , x2 - x2
(k)
(k-1)
< , ... xn - xn
(k)
(k-1)
<
(46)
Exemplo:
Seja o sistema de duas equaes:
2x + 3y = 4 -x + y = 1 (e1) (e2)
C.Y. Shigue
412
Iterao 0 1 2 3 4 5
Observamos, dos dados da tabela, que o mtodo iterativo de Gauss-Seidel aplicado ao sistema de duas equaes diverge, pois os valores de erro x e y aumentam a cada iterao. Vamos agora inverter as duas equaes para obter as equaes do clculo iterativo, isto , a equao para o clculo de x ser a (2), enquanto a equao para y ser a (1):
x = (y - 1) y = (4 - 2x)/3 (e5) (e6)
A convergncia obtida aps 41 iteraes: x = 0,2 e y = 1,2 com erro de 10 . O problema da convergncia para este exemplo pode ser ilustrado na Fig. 1, onde so mostrados os grficos para as equaes (e1) e (e2). As linhas tracejadas e pontilhadas indicam, respectivamente, as iteraes divergentes, dada pelas equaes (e3) e (e4), e as iteraes convergentes dada pelas equaes (e5) e (e6).
C.Y. Shigue
413
(1)
3
(2)
-1
-2
-3
-2
-1
Como visto no exemplo, a convergncia das iteraes depende da ordem como as equaes esto escritas. Genericamente, para um sistema com n = 2, podemos escrever: a11x1 + a12x2 = b1 a21x1 + a22x2 = b2 de onde vem que, x1 x2 Se definirmos: x1 x2 Ento, a partir de (49) e (51) vem que: x1 e, de (50) e (52):
Clculo Numrico e Computacional C.Y. Shigue
(k) (k) (k) (k) (k)
(47) (48)
= [b1 - a12x2
(k-1) (k)
]/a11
(49) (50)
= x1 - x1 = x2 - x2
(k) (k)
(51) (52)
= - a12/a11.x2
(k-1)
(53)
414
x2 Combinando estas duas equaes, resulta: x1 Igualmente, pode-se escrever que x1 Prosseguindo desta maneira, resulta: x1 Analogamente, para a outra varivel, x2 Assim, se
(k)
= - a21/a22.x1
(k)
(54)
(k)
= a12a21/(a11a22).x1
(k-1)
(55)
(k)
= [a12a21/(a11a22)] x1
(k-2)
(56)
(k)
= [a12a21/(a11a22)] x1
(0)
(57)
(k)
= [a12a21/(a11a22)] x2
(0)
(58)
a12a21/a11a22 < 1 o mtodo iterativo de Gauss-Seidel converge para uma soluo de (47) e (48). Pode-se satisfazer (59), se a11 > a12 e a22 a21 ou se a11 a12 e a22 > a21
(59)
(60) (61)
(62) (63)
Isto significa que os termos da diagonal a11 e a22 devem ser dominantes, isto , eles devem ser pelo menos to grandes quanto os termos fora da diagonal e realmente maiores em pelo menos um caso. Para um sistema de n equaes podemos mencionar um teorema simples que fornece condies suficientes, mas no necessrias, para que haja convergncia: Teorema da convergncia do mtodo iterativo de Gauss-Seidel: A iterao do mtodo de Gauss-Seidel convergir se, no determinante caracterstico, cada termo da diagonal
C.Y. Shigue
415
principal for maior (em valor absoluto) do que a soma dos valores absolutos de todos os outros termos na mesma linha ou coluna. Isto , teremos garantido a convergncia se,
a ii >
j= 1 j i n
a ij
i = 1, 2, ... , n
(64)
e
a ii >
j= 1 j i
a ji
i = 1, 2, ... , n
(65)
O teorema no muito til a no ser que, de alguma maneira, possamos reordenar as equaes a fim de satisfazerem o teorema to bem quanto possvel e, geralmente, isto no tarefa simples. Pode ser necessrio rearranjar de vrias formas um sistema de equaes at encontrarmos, atravs do clculo iterativo, um arranjo que se aproxime das condies do teorema.
Exemplo:
Seja o seguinte sistema de equaes:
-x1 + 3x2 + 5x3 + 2x4 x1 + 9x2 + 8x3 + 4x4 x2 + x4 2x1 + x2 + x3 - x4 = = = = 10 15 2 -3
Se re-ordenarmos as equaes de modo a satisfazer da melhor forma o teorema da convergncia, obteremos o seguinte sistema de equaes:
2x1 + x2 + x3 x1 + 9x2 + 8x3 -x1 + 3x2 + 5x3 x2 x4 + 4x4 + 2x4 + x4 = = = = -3 15 10 2
C.Y. Shigue
416
x1 = -1; x2 = 0; x3 = 1 e x4 = 2
Observamos para este exemplo que o mtodo iterativo de Gauss-Seidel apresenta uma preciso superior ao mtodo de eliminao gaussiana. Entretanto, o nmero de iteraes relativamente alto (78 neste caso) e este nmero cresce substancialmente com o aumento do nmero de equaes. Esta limitao atualmente no restringe a aplicao do mtodo iterativo de Gauss-Seidel, devido elevada capacidade de processamento dos microcomputadores atuais. Usualmente, o mtodo de eliminao gaussiana usado numa etapa preliminar para obter os valores iniciais do mtodo de Gauss-Seidel que, ento, faz o refinamento da soluo.
10 100
Linguagem C
/* Programa gseidel.c */ #include <stdio.h> #define MAX 80 void main() { int i; float x1, x2, x3, x4; x1 = 0.0; x2 = 0.0; x3 = 0.0; x4 = 0.0; for (i = 1; i <= MAX; i++) { x1 = (-3.0 - x2 - x3 + x4) / 2.0; x2 = (15.0 - x1 - x3 * 8.0 - x4 * 4.0) / 9.0; x3 = (x1 + 10.0 - x2 * 3.0 - x4 * 2.0) / 5.0; x4 = 2.0 - x2; printf("x1 = %10.6f x2 = %10.6f x3 = %10.6f X4 = %10.6f\n",x1,x2,x3,x4); } }
C.Y. Shigue