Você está na página 1de 9

MS 512 - Anlise Numrica I Primeiro semestre de 2004

Matrizes e sistemas lineares


O MATLAB um programa especialmente indicado para trabalhos que exigem a manipulao de vetores e matrizes. Nesta aula de laboratrio usaremos os recursos do programa para estudar os mtodos diretos para a soluo de sistemas lineares. Ao longo do texto sero fornecidos exemplos cuja inteno auxiliar tanto a memorizao dos comandos do MATLAB como a fixao de conceitos ligados anlise numrica. Estes exemplos aparecem depois do sinal '', que o smbolo usado pelo programa para indicar ao usurio que algum comando pode ser executado.

Criando matrizes.
Definimos uma matriz no MATLAB simplesmente datilografando seus elementos entre colchetes, separando as linhas com o ponto-e-vrgula. Ex: A = [1 1 1 1; 1 2 3 4; 1 3 6 10; 1 4 10 20] Podemos escrever uma matriz de outra maneira se apenas datilografarmos uma linha sobre a outra. Ex: G=[12 3 4] Os vetores so matrizes unidimensionais. Assim, temos: b = [1 2 3] b = [1; 2; 3] (um vetor linha, raramente usado neste curso de anlise numrica) (um vetor coluna)

fcil perceber que o MATLAB reproduz na tela os comandos que datilografamos ora para conferncia dos dados, ora para exibir algum resultado. Para evitar que isso acontea, basta terminar o comando com um ponto-e-vrgula: B = [1 2 3; 4 5 6]; As dimenses de uma matriz j definida so dadas pela funo size, enquanto que, para vetores, podemos tambm usar a funo length. Ex: size(A) size(b) length(b) Repare que o programa distingue letras minsculas de maisculas, ou seja, B no equivalente a b. Para utilizar ou modificar um elemento de uma matriz, basta referenci-lo atravs dos ndices de sua linha e coluna, que devem aparecer entre colchetes e separados por vrgula: A(1,3)=B(2,2)

Trabalhando com matrizes.


Para discutir as operaes que podem ser feitas com matrizes, vamos definir, em primeiro lugar, algumas matrizes e vetores aleatrios, usando o comando rand. A = rand(3,3) C = rand(3,3) E = rand(3,2)

So muitas as operaes entre matrizes admitidas pelo MATLAB. Comecemos ento pelas mais corriqueiras, como: B = A' B = A+C B = A*E x = rand(3,1) y = x alfa = x*x D = x*x beta = x*A*x z = C*x Algumas matrizes especiais so definidas trivialmente no MATLAB, como por exemplo: D = eye(4) D = zeros(3,4) D = diag(x) D = rand(4,5) D = ones(2,3) (Identidade) (Nula) (Matriz diagonal com elementos diagonais iguais aos elementos de x) (Aleatria) (Matriz com todos os elementos iguais a 1) (Transposio) (Produto interno) (Produto externo) (Transposio) (Soma) (Multiplicao)

Operaes entre vetores ou entre vetores e matrizes tambm so fceis de executar:

Usando o comando help.


praticamente impossvel guardar na memria o nome e a sintaxe de todos os comandos e funes disponveis no MATLAB. Por esse motivo, o programa vem acompanhado de vrios comandos de ajuda. O mais simples destes comandos chamado help. O comando help nos fornece uma lista das funes disponveis ou a sintaxe especfica de um comando. Para conferir vale experimentar, por exemplo, digitar: help Pronto! Temos uma lista de classes diferentes de comandos do programa. Para conhecer funes mais especficas relacionadas a matrizes vamos tentar o comando: help matfun Vejamos agora o que significa e como executar corretamente a funo det: help det Como freqentemente no estaremos munidos do manual do MATLAB, o comando help costuma ser de grande valia. Tambm podemos usar o helpdesk do MATLAB, um sistema de ajuda com arquivos no formato html, que pode ser iniciado a partir do item help da barra de comandos do programa.

Definindo um sistema linear.


Vejamos como formular um problema que consiste em determinar os esforos atuantes nas barras da trelia mostrada abaixo.

10 2 d 5 f
1m 1m

5 2 b

4 7

5 6

11

12 13

10

3m

3m

3m

3m

Para resolver o problema, precisamos recorrer a uma lei de equilbrio que diz que uma estrutura s est em equilbrio se a soma das foras atuantes em cada um de seus pontos nula. Alm disso, consideramos que os ns, ou pontos de juno das barras, so rtulas (ou seja, as barras podem girar em torno deles), que as foras externas so aplicadas apenas nos ns e que as barras s esto sujeitas a esforos normais (isto , na direo da prpria barra). As equaes de equilbrio no n b, por exemplo, so dadas abaixo.
5
N4

