Anda di halaman 1dari 31

Introduo ao SAS/IML para lgebra de Matrizes

Escola Superior de Agricultura Luiz de Queiroz Departamento de Cincias Exatas - ESALQ/USP Fevereiro de 2002
(ve rso 3, 14)

Antonio Augusto Franco Garcia Antonio Francisco Iemma

Introduo ao SAS/IML para lgebra de Matrizes


Esse texto destina-se aos alunos do curso de vero de lgebra de Matrizes do Departamento de Cincias Exatas da ESALQ/USP, visando auxiliar na resoluo dos exerccios propostos e fornecendo ao mesmo tempo subsdios para a utilizao de um dos programas computacionais mais empregados na Estatstica: o SAS (Statistical Analysis System). Optou-se por apresentar as possveis aplicaes do mdulo IML mantendo a mesma seqncia do texto usado em aula, de modo a complement-lo. Leitores interessados em maiores detalhes podero consultar o livro SAS/IML Software: Usage and Reference, Version 6, First Edition, Cary, NC: SAS Institute Inc., 1989. 501pp. (6th printing, December 1995), alm de outras publicaes do referido instituto. Por ter finalidades didticas, os programas aqui citados foram elaborados de forma a facilitar o entendimento do assunto, no visando exclusivamente aplicaes prticas ou anlise de dados. Supe-se contudo que esta forma de abordagem propiciar aos leitores com interesse aplicado os subsdios necessrios para o desenvolvimento de seus prprios programas. Crticas e sugestes, bem como correo de eventuais erros no material, sero bem recebidas.

C o ns i de ra e s so bre o SAS/ IML

Consideraes sobre o SAS/IML


O software SAS/IML (Interactive Matrix Language) uma linguagem de programao muito flexvel, tendo como principais vantagens a interatividade com o usurio, a possibilidade de trabalhar com matrizes de forma simples, alm da possibilidade do uso de funes prprogramadas e outras procedures do prprio SAS. Os resultados dos comandos podem ser vistos imediatamente ou armazenados para posterior execuo, a critrio do usurio. Nesse texto, por razes bvias, ser dada nfase as operaes matriciais. No entanto, o SAS/IML uma linguagem de programao, permitindo que o usurio escreva seus prprios programas. Operaes como inverso de matrizes, obteno de autovalores e autovetores, etc, podem ser realizadas usando comandos pr-programados, facilitando o trabalho e evitando o uso de algoritmos sofisticados que utilizam vrias linhas de programao. O fato dos algoritmos empregados serem amplamente testados e discutidos por usurios do mundo todo permite que os resultados obtidos sejam muito confiveis. Alm disso, o SAS/IML faz uso muito eficiente dos recursos do computador, facilitando o trabalho com matrizes de grandes dimenses. As sesses do IML iniciam-se com o comando "proc iml;" e finalizam-se com o comando "quit;". Uma matriz definida entre chaves ({}), sendo que as vrgulas indicam as mudanas de linhas. Um primeiro programa:
proc iml; a={3 -1 2, 2 -2 3, 4 1 -4}; x=inv(a); print x; quit;

X 0.3333333 -0.133333 0.0666667 1.3333333 -1.333333 -0.333333 0.6666667 -0.466667 -0.266667

Esse programa permite a obteno da matriz X, que a inversa de A. O comando PRINT solicita a visualizao da matriz X. Vale ressaltar que, ao usar o comando QUIT, a sesso do IML encerrada e as matrizes e variveis criadas so apagadas da memria RAM.

I n t r o d u o a o SAS /I M L p a r a l g e b r a d e M a t r i ze s

D e fi n in d o m a tr iz e s

Definindo matrizes
O objeto fundamental sobre o qual operam os comandos do IML uma matriz com linhas e colunas, podendo ser numrica ou alfanumrica. O nmero mximo de caracteres que um elemento de uma matriz alfanumrica pode apresentar 32676, sendo que todos os elementos sero armazenados com o mesmo nmero de caracteres que o maior deles. Os nomes atribudos as matrizes devem ser vlidos no ambiente SAS, seguindo suas regras: possuir de 1 a 8 caracteres sem espaos e comear com letras, aceitando nmeros a partir do 2 caractere (verses 6.12 e anteriores). Em verses mais recentes, como a 8.0 e 8.2, os nomes das variveis podem exceder oito caracteres. possvel criar matrizes com valores perdidos, sendo que os mesmos devem ser indicados por um ponto ("."). Contudo, nem todos os comandos funcionam com matrizes com pontos. Uma vez definido um nome para a matriz, ele pode ser usado diretamente ou substitudo em aes futuras, a critrio do usurio, sendo possvel inclusive substituir apenas determinados elementos, conforme ser visto a seguir. Ao se referir a uma dada matriz, pode ser simplesmente utilizado seu nome, ou ainda especificando seus elementos. Matrizes com mltiplos elementos so especificadas com o uso de chaves ({ }), sendo que as linhas so separadas por vrgulas. Evidentemente, todas as linhas devem conter o mesmo nmero de elementos. Os valores a serem adicionados podem ser: Nmeros reais inteiros ou com decimais (notao cientfica, como 1E-8, permitida). Caracteres alfanumricos ("strings"), que podem estar entre aspas simples ( ) ou duplas (" "), ou at mesmo sem elas, sendo que nesse caso todos os valores sero armazenados com letras maisculas. Nmeros entre colchetes ( [ ] ) indicam o nmero de vezes que um dado valor de repete, facilitando a digitao em muitas situaes. Matrizes tambm podem ser criadas a partir do uso de funes pr-programadas, do comando CALL ou de um programa especfico. A seguir, so apresentados exemplos de matrizes com um nico elemento (escalares):
proc iml; a=32; b=.; c='oi'; d='ol pessoal'; e="ciao"; print a b c d e;

