Introdução
ao MATLAB
e
ao pacote GAAL
2. Matrizes
MATLAB (acrônimo de MATrix LABoratory) é um software
interativo de alta performance voltado para o cálculo numérico. O MATLAB
integra análise numérica, cálculo com matrizes, processamento de sinais e
construção de gráficos em ambiente fácil de usar, onde problemas e soluções são
expressos somente como eles são escritos matematicamente, ao contrário da
programação tradicional.
O MATLAB é um sistema interativo cujo elemento básico de
informação é uma matriz que não requer dimensionamento. Esse sistema permite a
resolução de muitos problemas numéricos em apenas uma fração do tempo que se
gastaria para escrever um programa semelhante em linguagem Fortran, Basic ou C.
Além disso, as soluções dos problemas são expressas no MATLAB quase exatamente
como elas são escritas matematicamente.
Alguns pacotes para cálculos específicos podem ser
incorporados a rotinas pré-definidas. Um pacote chamado GAAL com funções que são direcionadas para o estudo de Geometria
Analítica e Álgebra Linear pode ser obtido através da Internet no endereço http://www.mat.ufmg.br/~regi. Neste endereço, você encontrará as
instruções para instalar esse pacote. OBS: você deve ter o MATLAB instalado
anteriormente para instalar o pacote GAAL!
As matrizes constituem a estrutura básica do MATLAB, por
isso ele permite várias maneiras de manipulá-las. Para construir uma matriz, os
elementos de uma mesma linha devem estar separados por branco ou vírgulas e as
linhas devem estar separadas por ponto e vírgula. Para criarmos uma matriz 3x2
fazemos:
EDU>>B=[1 2 3; 4 5 6]; ou EDU>> A=[1,2,3;4,5,6];
O ponto e vírgula foram colocados para que o MATLAB não exibisse o resultado do comando executado, por exemplo:
EDU>> A=[1 2;3 4];
EDU>> A=[1 2;3 4]
A =
1 2
3 4
Abaixo há um quadro onde listamos as principais operações
feitas com matrizes:
Operação |
Descrição
|
A+B |
Efetua a soma de duas matrizes |
A-B |
Efetua a subtração de duas matrizes |
A.’ |
Encontra a
transposta da matriz A |
A(:,j) |
Mostra a coluna j
de A |
Num*A |
Produto escalar de
num por A |
A^k |
Matriz A elevada à
potência k |
Exemplo 1:
Consideremos as matrizes A=[1 2;3 4] e B=[2 3;1 5]. Vamos realizar as operações
listadas na tabela acima sobre estas matrizes.
EDU>> A=[1 2;3 4]; % declaração da matriz A
EDU>> B=[2 3;1 5]; % declaração da matriz B
EDU>> A+B
%soma das matrizes
ans =
3 5
4 9
OBS: Quando não se atribui o resultado de um comando a uma variável, o MATLAB atribui o resultado a uma variável ‘ans’ (ou seja, answer)
EDU>> A-B % subtração das matrizes
ans =
-1 -1
2 -1
EDU>> A.' % transposta da matriz A
ans =
1 3
2 4
EDU>> B(:,2) % segunda coluna de B
ans =
3
5
EDU>> 5*B % multiplicação da matriz B por 5
ans =
10 15
5 25
EDU>> B^2 % matriz B elevada ao quadrado
ans =
7 21
7 28
Para modificar o elemento de uma matriz, basta atribuirmos a ele um novo valor:
EDU>> A(1,2)=5;
EDU>> A
A =
1 5
3 4
Se
um for atribuído um valor a um elemento não existente, ou seja, cujos índices
(um ou ambos) excedem o tamanho da matriz, então o MATLAB aumenta esta matriz automaticamente
preenchendo-a com valores nulos nas demais posições novas, de forma que a
matriz permaneça retangular:
EDU>> A(1,4)=7;
EDU>> A
A =
1 5
0 7
3 4
0 0
Seja
agora a matriz quadrada C de ordem 3:
EDU>> C=[1 2 3;4 5 6;7 8 9];
Os elementos de uma matriz podem ser referenciados tantos
individualmente, tal como
EDU>> C(3,3)
ans =
9
ou em
conjuntos. Se quisermos os elementos das linhas 1 2 3 e da coluna 2, fazemos
EDU>> C([1 2 3],2)
ans =
2
5
8
Consideremos
agora uma matriz D, 4x3:
EDU>> D=[3 5 1;7 3 5; 3 1 2;5 2 4];
Para sabermos o número de linhas e de colunas de uma matriz,
utilizamos o comando size. Existem
duas notações para essa função:
EDU>>
t=size(D)
t =
3
3
onde
a variável t é uma matriz linha contendo duas posições, uma contendo o número
de linhas e outra contendo o número de colunas. A outra maneira é:
EDU>>
[l,c]=size(D)
l =
4
c =
3
onde as variáveis l e c recebem respectivamente, o número de linhas e o número de colunas.
O
MATLAB possui funções que se aplicam individualmente à cada coluna de uma
matriz, produzindo uma matriz linha com elementos correspondentes ao resultado
de cada coluna. A tabela abaixo mostra algumas dessas funções.
Função |
Descrição |
sum |
Soma
dos elementos das colunas da matriz |
prod |
Produto
dos elementos das colunas da matriz |
mean |
Média
aritmética dos elementos das colunas da matriz |
std |
Desvio
padrão dos elementos das colunas da matriz |
max |
Maiores
elementos das colunas da matriz |
min |
Menores
elemento das colunas da matriz |
sort |
Ordena
em ordem crescente os elementos das colunas da matriz |
Exemplo
2: Considere um quadrado
mágico, isto é, uma matriz de ordem n>=3, com valores entre 1 e n2,
tal que a soma das linhas, das colunas e das diagonais dão sempre o mesmo
valor. Vamos demonstrar as principais operações da tabela acima.
EDU>> F=magic(3) % cria uma matriz mágica de ordem 3.
F =
8 1
6
3 5
7
4 9
2
EDU>> sum(F) % efetua a soma dos elementos das colunas de F
ans =
15 15
15
EDU>> prod(F) % efetua a produto dos elementos das colunas de F
ans =
96 45
84
EDU>> mean(F) % efetua a média aritmética dos elementos das colunas de F
ans =
5 5
5
EDU>> std(F) % efetua o desvio padrão dos elementos das colunas de F
ans =
2.6458 4.0000 2.6458
EDU>> max(F) % Mostra os maiores elementos das colunas da matriz
ans =
8 9
7
EDU>> min(F) % Mostra os menores elementos das colunas da matriz
ans =
3 1
2
EDU>> sort(F) % Ordena em ordem crescente os elementos das colunas da matriz
ans =
3 1
2
4 5
6
8 9
7
Todas essas funções podem ser aplicadas para se produzir os
resultados relativos a cada linha, bastando aplicar as funções à transposta da
matriz:
EDU>> sum(F.')
ans
=
15
15 15
EDU>>
prod(F.')
ans
=
48 105 72
O
MATLAB possui algumas funções para manipulação de matrizes, como listadas na
tabela abaixo:
Função
|
Descrição |
diag |
Sendo
o argumento um vetor, cria uma matriz diagonal com os elementos do vetor. Se
o argumento for uma matriz, produz uma matriz coluna com os elementos da
diagonal principal. |
tril |
Obtém
a parte triangular inferior de uma matriz |
triu |
Obtém
a parte triangular superior de uma matriz |
Exemplo 3: Utilizaremos a matriz F declarada no exemplo anterior para
mostrar as funções acima:
EDU>> d=diag(F) % mostra os elementos da diagonal principal da matriz F
d =
8
5
2
EDU>> D=diag(d) % cria uma matriz diagonal em que os elementos da diagonal principal são os elementos do vetor d.
D =
8 0
0
0 5
0
0 0
2
EDU>> L=tril(F) % Obtém a parte triangular inferior da matriz F
L =
8 0 0
3 5
0
4 9
2
EDU>>U=triu(F) % Obtém a parte triangular superior da matriz F
U =
8 1
6
0 5
7
0 0
2
O MATLAB também fornece várias
matrizes elementares que são de grande utilidade. Se um único parâmetro for
provido, então a matriz será quadrada e se forem dois parâmetros, a matriz será
retangular com as dimensões iguais aos valores desses parâmetros. Essas funções
estão especificadas na tabela abaixo:
Função |
Descrição
da matriz |
zeros |
Cria
uma matriz em que todos os elementos são nulos |
ones |
Cria
uma matriz em que todos os elementos são iguais a 1 |
eye |
Cria
a matriz identidade ou parte dela |
rand |
Cria
uma matriz de elementos aleatórios uniformemente distribuídos entre 0 e 1 |
randi* |
Cria
uma matriz de elementos aleatórios uniformemente distribuídos entre -5 e 5 |
randn |
Cria
uma matriz de elementos aleatórios com distribuição normal com média zero e
desvio padrão 1 |
*
comando do pacote GAAL.
Exemplo 4: Algumas
matrizes construídas com o auxílio dessas funções:
EDU>> Z=zeros(2)
Z
=
0
0
0
0
EDU>>
U=ones(2,3)
U =
1
1 1
1
1 1
EDU>>
I=eye(2,4)
I =
1 0 0
0
0 1
0 0
EDU>> R=rand(3)
R =
0.9501 0.4860 0.4565
0.2311 0.8913 0.0185
0.6068 0.7621 0.8214
EDU>> randn(3,5)
ans =
-0.4326 0.2877 1.1892
0.1746 -0.5883
-1.6656 -1.1465 -0.0376
-0.1867 2.1832
0.1253 1.1909 0.3273
0.7258 -0.1364
Nesta
seção, vamos utilizar os comandos do pacote GAAL para resolvermos sistemas
lineares. Instruções sobre a instalação deste pacote você encontra no site http://www.mat.ufmg.br/~regi.
O método que será utilizado na
resolução de sistemas lineares é o método de Gauss-Jordan. No quadro abaixo,
estão listados os comandos que efetuam as operações elementares sobres
matrizes.
Comando
|
Descrição
|
B=opel(alpha,i,A)
* |
Faz
a operação elementar alpha x linha i è linha i da matriz A e armazena na
matriz B. |
B=opel(alpha,i,j,A)
* |
Faz
a operação elementar alpha x linha i + linha j è linha j da matriz A e armazena em B. |
B=opel(A,i,j)
* |
Faz
a troca da linha i com a linha j da matriz A e armazena a matriz resultante
na variável B. |
B=escalona(A)
* |
Calcula
passo a passo a forma escalonada reduzida da matriz A e armazena a matriz
resultante na variável B. |
x=A\b |
Retorna
o vetor solução x do sistema linear Ax=b. |
*
comandos do pacote GAAL.
Vamos utilizar os comandos listados acima para resolvermos o seguinte sistema linear:
Inicialmente vamos criar a matriz
aumentada:
EDU>> A=[1 1 2 8; -1 -2 3 1; 3 -7 4 10] %cria a matriz aumentada do sistema.
A =
1
1 2 8
-1 -2
3 1
3
-7 4 10
Temos que encontrar o pivô da
primeira coluna. Como o primeiro elemento da coluna 1 é 1, basta zerarmos os demais elementos.
EDU>> B=opel(1,1,2,A); % multiplica por 1 a primeira linha e
soma com a segunda linha.
1*linha 1 + linha 2 ==> linha 2
EDU>> B=opel(-3,1,3,B); % multiplica a primeira linha por –3 e soma com a terceira.
-3*linha 1 + linha 3 ==> linha 3
EDU>> B
% mostra o conteúdo da matriz B
B =
1 1
2 8
0 -1
5 9
0 -10
-2 -14
Vamos agora encontrar o pivô da segunda coluna. Para isso, basta
multiplicarmos a segunda linha por –1.
EDU>> B=opel(-1,2,B) % multiplica a segunda linha por –1.
-1*linha 2 ==> linha 2
B =
1 1
2 8
0 1
-5 -9
0 -10
-2 -14
Temos que zerar
os outros elementos da segunda coluna.
EDU>> B=opel(-1,2,1,B); % multiplica por –1 a segunda linha e
soma com a primeira linha.
-1*linha 2 + linha 1 ==> linha 1
EDU>> B=opel(10,2,3,B); % multiplica a segunda linha por 10 e soma com a terceira linha.
10*linha 2 + linha 3 ==> linha 3
EDU>> B
% mostra o conteúdo da matriz B.
B =
1 0
7 17
0 1
-5 -9
0 0
-52 -104
Encontraremos agora o pivô da terceira linha. Para isso, multiplicaremos a
terceira linha por –1/52.
EDU>> B=opel(-1/52,3,B); % multiplica a terceira linha por –1/52.
-1/52*linha 3 ==> linha 3
EDU>> B
% mostra o conteúdo da matriz B.
B =
1 0
7 17
0 1
-5 -9
0 0
1 2
Para terminarmos o processo de
escalonamento, basta zerarmos os elementos da terceira
coluna.
EDU>> B=opel(5,3,2,B); % multiplica por 5 a terceira linha e
soma com a segunda linha.
5*linha 3 + linha 2 ==> linha 2
EDU>> B=opel(-7,3,1,B); % multiplica a terceira linha por -7 e soma com a primeira linha.
-7*linha 3 + linha 1 ==> linha 1
EDU>> B
% mostra o conteúdo da matriz B.
B =
1 0
0 3
0 1
0 1
0 0
1 2
Portanto encontramos o vetor solução
deste sistema, X=[3 1 2];
Executando o comando escalona(A), bastaria criar a matriz aumentada e executarmos o comando. Como exemplo, vamos resolver o sistema acima utilizando este comando.
Inicialmente temos que criar a
matriz aumentada do sistema.
EDU>> A=[1 1 2 8; -1 -2 3 1; 3 -7 4 10]
A =
1 1
2 8
-1 -2
3 1
3 -7
4 10
Criada a matriz aumentada, basta
executarmos o comando escalona(A):
EDU>> B=escalona(A)
[ 1, 1,
2, 8]
[ -1, -2,
3, 1]
[ 3,
-7, 4, 10]
eliminação 1:
(1)*linha 1 + linha 2 ==> linha 2
(-3)*linha 1 + linha 3 ==> linha 3
[ 1, 1,
2, 8]
[ 0, -1,
5, 9]
[ 0,
-10, -2, -14]
Continua ? (s/n) s
eliminação 2:
(-1)*linha 2 ==> linha 2
[ 1, 1,
2, 8]
[ 0, 1,
-5, -9]
[ 0,
-10, -2, -14]
Continua ? (s/n) s
(-1)*linha 2 + linha 1 ==> linha 1
(10)*linha 2 + linha 3 ==> linha 3
[ 1, 0,
7, 17]
[ 0, 1,
-5, -9]
[ 0, 0,
-52, -104]
Continua ? (s/n) s
eliminação 3:
(-1/52)*linha 3 ==> linha 3
[ 1, 0,
7, 17]
[ 0, 1, -5, -9]
[ 0, 0,
1, 2]
Continua ? (s/n) s
(-7)*linha 3 + linha 1 ==> linha 1
(5)*linha 3 + linha 2 ==> linha 2
[ 1, 0, 0, 3]
[ 0, 1, 0, 1]
[ 0, 0, 1, 2]
Continua ? (s/n) s
Fim
B =
[ 1, 0, 0, 3]
[ 0, 1, 0, 1]
[ 0, 0, 1, 2]
Portanto,
obtemos o mesmo vetor solução, X=[3 1 2];
Um recurso que o próprio MATLAB oferece para resolver
sistemas lineares com rapidez é o operador \. Dado qualquer sistema linear
Ax=b, a solução pode ser facilmente digitando o comando A\b. Vamos resolver o
sistema acima utilizando este comando.
Inicialmente,
do mesmo modo que acima, temos que criar a matriz dos coeficientes e o vetor dos termos independentes do sistema:
EDU>> A=[1 1 2 ; -1 -2 3 ; 3 -7 4 ]; % forma a matriz A
EDU>> b=[8 1 10]'; % forma o vetor dos termos independentes
Agora,
basta executar o comando:
EDU>>
x=A\b
x
=
3.0000
1.0000
2.0000
Obtemos, é claro, o
mesmo vetor solução encontrado acima quando utilizamos o pacote de GAAL.
Nesta
seção, encontraremos a inversa de matrizes usando o MATLAB. Utilizaremos aqui o
mesmo método apresentado no livro texto, que consiste em escalonar a matriz
aumentada. Essa matriz aumentada é formada pela matriz cuja inversa queremos
encontrar e pela matriz identidade. Inicialmente, vamos listar os comandos do
pacote GAAL que utilizaremos:
Comando
|
Descrição
|
M=[A,B] |
Atribui
à matriz M a matriz obtida colocando lado a lado as matrizes A e B |
B=opel(alpha,i,A) |
Faz
a operação elementar alpha x linha i è linha i da matriz A e armazena na
variável B. |
B=opel(alpha,i,j,A) |
Faz
a operação elementar alpha x linha i + linha j è linha j da matriz A e armazena em B. |
B=opel(A,i,j) |
Faz
a troca da linha i com a linha j da matriz A e armazena a matriz resultante
na variável B. |
B=escalona(A) |
Calcula
passo a passo a forma escalonada reduzida da matriz A e armazena a matriz
resultante na variável B. |
Inicialmente,
escrevemos a matriz aumentada.
EDU>> A=[1 2 3;1 1 2;0 1 2]; %
forma a matriz A
EDU>> B=[A,eye(3)]; %
forma a matriz aumentada B
B =
1 2
3 1 0 0
1 1
2 0 1 0
0 1
2 0 0 1
Vamos agora escalonar a matriz aumentada. O elemento da
primeira linha (pivô) é 1, precisamos apenas zerar os elementos da primeira coluna.
EDU>> B=opel(-1,1,2,B) % multiplica a primeira linha por –1 e
soma com a segunda.
-1*linha 1 + linha 2 ==> linha 2
B =
1 2
3 1 0 0
0 -1
-1 -1 1
0
0 1
2 0 0 1
Encontraremos agora o pivô da
segunda linha. Para isso, basta multiplicarmos a segunda linha por -1.
EDU>> B=opel(-1,2,B) % multiplica a
segunda linha por –1.
-1*linha 2 ==> linha 2
B =
1 2
3 1 0 0
0 1
1 1 -1 0
0 1
2 0 0 1
Devemos
agora zerar os elementos da segunda coluna.
EDU>> B=opel(-2,2,1,B) % multiplica a segunda linha por –2 e
soma com a primeira linha.
-2*linha 2 + linha 1 ==> linha 1
B =
1 0
1 -1 2 0
0 1
1 1 -1 0
0 1
2 0 0 1
EDU>> B=opel(-1,2,3,B) %
multiplica a segunda linha por –1 e soma com a terceira linha.
-1*linha 2 + linha 3 ==> linha 3
B =
1 0
1 -1 2 0
0 1
1 1 -1 0
0 0
1 -1 1 1
Como
o elemento da terceira linha e terceira coluna já é o pivô,
basta zerarmos os elementos da terceira coluna.
EDU>> B=opel(-1,3,2,B) % multiplica a terceira linha por –1 e
soma com a segunda.
-1*linha 3 + linha 2 ==> linha 2
B =
1 0
1 -1 2 0
0 1
0 2 -2 -1
0 0
1 -1 1 1
EDU>> B=opel(-1,3,1,B) % multiplica a terceira linha por –1 e
soma com a primeira.
-1*linha 3 + linha 1 ==> linha 1
1 0
0 0 1 -1
0
1 0 2 -2 -1
0 0
1 -1 1 1
Assim,
a matriz [A|I3] é equivalente por linhas à matriz acima, que é da
forma [I3|S], portanto a matriz A é invertível e sua inversa é a
matriz S, ou seja,
S=.
O
MATLAB também oferece um comando muito simples para o cálculo da inversa de uma
matriz:
Comando
|
Descrição
|
B=inv(A) |
Atribui
à matriz B a inversa da matriz A |
EDU>> A=[1 2 3;1 1 2;0 1 2]; %
forma a matriz A
EDU>> B=inv(A) % calcula a inversa da matriz A
B =
0 1
-1
2 -2
-1
-1 1
1
Como
esperado, obtemos a mesma matriz encontrada anteriormente.
O determinante de uma matriz pode ser facilmente encontrado
usando o MATLAB. O quadro abaixo mostra esse comando, além de um comando
específico do pacote GAAL para encontrarmos o determinante de uma matriz.
Comando
|
Descrição
|
b=det(A) |
Atribui
à variável b o determinante da matriz A. |
b=detopelp(A)* |
Calcula
o determinante da matriz A aplicando operações elementares até que a matriz esteja
na forma triangular superior e atribui o resultado à variável b. |
*Comando do pacote
GAAL
Vamos
utilizar esses comandos para calcular o determinante da seguinte matriz:
Inicialmente
temos que criar a matriz e depois executarmos os comandos. Vamos calcular
primeiramente utilizando o recurso oferecido pelo MATLAB:
EDU>>
A=[1 2 3; 1 1 2; 0 1 2]; % cria a
matriz A
EDU>>
b=det(A) %
calcula o determinante da matriz A
b =
-1
Utilizando o comando
do pacote GAAL:
EDU>>
b=detopelp(A) % calcula o
determinante da matriz A transformando-a em uma matriz triangular superior.
A =
[
1, 2, 3]
[
1, 1, 2]
[
0, 1, 2]
eliminação
1:
-1*linha
1 + linha 2 ==> linha 2
A =
[ 1,
2, 3]
[ 0, -1, -1]
[ 0,
1, 2]
Continua ?
(s/n) s
eliminação
2:
-1*linha
2 ==> linha 2
A =
[
1, 2, 3]
[
0, 1, 1]
[
0, 1, 2]
det(A)
= (-1)*det(A)
Continua ?
(s/n) s
-1*linha
2 + linha 3 ==> linha 3
A =
[
1, 2, 3]
[
0, 1, 1]
[
0, 0, 1]
Continua ?
(s/n) s
Fim!
det(A)
= (-1)*det(A)
b =
-1