Foras na horizontal:

N 1 cos + N 4 cos + N 5 cos + 2 = 0


Foras na vertical:

2
N1

N5 N3

N1 sen + N 3 N 4 sen + N 5 sen + 5 = 0

Como temos 2 ns e duas equaes por n (uma para o equilbrio horizontal e outra para o equilbrio na vertical), podemos escrever 16 equaes. Entretanto a estrutura tem apenas 13 barras, ou seja, 13 incgnitas. Assim, devemos desprezar 3 equaes (que so redundantes). Para tanto, eliminamos as equaes do n a, uma vez que esse fixo. Alm disso, como o n h no pode se deslocar na vertical, no consideramos o 0 0 a equao correspondente. O sistema que obtemos dado abaixo, considerando que c s =3 1 1 e
sn e = 1 1 0 0

N b:

N1 cos + N 4 cos + N 5 cos + 2 = 0 N1 sen + N 3 N 4 sen + N 5 sen + 5 = 0

N c:

N 2 + N 6 = 0 N3 = 0

N d:

N 4 cos + N 8 cos + 2 = 0 N 4 sen + N 7 + N 8 sen + 10 = 0

N e:

N 5 cos N 6 + N 9 cos + N10 = 0 N 5 sen N 7 N 9 sen = 0

N f:

N 8 cos N 9 cos + N12 cos = 0 N 8 sen + N 9 sen + N 11 + N 12 sen + 5 = 0

N g:

N10 + N13 = 0

N11 = 0

N h:

N12 cos N13 = 0

Resolvendo sistemas.
Outra operao relacionada a matrizes que elementar para o MATLAB a resoluo de um sistema linear atravs de um mtodo direto, o que pode ser feito usando o smbolo \. Ex: A = rand(5,5); b = rand(5,1); x = A\b Usando este comando estamos pedindo ao MATLAB que resolva o sistema pelo mtodo de eliminao de Gauss com pivoteamento parcial (ou seja, permutao de linhas). Para conferir se x a soluo correta de A.x=b, podemos calcular o resduo definido abaixo, que deve ter norma prxima de zero: r = A*x-b norm(r, inf)

A decomposio LU.
O MATLAB pode nos fornecer tambm os fatores triangulares L e U da decomposio LU de uma matriz qualquer. Assim, podemos resolver vrios sistemas lineares com a mesma matriz sem ter de decompla vrias vezes. Vejamos como. Em primeiro lugar, decompomos A na forma LU: [L,U,P] = lu(A) Observe que usamos a funcao lu que tem como parmetro a matriz A e que produz como resultado as matrizes L, U e P. A matriz P fornece as permutaes de linhas usadas na decomposio, de modo que PA = LU. Para encontrar x que resolve Ax = b, devemos escrever agora o sistema na forma Lux = Pb (j que PA=LU). Agrupando as matrizes, fazemos L(Ux) = b. Chamando o produto (Ux) de 'y', temos Ly = b, um sistema linear cuja soluo, c, no conhecemos, mas que facil de resolver, uma vez que L triangular. y = L\(P*b) De posse de U e y, e sabendo que Ux = y, encontramos, finalmente, x resolvendo este sistema que tambm triangular: x = U\y

Quando no existe ou existe mais de uma soluo.

Como sabemos, sistemas do tipo Ax = b, onde a matriz A quadrada, s tm soluo nica se A no for singular, o que significa dizer que suas linhas (ou colunas) so linearmente independentes, isto , que o posto de A igual dimensao da matriz, que chamamos de n. Naqueles casos em que posto(A)<n, o sistema ter infinitas solues ou no ter soluo, dependendo do vetor b. Ao tentarmos resolver problemas deste tipo, o MATLAB ir escrever a mensagem "Warning: Matrix is singular to working precision", indicando a impossibilidade de encontrar uma soluo nica. Ex: A = [4 3 2 1; 1 2 3 4; 1 3 2 4; 4 4 1 1] b = [3; 3; 3; 3] x = A\b Tambm poderamos ter identificado o problema calculando o posto de A: rank(A) Para identificar se o problema indeterminado ou tem infinitas solues, usamos novamente a decomposicao LU: [L,U,P] = lu(A) Observamos ento que a matriz U possui um elemento diagonal igual a zero, um indicativo de que A singular. O posto de A ser igual ao nmero de elementos no nulos da diagonal de U. Neste exemplo, como a ltima linha de U contm apenas zeros, ser fcil determinar se o sistema tem infinitas solues ou impossvel. Para tanto, calculamos y tal que Ly = Pb: y = L\(P*b) Como o elemento de y correspondente linha totalmente nula de U zero, o sistema ter infinitas solues. Usando outro vetor b podemos obter um sistema sem soluo, como no seguinte exemplo. b = [3; 0; 3; 3] y = L\b Neste caso, obtivemos um vetor y com a ltima componente diferente de zero, de modo que a ltima equao do sistema Ux = y equivale a 0.x = -3, o que impossvel.