A 32

B C D E . oi ol pessoal ciao

I n t r o d u o a o SAS /I M L p a r a l g e b r a d e M a t r i ze s

D e f i ni n d o m a tr i ze s

J as matrizes com mltiplos elementos so escritas da seguinte maneira:


proc iml; x={10 20 30 40}; y={10, 20, 30, 40}; z={1 2, 3 4, 5 6}; print x y z;

X 10

Y 20 20 30 40

Z 30 3 5

40 4 6

10

Ou ainda, para caracteres alfanumricos: este


proc iml; aa={ abcd Efgh}; bb={'abcd' 'Efgh'}; print aa bb;

AA BB ABCD EFGH abcd Efgh

Pelo fato da matriz AA no apresentar seus elementos entre aspas, eles automaticamente so substitudos por letras maisculas. J para BB, foi respeitada a forma original. Caso seja necessrio definir elementos com espaos entre eles, deve-se sempre usar a segunda forma. Uma forma mais sinttica de escrever uma matriz com elementos repetidos possvel indicando o nmero de vezes que o elemento deve ser repetido, entre colchetes. Por exemplo:
proc iml; resposta={[3] 'Sim', [3] 'No', [3] 'Talvez'}; print resposta;

RESPOSTA Sim Sim Sim No No No Talvez Talvez Talvez

I n t r o d u o a o SAS /I M L p a r a l g e b r a d e M a t r i ze s

D e fi n in d o m a tr iz e s

Isso muito conveniente para construir matrizes com elementos repetidos, como ocorrem com as matrizes de delineamentos experimentais. Conforme mencionado, uma matriz pode ser redefinida no momento em que o usurio julgar conveniente. A segunda matriz denominada RESPOSTA sobrepe-se primeira.
proc iml; resposta={[3] 'Sim', [3] 'No', [3] 'Talvez'}; resposta={[3] 1, [3] 2, [3] 0}; print resposta;

RESPOSTA 1 2 0

1 2 0

1 2 0

Matrizes tambm podem ser obtidas como resultado de funes ou expresses, como por exemplo x=inv(a); em que os elementos de X so obtidos pela inverso de A. H ainda uma opo muito prtica, que a construo de vetores indexados, como apresentado abaixo. Note que possvel inclusive usar a funo DO, sendo o ltimo nmero da funo o incremento.
proc iml; r=1:5; s=10:5; t='xyz1':'xyz4'; u=do(-2,1,1); v=do(-2,1,.5); print r s t u v;

2 9

3 8

4 7

5 6 5

S 10 T

xyz1 xyz2 xyz3 xyz4 -1 -1.5 0 -1 1 -0.5 0 0.5 1

U -2 V -2

I n t r o d u o a o SAS /I M L p a r a l g e b r a d e M a t r i ze s

D e f i ni n d o m a tr i ze s

Um comando tambm til o SHOW NAMES, que permite visualizar os atributos de todas as matrizes armazenadas. No caso, tem-se a dimenso, o tipo - numrica ou alfanumrica e o nmero de bits para armazenamento.
proc iml; x={1 1 0, 1 1 0, 1 0 1, 1 0 1}; y={1, 2, 3, 4}; show names; print x y;

X 4 rows Y 4 rows Number of symbols = 2 X 1 1 1 1

3 cols num 8 1 col num 8 (includes those without values) Y 1 2 3 4

1 1 0 0

0 0 1 1

Matrizes especiais, como a matriz identidade, possuem comandos especficos para sua obteno, sendo que o nmero entre parnteses indica sua dimenso:
proc iml; identid=i(5); print identid;

IDENTID 1 0 0 0 0

0 1 0 0 0

0 0 1 0 0

0 0 0 1 0

0 0 0 0 1

J matrizes com elementos iguais, que podem ser iguais a um (matriz de uns) ou a qualquer outro valor de interesse, so obtidas com a funo J.

I n t r o d u o a o SAS /I M L p a r a l g e b r a d e M a t r i ze s

D e fi n in d o m a tr iz e s

proc iml; uns1_5=j(1,5,1); uns5_5=j(5,5,1); quatros=j(3,4,4); print uns1_5 uns5_5 quatros;

1 1 1 1 1 1

UNS1_5 1 UNS5_5 1 1 1 1 1

1 1 1 1 1 1

1 1 1 1 1 1

1 1 1 1 1 1 QUATROS 4 4 4 4 4 4 4 4 4 4 4 4

Para essa funo, o primeiro valor dentro dos parnteses indica o nmero de linhas da matriz a ser criada, o segundo, o de colunas, e o terceiro, o valor que tero todos os elementos. Outros comandos teis so os que fornecem a dimenso das matrizes armazenadas, NROW (nmero de linhas) e NCOL (nmero de colunas):
proc iml; x={1 2 3, 4 5 6, [3] 9, [2] 1 0}; m=nrow(x); n=ncol(x); print m n x;

M 4

N 3

X 1 4 9 1

2 5 9 1

3 6 9 0

Finalizando esta sesso, mencionaremos ainda o comando STORAGE, que permite armazenar (gravar) as matrizes numa biblioteca, permitindo seu uso posterior. Isso pode ser til nos casos em que os programas so extensos e/ou h limitao de memria do computador. O comando FREE elimina as matrizes da memria RAM.
proc iml;

I n t r o d u o a o SAS /I M L p a r a l g e b r a d e M a t r i ze s

O pe ra e s B s i ca s

x={1 1 0, 1 1 0, 1 0 1, 1 0 1}; y={1, 2, 3, 4}; store x y; free x y; show storage;

Contents of storage library = WORK.IMLSTOR Matrices: X Y Modules:

Operaes Bsicas
A partir desse ponto, em funo de estarmos sempre apresentando comandos do SAS/IML, no apresentaremos mais os comandos PROC IML e QUIT, necessrios para iniciar e encerrar a sesso.

3.1. Adio
A={2 2, 3 4}; B={4 5, 1 0}; SOMA=A+B; print A B soma;

A 2 3

2 4

B 4 1

5 0

SOMA 6 4

7 4

I n t r o d u o a o SAS /I M L p a r a l g e b r a d e M a t r i ze s

O p e ra e s B si ca s

3.2. Subtrao
DIF=A-B; print dif;

DIF -2 2

-3 4

3.3. Multiplicao por Escalar


C=4; AxC=A*C; print AxC;

AXC 8 12

8 16

3.4. Multiplicao de Matrizes


AxB=A*B; print AxB;

AXB 10 16

10 15

3.5. Soma Direta


Para tanto, deve-se utililizar a funo BLOCK, que permite realizar a soma direta de um grande nmero de matrizes.
a={2 2, 4 4}; b={6 6, 8 8}; c=block(a,b);

I n t r o d u o a o SAS /I M L p a r a l g e b r a d e M a t r i ze s

O pe ra e s B s i ca s

print a b c;

A 2 4

2 4

B 6 8

6 8

C 2 4 0 0

2 4 0 0

0 0 6 8

0 0 6 8

3.6. Produto Direto (Kronecker)


a={1 0, 0 1}; b={1, 2, 3}; c1=a@b; c2=b@a; c3=a@a; print a b c1 c2 c3;

A 1 0

0 1

B 1 2 3

C3 1 0 0 0

C1 1 2 3 0 0 0 0 0 1 0 0 0 0 1

0 0 0 1 2 3

C2 1 0 2 0 3 0

0 1 0 2 0 3

0 1 0 0

3.7. Produto de Hadamard


a={1 2, 3 4}; b={4 8, 0 5}; c=a#b; print c;

I n t r o d u o a o SAS /I M L p a r a l g e b r a d e M a t r i ze s

O p e ra e s B si ca s

C 4 0

16 20

3.8. Potncia de Matriz Quadrada


importante ressaltar que matrizes elevadas a nmeros muito grandes podem apresentar como resultado valores com grandes imprecises numricas. A potncia obtida como segue.
a={1 2, 3 4}; a2=a**2; a3=a**3; inversa=a**(-1); print a2 a3 inversa;

A2 7 15

10 22

A3 37 81

54 118

INVERSA -2 1.5

1 -0.5

3.9. Trao
x={1 2 3, 4 5 6, 6 2 4}; traco=trace(x); print traco;

TRACO 10