Matrizes simtricas definidas positivas.


No s em aplicaes ligadas ao ajuste de curvas pelo mtodo dos quadrados mnimos e resoluo numrica de equaes diferenciais, mas tambm em boa parte dos sistemas lineares provenientes de problemas de engenharia, a matriz A simtrica, ou seja, igual sua transposta, e definida positiva, ou seja xTAx > 0 para todo vetor x no nulo. Nestes casos, usamos a decomposio de Cholesky para escrever A = L.LT, onde L uma matriz triangular inferior e LT sua transposta. Tentemos, por exemplo, resolver o sistema dado abaixo. A = [14 10 4; 10 14 4; 4 4 2]; b = [20; 28; 10]; Em primeiro lugar, vamos decompor A na forma L.LT: L = chol(A) Agora, sabendo que L.LTx = b, chamamos de y o termo (LT.x), de modo que o sistema torna-se Ly = b, com L triangular inferior. Para encontrar y executamos:

y = L\b E como LTx = y, encontramos finalmente o vetor x fazendo: x = L'\y Este processo mais barato que a eliminao de Gauss normal porque evita que calculemos e guardemos na memria do computador a matriz U (que agora a transposta de L) e porque no exige permutaes de linhas. Entretanto, a decomposio de Cholesky exige que A seja definida positiva. Se isso no acontece uma mensagem de erro exibida, como no exemplo A = [4 10 4; 10 14 4; 4 4 2]; L = chol(A)

Matrizes esparsas.
Quando se trata de resolver um sistema linear Ax = b grande, preciso ter em conta as caractersticas da matriz A de forma a economizar o espao gasto pelo computador para armazen-la, o trabalho consumido em sua digitao e o tempo de resoluo do sistema. E a caracterstica mais marcante das matrizes grandes a esparsidade. Consideramos esparsa uma matriz que possui um numero significativo de elementos iguais a zero, em oposio s matrizes densas, nas quais os elementos nulos aparecem em pequena quantidade. Consideremos, por exemplo, a matriz A guardada no arquivo "esparsa.mat", que descreve as conexes em um modelo de coluna de difrao numa indstria qumica: load esparsa A Esta matriz, embora sendo relativamente pequena por ter to somente 479 linhas e colunas, possui 299441 (ou 479x479) elementos, dos quais apenas 1888 so diferentes de zero, o que representa cerca de 0.82% do total. Verificamos isso usando os comandos size e nnz: [m,n] = size(A) nz = nnz(A) nz/(n*n) A disposio destes elementos na matriz, o que conhecemos por padro de esparsidade, tambm pode ser observada com o auxlio do comando spy: spy(A) Obviamente, em casos como esse interessante fornecer ao computador apenas os elementos no nulos de A, bem como manipular apenas estes elementos se preciso fazer alguma operao que envolva a matriz, o que pode ser feito no MATLAB sem nenhum esforo adicional, como veremos a seguir.

Criando matrizes esparsas.


Existem vrias formas de criar uma matriz esparsa no MATLAB. A mais bvia delas consiste em transformar uma matriz densa em esparsa usando o comando sparse, como no exemplo abaixo: H = [1 0 0 0 2; 0 2 0 3 0; 0 0 1 0 0; 0 0 0 -1 0; 0 -1 0 0 4] H1 = sparse(H)

Da mesma forma, a matriz H1, que esparsa, pode ser escrita na forma densa, bastando para isso executar H2 = full(H1) Observe a diferena entre a notao que o MATLAB usa para escrever uma matriz densa e outra esparsa. Enquanto a matriz H representada apenas pelos valores de seus elementos, no caso da matriz H1 cada elemento diferente de zero descrito como uma trinca (i,j,s), onde i indica sua linha, j indica sua coluna e s o seu valor. Se quisermos definir a matriz

H3

1 0 = 0 0 0

0 2 0 0 1

0 0 1 0 0

0 3 0 1 0

2 0 0 0 4

usando esta notao, devemos digitar: i = [1 1 2 2 3 4 5 5] j = [1 5 2 4 3 4 2 5] s = [1 2 2 3 1 -1 -1 4] H3 = sparse(i,j,s)