3.10. Transposio
x={ 1.9 2 3, 40 5.2 6, 60 20 4.3}; transp1=t(x); transp2=x`;

10

I n t r o d u o a o SAS /I M L p a r a l g e b r a d e M a t r i ze s

O pe ra e s B s i ca s

print transp1 transp2;

TRANSP1 1.9 2 3

40 5.2 6

60 20 4.3

TRANSP2 1.9 2 3

40 5.2 6

60 20 4.3

Note que h duas formas diferentes de transpor uma matriz, uma com o argumento psfixado e uma com o argumento pr-fixado. Evidentemente, ambas produzem o mesmo resultado.

3.11. Comparaes entre Matrizes


O SAS/IML possui operadores que permitem realizar a comparao entre os elementos de duas matrizes, fornecendo como resultado uma nova matriz de uns e zeros, conforme a comparao seja verdadeira ou falsa, respectivamente. A sintaxe dos operadores : matriz1 < matriz2, matriz1 <= matriz2, matriz1 > matriz2, matriz1 >= matriz2, matriz1 = matriz2, matriz1 ^= matriz2. Os dois ltimos operadores permitem identificar matriz iguais, mas devemos sempre observar que isso pode ocorrer devido a erros de aproximao. Alguns exemplos:
a={1 7 3, 4 2 4}; b={0 8 2, 4 1 3}; menor= a<b; menorig= a<=b; maior= a>b; maiorig= a>=b; igual= a=b; diferent= a^=b; print menor menorig maior maiorig igual diferent;

MENOR 0 0 MAIOR 1 0 IGUAL 0 1

1 0 0 1 0 0

0 0 1 1 0 0

MENORIG 0 1 MAIORIG 1 1 DIFERENT 1 0

1 0 0 1 1 1

0 0 1 1 1 1

I n t r o d u o a o SAS /I M L p a r a l g e b r a d e M a t r i ze s

11

O p e ra e s B si ca s

3.12. Concatenao de Matrizes e Vetores


A concatenao pode ser feita horizontalmente ou verticalmente, fornecendo uma excelente ferramenta para anlise de dados em situaes reais. Vejamos alguns exemplos:
A={4 3, -2 5}; b={10, 8}; C={7 -10, 4 13}; A_b=A||b; A_C=A//C; print A_b A_C;

A_B 4 -2

3 5

10 8

A_C

4 -2 7 4

3 5 -10 13

A matriz A e o vetor b foram concatenados horizontalmente usando o operador ||. J as matrizes A e C foram concatenadas verticalmente usando //, obviamente observando se as dimenses so compatveis.

3.13. Escalonamento de Matrizes


O SAS/IML possui duas funes para obteno de formas escalonadas, HERMITE e ECHELON, resultando matrizes na forma de Hermite e Echelon, respectivamente.
x={3 6 9, 1 2 5, 2 4 10}; h=hermite(x); e=echelon(x); print h e;

H 1 0 0

2 0 0

0 0 1

E 1 0 0

2 0 0

0 1 0

Note que, para essas matrizes, as formas escalonadas resultantes so diferentes, sendo a segunda delas a forma escalonada cannica.

12

I n t r o d u o a o SAS /I M L p a r a l g e b r a d e M a t r i ze s

O pe ra e s B s i ca s

3.14. Posto de Matrizes


As formas escalonadas permitem determinar o posto de matrizes:
A={4 2 2, 2 2 0, 2 0 2}; B={3 1 2, 1 4 1, 2 1 5}; C={1 2 3 4, 2 4 6 8}; Aesc=echelon(A); Besc=hermite(B); Cesc=echelon(C); print Aesc Besc Cesc;

AESC 1 0 0 CESC 1 0

0 1 0 2 0

1 -1 0 3 0

BESC 1 0 0 4 0

0 1 0

0 0 1

Verifica-se que o posto de A, B e C 2, 3 e 1, respectivamente. Embora o SAS/IML no possua uma funo que fornea diretamente o posto de uma matriz (a funo RANK fornece o rank dos elementos, e no da matriz, como desejado), isso pode ser conseguido com o auxlio de um programa auxiliar, apresentado a seguir. Ele bas eia-se nos teoremas 55 (r[A]=r[A+A]) e 50 (A+A simtrica e idempotente), lembrando ainda que para matrizes idempotentes o rank igual ao trao. A funo ROUND arredonda o valor encontrado, que sujeito a pequenos erros de aproximao.
A={4 2 2, 2 2 0, 2 0 2}; B={3 1 2, 1 4 1, 2 1 5}; C={1 2 3 4, 2 4 6 8}; RANK_A=round(trace(ginv(A)*A)); RANK_B=round(trace(ginv(B)*B)); RANK_C=round(trace(ginv(C)*C));

I n t r o d u o a o SAS /I M L p a r a l g e b r a d e M a t r i ze s

13

In ve rsa de Ma tr i z N o S i n gu la r print RANK_A RANK_B RANK_C;

RANK_A 2

RANK_B 3

RANK_C 1

Inversa de Matriz No Singular


Apresentaremos a seguir trs formas diferentes de calcular a inversa de matriz no singular, sendo que a primeira delas (INV1) foi includa apenas por razes didticas, usando o algoritmo de Gauss.
B={3 1 2, 1 4 1, 2 1 5}; INV1=hermite(B||I(3)); INV2=inv(B); INV3=B**(-1); print INV1 INV2 INV3;

INV1 1 0 0 INV2 0.475 -0.075 -0.175

0 1 0 -0.075 0.275 -0.025

0 0 1

0.475 -0.075 -0.175

-0.075 0.275 -0.025

-0.175 -0.025 0.275 -0.175 -0.025 0.275

-0.175 -0.025 0.275

INV3 0.475 -0.075 -0.175

-0.075 0.275 -0.025

Aproveitaremos a matriz INV1, que contm a inversa de B direita da identidade, para mostrarmos como selecionar submatrizes de uma dada matriz. possvel selecionar linhas, colunas ou at mesmo elementos de interesse. Para tanto, utilizam-se subscritos,que so operadores localizados dentros de colchetes, aps o operando. O primeiro nmero refere-se a(s) linha(s) a ser(em) retirada(s) e o segundo a(s) coluna(s), sendo que eles devem ser separados por uma vrgula. Para selecionar um nico elemento, como por exemplo da 3a linha e 4a coluna (lembre-se que INV1 tem dimenso 3 x 6):
B={3 1 2, 1 4 1,

14

I n t r o d u o a o SAS /I M L p a r a l g e b r a d e M a t r i ze s

In ve r sa d e M at ri z N o S in g u l a r

2 1 5}; INV1=hermite(B||I(3)); elem3_4=INV1[3,4]; print elem3_4;

ELEM3_4 -0.175

Para selecionar a linha 3 ou a coluna 4:


B={3 1 2, 1 4 1, 2 1 5}; INV1=hermite(B||I(3)); linha3=INV1[3,]; coluna4=INV1[,4]; print linha3 coluna4;

LINHA3 0

-0.175

-0.025

0.275

COLUNA4 0.475 -0.075 -0.175

Para selecionar uma submatriz, como por exemplo a inversa sem a parte referente matriz identidade:
B={3 1 2, 1 4 1, 2 1 5}; INV1=hermite(B||I(3)); INVERSA=INV1[, {4 5 6}]; print INVERSA;

INVERSA 0.475 -0.075 -0.175

-0.075 0.275 -0.025

-0.175 -0.025 0.275

Note que necessrio utilizar chaves para correta especificao da sub-matriz.

I n t r o d u o a o SAS /I M L p a r a l g e b r a d e M a t r i ze s

15

D e te r m in a n te s

Determinantes
O SAS/IML calcula o determinante de matrizes quadradas de forma simples, atravs da funo DET, considerando o fato de que o determinante pode ser obtido atravs do produto dos autovalores da matriz em questo, que por sua vez so obtidos pela decomposio LU (matrizes triangulares). O resultado fornecido uma matriz 1x1 (escalar) contendo o determinante.
proc iml; a={1 1 1, 1 2 4, 1 3 9}; determ=det(a); print determ;

DETERM 2

No h uma funo especfica para se obter matrizes adjuntas e dos cofatores de uma matriz de interesse.

Sistemas Consistentes de Equaes Lineares


O SAS possui a funo SOLVE para a soluo de sistemas de equaes lineares (consistentes e determinados), que muito eficiente em termos computacionais, devendo ser usado em situaes prticas. Contudo, sempre com finalidades didticas, sero apresentadas outras formas de resolver sistemas. Para usar a funo SOLVE para resolver o sistema Ax=b, pode-se proceder como apresentado a seguir.
A={4 3, -2 5}; b={10, 8}; x=solve(A,b); print x;

16

I n t r o d u o a o SAS /I M L p a r a l g e b r a d e M a t r i ze s

S i st e m as C o n si st e n te s d e E q u a e s L in e a r e s

1 2

As formas escalonadas apresentadas tambm podem ser usadas para soluo de sistemas de equaes lineares. Considerando o mesmo sistema com duas equaes e duas incgnitas, escrito na forma matricial Ax=b, um programa para obter sua soluo pode ser:
A={ 4 3, -2 5}; b={10, 8}; A_b=A||b; SOL1=echelon(A_b); SOL2=hermite(A_b); print SOL1 SOL2;

O escalonamento forneceu a soluo do sistema para x, com resultados 1 e 2.


SOL1 1 0 0 1 1 2 SOL2 1 0 0 1 1 2

Caso desejemos resolver o sistema usando o mtodo de Kramer, podemos usar o seguinte programa:
reset print; A={1 1 2, 2 0 3, 1 1 0}; B={ 9, 11, 3}; A1=B || A[, {2 3}]; A2=A[,1] || B || A[,3]; A3=A[, {1 2}] || B; DET_A=det(A); DET_A1=det(A1); DET_A2=det(A2); DET_A3=det(A3); X1=DET_A1/DET_A; X2=DET_A2/DET_A; X3=DET_A3/DET_A; SOLUCAO=X1//X2//X3;

Vale lembrar que no houve necessariamente a preocupao em elaborar programas mais sintticos e eficientes. Nesse contexto, foram definidas as matrizes A, B, A1, A2 e A3, com I n t r o d u o a o SAS /I M L p a r a l g e b r a d e M a t r i ze s 17

S i st e m a s C o n si s te n te s d e E q u a e s L i n e ar e s

seus respectivos determinantes. Em seguida, foi obtida a soluo do sistema, concatenada no vetor SOLUCAO. O comando RESET PRINT solicita a visualizao de todas as matrizes criadas, facilitando a visualizao dos resultados, embora com excesso de informaes. Para desativ-lo, deve-se usar RESET NOPRINT. A sada do programa acima
A 3 rows 1 2 1 3 rows 9 11 3 3 rows 9 11 3 3 rows 1 2 1 3 rows 1 2 1 1 row 4 1 row 4 1 row 8 1 row 12 1 row 1 1 row 2 1 row 3 3 cols 1 0 1 1 col (numeric) 2 3 0 (numeric)

A1

3 cols 1 0 1 3 cols 9 11 3 3 cols 1 0 1 1 col 1 col 1 col 1 col 1 col 1 col 1 col

(numeric) 2 3 0 (numeric) 2 3 0 (numeric) 9 11 3 (numeric) (numeric) (numeric) (numeric) (numeric) (numeric) (numeric)

A2

A3

DET_A DET_A1 DET_A2 DET_A3 X1 X2 X3

18

I n t r o d u o a o SAS /I M L p a r a l g e b r a d e M a t r i ze s

S i st e m as C o n si st e n te s d e E q u a e s L in e a r e s

SOLUCAO

3 rows 1 2 3

1 col

(numeric)

Um programa mais sinttico pode ser:


reset noprint; A={1 1 2, 2 0 3, 1 1 0}; B={ 9, 11, 3}; A1=B || A[, {2 3}]; A2=A[, 1] || B || A[, 3]; A3=A[, {1 2}] || B; SOLUCAO=DET(A1)/DET(A)//DET(A2)/DET(A)//DET(A3)/DET(A); print solucao;

SOLUCAO 1 2 3

No caso de obter solues para sistemas de equaes lineares homogneos do tipo Ax=(, sendo A de dimenso m x n, mn, possvel utilizar a funo HOMOGEN, que retorna solues como colunas ortonormais de uma matriz X com as propriedades Ax=( (P1) e X'X=I (P2). Para tanto, o posto de A deve ser r<n, ou seja, A deve ser de posto incompleto. A dimenso dessa matriz X n x (n-r), e portanto deve ser dada especial ateno a matrizes mal-condicionadas, j que o correto posto de A pode no ser obtido em funo de erros de aproximao.
A={4 2 2, 2 2 0, 2 0 2}; X=HOMOGEN(a); P1=A*X; P2=T(X)*X; print X P1 P2;

X -0.57735 0.5773503 0.5773503

P1 2.22E-16 2.22E-16 0

P2 1

Nesse caso, x a soluo no trivial, e P1 e P2 a verificao das propriedades da soluo. Note que pequenos erros de aproximao podem ocorrer. I n t r o d u o a o SAS /I M L p a r a l g e b r a d e M a t r i ze s 19

Ra z e s C a r a c t e r st i c a s ( a u t ov al o re s )

Um outro fato que pode ser mencionado que a dimenso da matriz com as solues do sistema homogneo podem ser usadas para calcular o posto da matriz A, j que no h uma funo especfica para tanto:
POSTO_A=NROW(X)-NCOL(X); print POSTO_A;

POSTO_A 2

Razes Caractersticas (autovalores)


Para obter os autovalores ("eingenvalues") de matrizes quadradas simtricas, usa-se a funo EIGVAL, que fornece um vetor com os autovalores ordenados em ordem decrescente.
A={3 1 1, 1 3 1, 1 1 3}; AUTOVAL=EIGVAL(A); print AUTOVAL;

AUTOVAL 5 2 2

Caso necessitemos obter os autovalores a partir da equao caracterstica, podemos usar a funo POLYROOT, que encontra as razes de um polinmio real. A sintaxe POLYROOT(vetor), em que o vetor de dimenso 1 x n contm os coeficientes de um polinmio de grau n-1, sendo que eles devem estar em ordem decrescente, com relao as potncias do polinmio. O resultado uma matriz de dimenso (n-1) x 2, com as razes do polinmio; a primeira coluna contm a parte real e a segunda, a parte imaginria (que dever ser zero, no contexto desse curso). No exemplo em questo, a equao caracterstica -x3+9x2-24x+20=0, e assim
p={-1 9 -24 20}; raizes=POLYROOT(p);

20

I n t r o d u o a o SAS /I M L p a r a l g e b r a d e M a t r i ze s

Ra ze s C a r a c t e r s ti c a s ( au to va lo re s)

print raizes;

RAIZES 2.0000003 1.9999997 5

0 0 0

interessante notar que as solues esto sujeitas a erros de aproximao, em funo do algoritmo empregado. Um outro aspecto que deve ser lembrado diz respeito ao fato do SAS/ IML usar um algoritmo que no garante que todas as razes do polinmio sejam encontradas; nesses casos, h uma mensagem para o usurio na janela LOG. Nas situaes em que desejamos obter matrizes diagonais com as razes caractersticas de uma dada matriz, combinamos a funo DIAG, que cria matrizes diagonais, com a funo EIGVAL.
M={ 2 -1 -1, -1 2 -1, -1 -1 2}; AUTOV=EIGVAL(M); L=DIAG(AUTOV); PRINT AUTOV L;

3 3 -9.11E-17

AUTOV

3 0 0

0 0 3 0 0 -9.11E-17

fcil verificar que, exceto devido a erros de aproximao, M positiva semi-definida. Caso apliquemos o comando DIAG em uma matriz (e no num vetor, como no exemplo acima), teremos como resultado uma matriz formada pelos elementos da diagonal dessa matriz, sendo os demais substitudos por zero. Para facilitar a visualizao, poderamos ainda usar a opo FUZZ, associada ao comando RESET, de modo que os nmeros muito pequenos (por volta de 1E-12) sejam impressos como zero.
reset fuzz; PRINT AUTOV L;

AUTOV 3 3

L 3 0

0 3

0 0

I n t r o d u o a o SAS /I M L p a r a l g e b r a d e M a t r i ze s

21

Ve t or e s C ar a c te r st i c os ( a u t ove t or e s ) 0 0 0 0

Para voltarmos ao default, dentro da mesma seo do IML, devemos usar o comando RESET NOFUZZ.

Vetores Caractersticos (autovetores)


A obteno dos autovetores ("eingenvectors") de matrizes quadradas simtricas pode ser feita pelo uso da funo EIGVEC, que cria uma matriz cujas colunas so autovetores ortonormais.
A={3 1 1, 1 3 1, 1 1 3}; AUTOVEC=EIGVEC(A); print AUTOVEC;

AUTOVEC 0.5773503 0.5773503 0.5773503

-0.408248 -0.408248 0.8164966

0.7071068 -0.707107 0

fcil verificar que esses vetores so ortogonais entre si, pois o produto entre autovalores diferentes 0, apresentando como resultado de seu produto consigo mesmo o valor 1 (norma 1). Em outras palavras, o produto entre a transposta da matriz com os autovalores e ela prpria a identidade:
RESET FUZZ; AUTOVEC=EIGVEC(A); ORTONORM=AUTOVEC`*AUTOVEC; print ORTONORM;

ORTONORM 1 0 0

0 1 0

0 0 1

Em situaes prticas, podemos obter os autovalores e autovetores diretamente, com o uso da sub-rotina EIGEN, acionada pelo comando CALL, que invoca determinadas estruturas

22

I n t r o d u o a o SAS /I M L p a r a l g e b r a d e M a t r i ze s

F or m as E qu iv al e n te s

(operaes) pr-armazenadas. O primeiro termo dentro dos parnteses especifica o nome da matriz que conter os autovalores; o segundo, da matriz que conter os autovetores; oterceiro indica sobre qual matriz o comando ser aplicado.
CALL EIGEN(AUTOVAL,AUTOVET,A); print AUTOVAL AUTOVET;

AUTOVAL 5 2 2

AUTOVET 0.5773503 -0.408248 0.7071068 0.5773503 -0.408248 -0.707107 0.5773503 0.8164966 0

Formas Equivalentes
As matrizes A e B so equivalentes se existem M e N no singulares tais que MAN=B. B dita forma normal de A. O SAS/IML fornece a forma normal de Hermite da matriz A, usando funo j vista anteriormente. Para matrizes quadradas, essa forma triangular superior e idempotente. Se A for no singular, o resultado ser uma matriz identidade.
A={4 2 2, 2 2 0, 2 0 2}; B=hermite(A); print B;