Decompondo uma matriz esparsa.


Os comandos do MATLAB utilizados para resolver um sistema esparso so os mesmos que foram definidos para matrizes densas. Assim, para obter a soluo do sistema guardado no arquivo "esparsa" fazemos simplesmente: load esparsa b = rand(479,1); A\b Da mesma forma, se a matriz simtrica, como no caso do sistema armazenado no arquivo "simet", usamos a decomposio de Cholesky: load simet L = chol(A); y = L\b; x = L'\y

Aproveitando a esparsidade.
Para resolver um sistema Ax=b atravs de um mtodo direto escrevemos a matriz A na forma: a) PA = LU, se A no simtrica; ou b) A = L.LT, se A simtrica. Se a matriz A esparsa, esperamos que L e U tambm o sejam. Mas o padro de esparsidade de L dificilmente ser igual ao de A pois durante o processo de triangularizao, alguns elementos que eram iguais a zero em A deixam de s-lo em L ou U. Para ilustrar este fato, observe o que aconteceu na ltima decomposio que voc fez acima:

subplot(2,2,1), spy(A), title('A') subplot(2,2,3), spy(L), title('L') Pelos grficos dos padres de esparsidade das matrizes observamos que o nmero de elementos no nulos cresceu de 7551 em A para 30319 em L, uma matriz que s tem elementos da diagonal principal para baixo. O percentual de preenchimento da matriz, que era igual a 3,3% para A, passou para 26,2% em L! Este crescimento do nmero de elementos diferentes de zero durante a decomposio de uma matriz pode tornar invivel o uso de um mtodo direto para a resoluo de sistemas que, embora bastante esparsos, so muito grandes. Felizmente, sabemos que o nmero de elementos gerados na triangularizao depende bastante da ordem em que as linhas e colunas do sistema so apresentadas. Assim, o mesmo sistema descrito acima pode ter uma decomposio de Cholesky mais barata se permutarmos convenientemente suas linhas e colunas. Para determinar uma permutao que melhore o padro de esparsidade de L usamos, no MATLAB, o comando symmmd: p = symmmd(A); A1 = A(p,p); L1 = chol(A1); Na primeira linha acima, determinamos a ordem das linhas e colunas de A que fornece um pequeno crescimento do nmero de elementos da matriz. A segunda linha serve para permutar as linhas e colunas de A segundo a ordem estabelecida em p. J a terceira linha faz a decomposio propriamente dita. Para comparar os padres de esparsidade de A1 e L1 com os que foram obtidos para A e L, completemos o desenho: subplot(2,2,2), spy(A1), title('A1') subplot(2,2,4), spy(L1), title('L1') Observe que A e A1 tm padres de esparsidade diferentes mas o mesmo nmero de elementos diferentes de zero, enquanto este nmero reduzido em muito ao passarmos de L para L1. Assim, a resoluo de um sistema Ax = b esparso simtrico feita de forma mais eficiente se escrevemos PAPT = L.LT. Neste caso, temos Ax = b PAPTPx = Pb LLTPx = Pb. Chamando LTPx de z, obtemos Lz = Pb. Resolvendo este sistema e chamando Px de y, obtemos, ento, L y = z. Finalmente, x pode ser encontrado facilmente fazendo x = PTy.
T

No MATLAB, os comandos necessrios para a soluo de um sistema linear esparso usando a decomposio de Cholesky so: p = symmmd(A); A2 = A(p,p); L = chol(A2)'; z = L\b(p); y = L'\z; x(p) = y;

Pensando no trabalho que d.


Como foi mencionado at agora, o tratamento correto das matrizes esparsas e a permutao de linhas e colunas permite que resolvamos um sistema de forma mais eficiente se estamos preocupados com o nmero

de elementos das matrizes. Vejamos agora o que acontece com o tempo gasto na decomposio e no nmero de operaes aritmticas necessrias para resolver um sistema. Para tanto vamos comparar os resultados obtidos na decomposio da matriz A oriunda do arquivo "simet". Em cada teste abaixo, o valor de cputime c1 fornece o tempo necessrio para a triangularizao. a) Usando a decomposio de Cholesky sem permutaes c1 = cputime; L1 = chol(A); cputime-c1 b) Usando a decomposio de Cholesky com permutaes c1 = cputime; p = symmmd(A); A1 = A(p,p); L1 = chol(A1); cputime-c1 c) Supondo que a matriz densa A2 = full(A); c1 = cputime; L2 = chol(A2); cputime-c1 d) Usando a decomposio LU c1 = cputime; [L,U,P] = lu(A); cputime-c1

Você também pode gostar