B 1 0 0

0 1 0

1 -1 0

possvel tambm obter a forma normal de Echelon que, nesse caso, coincide com a forma normal de Hermite:
B=echelon(A); print B;

I n t r o d u o a o SAS /I M L p a r a l g e b r a d e M a t r i ze s

23

F or m a s E q u i va l e n te s 1 0 0 0 1 0 1 -1 0

Se a matriz em questo for quadrada, as formas normais de Hermite e Echelon podem ser obtidas uma a partir da outra, apenas rearranjando as linhas de zeros. A forma de Echelon sempre fornece uma forma escalonada cannica. Para a obteno de uma matriz D diagonal congruente (e, portanto, equivalente) matriz A real e simtrica considerada, tal que TAT '=D, utiliza-se a sub-rotina EIGEN, pelo comando CALL EIGEN(D, T, A), j descrito anteriormente. Para tanto, utilizam-se as seguintes propriedades das matrizes obtidas com esse comando: T' = T-1 (ortogonal) e A=T*diag(D)*T', ou seja, diag(D) uma matriz diagonal congruente matriz A.
A={4 2 2, 2 2 0, 2 0 2}; CALL EIGEN (D,T,A); CONG=DIAG(D); A2=T*DIAG(D)*T`; reset FUZZ; print A A2;

A 4 2 2

2 2 0

2 0 2

A2 4 2 2

2 2 0

2 0 2

Dessas propriedades, conseguimos tambm verificar que diag(D)= T'*A*T, em que diag(D) uma matriz diagonal que exibe as razes caractersticas de A, e T uma matriz ortogonal cujas linhas so vetores caractersticos normalizados associados as razes caractersticas de A.
L1=DIAG(D); L2=T`*A*T; print L1 L2;

L1 6 0 0

0 2 0

0 0 0

L2 6 0 0

0 2 0

0 0 0

Nesse caso, A e diag(D) so tambm similares.

24

I n t r o d u o a o SAS /I M L p a r a l g e b r a d e M a t r i ze s

Fatorao

10

Fatorao
O SAS/IML no realiza diretamente fatoraes do tipo A=RR', fatoraes de posto completo do tipo A=BC e operaes de diagonalizao simultnea. No primeiro caso, possvel a obteno de fatoraes do tipo raiz quadrada de outra forma, apresentada abaixo. Uma vez que o principal interesse na fatorao de posto completo para a obteno da inversa generalizada de Moore-Penrose, a ausncia da fatorao no representa empecilho, uma vez que essa inversa generalizada calculada pelo SAS (itens seguintes). No manual, temos diversas outras decomposies que podem interessar ao leitor. Fatoraes do tipo A=U'U so obtidas com a funo ROOT, que retorna uma matriz triangular superior U que satisfaz a igualdade, sendo que a matriz A deve ser simtrica e positiva definida. Essa decomposio conhecida como decomposio de Cholesky, e a matriz U dita raiz quadrada de A.
U=ROOT(A); A1=U`*U; print U A1;

U 2 0 0

1 1 0

1 -1 0

A1 4 2 2

2 2 0

2 0 2

Vale ressaltar que alguns autores denominam a fatorao A=RR' como raiz quadrada, e no A=U'U, como o SAS considera. interessante notar que essa fatorao tambm do tipo triangular (A=LU), uma vez que U' triangular inferior e U triangular superior. Para realizar decomposio por valores singulares do tipo X=USV, o SAS/IML possui a subrotina SVD, acessada pelo comando CALL. Sua sintaxe CALL SVD(U, S, V, X), em que X representa a matriz a ser decomposta, U, S e V, o nome das matrizes a serem criadas com o resultado da decomposio, de forma que X=U*diag(S)*V e S contenha os valores singulares de A. Note que o algoritmo apresentado no texto das aulas tericas produz matrizes diferentes, mostrando que a decomposio no nica.
reset print; X={1 1 0, 1 1 0, 1 0 1, 1 0 1}; call svd(U,S,V,X); X1=U*diag(S)*V`;

I n t r o d u o a o SAS /I M L p a r a l g e b r a d e M a t r i ze s

25

In ve rsa s G e n e ra l i za d a s

X 1 1 1 1 U 0.5 0.5 0.5 0.5

4 rows 1 1 0 0

3 cols 0 0 1 1

(numeric)

4 rows 3 cols 0.5 0.7071068 0.5 -0.707107 -0.5 0 -0.5 0 1 col

(numeric)

S 3 rows 2.4494897 1.4142136 0

(numeric)

V 3 rows 3 cols (numeric) 0.8164966 0 -0.57735 0.4082483 0.7071068 0.5773503 0.4082483 -0.707107 0.5773503 X1 1 1 1 1 4 rows 1 1 0 0 3 cols 0 0 1 1 (numeric)

11

Inversas Generalizadas
possvel calcular a inversa generalizada de Moore-Penrose usando o SAS/IML, com o comando GINV(X), em que X a matriz a ser invertida. A inversa obtida satisfaz as quatro condies da inversa, conforme apresentado abaixo.
X={1 1 0, 1 1 0, 1 0 1, 1 0 1}; MP1=ginv(X); P1=MP1*X*MP1; P2=X*MP1*X; P3a=X*MP1; P3b=t(X*MP1); P4a=MP1*X; P4b=t(MP1*X); print MP1;

26

I n t r o d u o a o SAS /I M L p a r a l g e b r a d e M a t r i ze s

Inv e rs as G e n e ra l i za d a s

print P1 P2 P3a P3b P4a P4b;

MP1 0.1666667 0.1666667 0.1666667 0.1666667 0.3333333 0.3333333 -0.166667 -0.166667 -0.166667 -0.166667 0.3333333 0.3333333 P1 0.1666667 0.1666667 0.1666667 0.1666667 0.3333333 0.3333333 -0.166667 -0.166667 -0.166667 -0.166667 0.3333333 0.3333333 P3A 0.5 0.5 0 0 0.5 0.5 0 0 0 0 0.5 0.5 0 0 0.5 0.5 P3B 0.5 0.5 0 0 0.5 0.5 0 0 P2 1 1 1 1 1 0 0 0 0.5 0.5 0 0 1 0 0 0.5 0.5

P4A P4B 0.6666667 0.3333333 0.3333333 0.6666667 0.3333333 0.3333333 0.3333333 0.6666667 -0.333333 0.3333333 0.6666667 -0.333333 0.3333333 -0.333333 0.6666667 0.3333333 -0.333333 0.6666667

As inversas generalizadas reflexivas g2 para matrizes de delineamento podem ser obtidas com a funo SWEEP. Tomando o modelo linear de Gauss-Markov y = XB + e , podemos obter o sistema
X 'X X'y y 'x y 'y

e, usando o operador SWEEP sobre esse sistema, calcular uma matriz


( X'X )
g2 g2

( X'X ) X'y y ' ( I X ( X 'X ) X ' )y


g2

g2

y 'X ( X'X )

A partio superior esquerda dessa matriz contm a inversa g2 de X'X, a partio superior direita as solues para B e apartio inferior direita a soma de quadrados do resduo. Esse o procedimento usado pelo PROC GLM do SAS para realizar anlises de varincia. Um exemplo apresentado abaixo, sendo que o segundo argumento da funo SWEEP um vetor com ndices variando de 1 at o posto de X.
reset print; X={1 1 0, 1 1 0, 1 0 1, 1 0 1}; y={1,

I n t r o d u o a o SAS /I M L p a r a l g e b r a d e M a t r i ze s

27

In ve rsa s G e n e ra l i za d a s 2, 4, 3}; A=(t(X)*X||t(X)*y)//(t(y)*X||t(y)*y); t=1:ncol(X); G=sweep(A,t); reset noprint;

X 1 1 1 1 Y 1 2 4 3 A 4 2 2 10 T 1 G 0.5 -0.5 0 -3.5

4 rows 1 1 0 0 4 rows

3 cols 0 0 1 1 1 col

(numeric)

(numeric)

4 rows 2 2 0 3 1 row 2 4 rows -0.5 1 0 2

4 cols 2 0 2 7 3 cols 3 4 cols 0 0 0 0

(numeric) 10 3 7 30 (numeric)

(numeric) 3.5 -2 0 1

Leitores j familiarizados com o PROC GLM podem verificar as afirmativas acima com o seguinte programa:
data; input trat Y@@; datalines; 1 1 1 2 2 4 2 3 ;

28

I n t r o d u o a o SAS /I M L p a r a l g e b r a d e M a t r i ze s

Inv e rs as G e n e ra l i za d a s

proc glm; class trat; model Y=trat/inverse; run;

The GLM Procedure Class Level Information Class Levels Values trat 2 1 2 Number of observations 4

X'X Generalized Inverse (g2) Intercept Intercept 0.5 trat 1 -0.5 trat 2 0 Y 3.5 Dependent Variable: Y Source DF Sum of Squares 4.00000000 1.00000000 5.00000000 Root MSE 0.707107 Mean Square 4.00000000 0.50000000 Y Mean 2.500000 F Value 8.00 F Value 8.00 Pr > F 0.1056 Pr > F 0.1056 F Value 8.00 Pr > F 0.1056 trat 1 -0.5 1 0 -2 trat 2 0 0 0 0 Y 3.5 -2 0 1

Model 1 Error 2 Corrected Total 3 R-Square 0.800000 Source trat Source trat DF 1 DF 1 Coeff Var 28.28427

Type I SS 4.00000000 Type III SS 4.00000000

Mean Square 4.00000000 Mean Square 4.00000000

I n t r o d u o a o SAS /I M L p a r a l g e b r a d e M a t r i ze s

29