domingo, 21 de setembro de 2014
domingo, 17 de agosto de 2014
sexta-feira, 23 de maio de 2014
Resolução de sistemas de equações não singulares
Nota prévia: uma
matriz A (n x n) é não-singular se se verificarem as seguintes propriedades:
·
A tem uma inversa, designada por A-1;
·
O determinante de A (det(A)) é diferente de zero (det(A)¹0);
·
Para qualquer z¹ 0, A*z¹0.
2 Carlos
A resolução de sistemas de equações lineares
(não singulares) é muito fácil com o Matlab. Vamos lidar com equações simples
do tipo Ax=b em que A representa uma matriz dos coeficientes com dimensão m
por n, x é o vector coluna das incógnitas e b é o vector correspondente
aos termos independentes do sistema de equações. Imaginemos que temos um sistema de 2 equações (cada uma com duas incógnitas e um termo independente):
7x+8y=100
2x-9y=10
Seguindo a forma clássica de resolução teríamos que separar as equações nos seus componentes (coeficientes, incógnitas e termos independentes) e fazer os cálculos através dos determinantes. Tarefa árdua!
Teríamos então que fazer o seguinte:
x = D1/D, em que D significa determinante;
y = D2/D
Assim, resolvendo os determinantes obtemos:
D = 7*(-9)-8*2=-79 (determinante dos coeficientes);
D1 = 100*(-9)-10*8=-980 (determinante dos termos independentes e do vector das “segundas” incógnitas (y));
D2 = 7*10-2*100=-130 (determinante dos termos independentes e do vector das “primeiras” incógnitas (x));
Calculando as respectivas razões obtemos as soluções para as duas incógnitas:
x = 12.4051
y = 1.6456
Com este procedimento facilmente se verifica a quantidade de cálculos que têm que ser feitos para chegar a uma solução (com o perigo de nos enganarmos nos sinais dos escalares).
Com o Matlab tudo é mais simples pois só precisamos de decompor o sistema de equações e usar uma única instrução (\ - “backslash”).
O sistema de equações usado como exemplo é do tipo Ax=b em que A representa a matriz dos coeficientes com dimensão n por n, x é o vector coluna das incógnitas (x e y) e b é o vector correspondente aos termos independentes (100 e 10).
Sendo do tipo Ax=b a instrução a usar no Matlab é: x=A\b. Vamos ver:
A=[7 8; 2 -9];
b=[100; 10];
x=A\b
x =
12.4051
1.6456
Como se vê não foi necessária muita ginástica mental, a instrução \ resolveu tudo num instante!
Para verificar se os resultados estão certos basta fazer a operação inversa:
b=A*x
b =
100.0000
10.0000
quinta-feira, 22 de maio de 2014
MULTIPLICAÇÃO DE MATRIZES
Esta ferramenta é muito importante quando trabalhamos com sistemas de equações lineares. Vai ser igualmente importante quando estivermos a fazer a análise multivariada de dados matriciais (veremos este tópico um pouco mais adiante com dados reais).
Condição fundamental para executar a multiplicação de duas matrizes:
Para que [C]=[A]x[B] o número de colunas de [A] tem que ser igual ao número de linhas de [B].
Também podemos multiplicar uma matriz por um escalar.
Vejamos uns exemplos concretos, começando pela multiplicação de uma matriz por um escalar.
Definimos a matriz A:
A=[1 2 3;4 5 6;7 8 9] (não esquecer os espaços entre os algarismos e os ; que separam cada linha)
A =
1 2 3
4 5 6
7 8 9
A seguir definimos um escalar:
e=7 (por uma questão de comodidade uso letras minúsculas para os escalares)
e =
7
A seguir faz-se a multiplicação
C=A*e
Obtendo-se o respectivo resultado:
C =
7 14 21
28 35 42
49 56 63
Como se pode ver cada elemento da matriz inicial A foi multiplicado pelo escalar (7). Um curiosidade apenas: como a matriz criada tem uma sucessão de números inteiros de 1 a 9 ao multiplicarmos essa matriz pelo valor 7 obtemos uma nova matriz que corresponde à tabuada dos 7 (faltando apenas o resultado 70).
Vamos definir uma segunda matriz B:
B=[10 11 12;13 14 15;16 17 18]
B =
10 11 12
13 14 15
16 17 18
A e B são matrizes com a mesma dimensão e portanto estão em condições para poderem ser multiplicadas.
D =
84 90 96
201 216 231
318 342 366
Para quem não se lembra da regra da multiplicação de matrizes: o elemento (1,1) da matriz A multiplica o elemento (1,1) da matriz B; o elemento (1,2) da matriz A multiplica o elemento (2,1) da matriz B; o elemento (1,3) da matriz A multiplica o elemento (3,1) da matriz B. A seguir todos os valores destas multiplicações são somados e inseridos na posição (1,1) da matriz D. O processo repete nesta ordem até estarem todas as posições da matriz D ocupadas.
Para matrizes com dimensões diferentes:
F=[19 20 21;22 23 24;25 26 27]
F =
19 20 21
22 23 24
25 26 27
G=[28 29;30 31;32 33]
G =
28 29
30 31
32 33
O resultado será:
H=F*G
H =
1804 1864
2074 2143
2344 2422
Verifica-se pois que a matriz que resulta desta multiplicação (a H) tem formato igual ao da matriz mais pequena (a G), uma vez que na multiplicação de matrizes a regra geral é "cada elemento de uma linha de uma matriz vai multiplicar todos os elementos de uma coluna de outra matriz".
Será comutativa esta operação?
Aqui não podemos multiplicar G*F porque as dimensões não são compatíveis, mas podemos usar o exemplo anterior em que A e B têm as mesmas dimensões:
I=B*A
I =
138 171 204
174 216 258
210 261 312
e comparando com D
D =
84 90 96
201 216 231
318 342 366
Verificamos que I é diferente de D.
Condição fundamental para executar a multiplicação de duas matrizes:
Para que [C]=[A]x[B] o número de colunas de [A] tem que ser igual ao número de linhas de [B].
Também podemos multiplicar uma matriz por um escalar.
Vejamos uns exemplos concretos, começando pela multiplicação de uma matriz por um escalar.
Definimos a matriz A:
A=[1 2 3;4 5 6;7 8 9] (não esquecer os espaços entre os algarismos e os ; que separam cada linha)
A =
1 2 3
4 5 6
7 8 9
A seguir definimos um escalar:
e=7 (por uma questão de comodidade uso letras minúsculas para os escalares)
e =
7
A seguir faz-se a multiplicação
C=A*e
Obtendo-se o respectivo resultado:
C =
7 14 21
28 35 42
49 56 63
Como se pode ver cada elemento da matriz inicial A foi multiplicado pelo escalar (7). Um curiosidade apenas: como a matriz criada tem uma sucessão de números inteiros de 1 a 9 ao multiplicarmos essa matriz pelo valor 7 obtemos uma nova matriz que corresponde à tabuada dos 7 (faltando apenas o resultado 70).
Vamos definir uma segunda matriz B:
B=[10 11 12;13 14 15;16 17 18]
B =
10 11 12
13 14 15
16 17 18
A e B são matrizes com a mesma dimensão e portanto estão em condições para poderem ser multiplicadas.
D =
84 90 96
201 216 231
318 342 366
Para quem não se lembra da regra da multiplicação de matrizes: o elemento (1,1) da matriz A multiplica o elemento (1,1) da matriz B; o elemento (1,2) da matriz A multiplica o elemento (2,1) da matriz B; o elemento (1,3) da matriz A multiplica o elemento (3,1) da matriz B. A seguir todos os valores destas multiplicações são somados e inseridos na posição (1,1) da matriz D. O processo repete nesta ordem até estarem todas as posições da matriz D ocupadas.
Para matrizes com dimensões diferentes:
F=[19 20 21;22 23 24;25 26 27]
F =
19 20 21
22 23 24
25 26 27
G=[28 29;30 31;32 33]
G =
28 29
30 31
32 33
O resultado será:
H=F*G
H =
1804 1864
2074 2143
2344 2422
Verifica-se pois que a matriz que resulta desta multiplicação (a H) tem formato igual ao da matriz mais pequena (a G), uma vez que na multiplicação de matrizes a regra geral é "cada elemento de uma linha de uma matriz vai multiplicar todos os elementos de uma coluna de outra matriz".
Será comutativa esta operação?
Aqui não podemos multiplicar G*F porque as dimensões não são compatíveis, mas podemos usar o exemplo anterior em que A e B têm as mesmas dimensões:
I=B*A
I =
138 171 204
174 216 258
210 261 312
e comparando com D
D =
84 90 96
201 216 231
318 342 366
Verificamos que I é diferente de D.
terça-feira, 20 de maio de 2014
OPERAÇÕES ELEMENTARES COM MATRIZES (2)
Produtos de vectores e transposição de matrizes
Existe um conjunto de regras importantes a fixar:
1) um vector linha e um vector coluna com a mesma dimensão podem ser multiplicados entre si;
2) quando multiplicamos um vector linha por um vector coluna obtemos um escalar;
3) quando multiplicamos um vector coluna por um vector linha obtemos uma matriz com as dimensões correspondentes às dos vectores multiplicados;
4) não podemos multiplicar dois vectores colunas entre si o mesmo, sendo verdade, para a multiplicação de dois vectores linha;
5) todavia, a multiplicação entre dois vectores linha ou coluna pode ser feita se usarmos a operação de transposição;
6) a multiplicação entre um vector coluna transposto e outro vector coluna (não transposto) é igual a um escalar. Esta multiplicação goza da propriedade comutativa, isto é, podemos multiplicar o segundo vector coluna transposto pelo primeiro vector coluna não transposto e o resultado será um escalar de valor igual ao anterior.
Vou colocar aqui um exemplo que ilustre a regar mais complexa (a 6)):
Seja
X=[2;0;1]
X =
2
0
1
e
Y=[3;2;1]
Y =
3
2
1
Se eu fizer X*Y obtenho obviamente uma mensagem de erro:
Error using *
Inner matrix dimensions must agree.
Mas se usar a operação de transposição já posso multiplicar estes dois vectores:
X'
ans =
2 0 1
Z=X'*Y
Z =
7
Y'
ans =
3 2 1
Z=Y'*X
Z =
7
Z tem o valor 7 e é igual independentemente da ordem pela qual os vectores são multiplicados, desde que se multiplique o vector coluna transposto pelo vector coluna não transposto.
Existe um conjunto de regras importantes a fixar:
1) um vector linha e um vector coluna com a mesma dimensão podem ser multiplicados entre si;
2) quando multiplicamos um vector linha por um vector coluna obtemos um escalar;
3) quando multiplicamos um vector coluna por um vector linha obtemos uma matriz com as dimensões correspondentes às dos vectores multiplicados;
4) não podemos multiplicar dois vectores colunas entre si o mesmo, sendo verdade, para a multiplicação de dois vectores linha;
5) todavia, a multiplicação entre dois vectores linha ou coluna pode ser feita se usarmos a operação de transposição;
6) a multiplicação entre um vector coluna transposto e outro vector coluna (não transposto) é igual a um escalar. Esta multiplicação goza da propriedade comutativa, isto é, podemos multiplicar o segundo vector coluna transposto pelo primeiro vector coluna não transposto e o resultado será um escalar de valor igual ao anterior.
Vou colocar aqui um exemplo que ilustre a regar mais complexa (a 6)):
Seja
X=[2;0;1]
X =
2
0
1
e
Y=[3;2;1]
Y =
3
2
1
Se eu fizer X*Y obtenho obviamente uma mensagem de erro:
Error using *
Inner matrix dimensions must agree.
Mas se usar a operação de transposição já posso multiplicar estes dois vectores:
X'
ans =
2 0 1
Z=X'*Y
Z =
7
Y'
ans =
3 2 1
Z=Y'*X
Z =
7
Z tem o valor 7 e é igual independentemente da ordem pela qual os vectores são multiplicados, desde que se multiplique o vector coluna transposto pelo vector coluna não transposto.
OPERAÇÕES ELEMENTARES COM MATRIZES (1)
No Matlab define-se uma matriz (matrix no plural matrices) como sendo um conjunto de dados representado por números reais ou complexos que estão organizados numa grelha bidimensional (linhas por colunas). É usado o termo array como correspondendo a um vector (definido por números), uma matriz ou uma malha de dados com dimensões elevadas. Poderá dizer-se que o termo array é mais genérico, enquanto que o termo matrix é mais específico.
Vamos começar com o exemplo de uma matriz 3X3 (simétrica) obtida do conhecido triângulo de Pascal. Para isso, no Matlab basta fazer:
A=pascal(3)
A =
1 1 1
1 2 3
1 3 6
Podemos chamar também a nossa conhecida matriz mágica:
B=magic(3)
B =
8 1 6
3 5 7
4 9 2
Como regras fundamentais não devemos nunca esquecer que:
u=[3; 1; 4], representa um vector coluna, ou seja,
u =
3
1
4
v=[2 0 -1], representa um vector linha, ou seja,
v =
2 0 -1
e que s=7 representa um escalar.
Vamos agora somar duas matrizes (a pascal(3) e a magic(3)):
A=pascal(3);
B=magic(3);
X=A+B
X =
9 2 7
4 7 10
5 12 8
somou as matrizes elemento a elemento.
O mesmo se pode dizer com a subtracção:
Y=X-A
Y =
8 1 6
3 5 7
4 9 2
Para isto é indispensável ter matrizes com a mesma dimensão!
Podemos também somar um escalar com um vector (ou fazer uma subtracção):
s=7
s =
7
w=v+s (em que o v foi definido anteriormente v= 2 0 -1 )
w =
9 7 6
Podemos também usar o vector coluna u definido anteriormente:
h=u+s
h =
10
8
11
Vamos começar com o exemplo de uma matriz 3X3 (simétrica) obtida do conhecido triângulo de Pascal. Para isso, no Matlab basta fazer:
A=pascal(3)
A =
1 1 1
1 2 3
1 3 6
Podemos chamar também a nossa conhecida matriz mágica:
B=magic(3)
B =
8 1 6
3 5 7
4 9 2
Como regras fundamentais não devemos nunca esquecer que:
u=[3; 1; 4], representa um vector coluna, ou seja,
u =
3
1
4
v=[2 0 -1], representa um vector linha, ou seja,
v =
2 0 -1
e que s=7 representa um escalar.
Vamos agora somar duas matrizes (a pascal(3) e a magic(3)):
A=pascal(3);
B=magic(3);
X=A+B
X =
9 2 7
4 7 10
5 12 8
somou as matrizes elemento a elemento.
O mesmo se pode dizer com a subtracção:
Y=X-A
Y =
8 1 6
3 5 7
4 9 2
Para isto é indispensável ter matrizes com a mesma dimensão!
Podemos também somar um escalar com um vector (ou fazer uma subtracção):
s=7
s =
7
w=v+s (em que o v foi definido anteriormente v= 2 0 -1 )
w =
9 7 6
Podemos também usar o vector coluna u definido anteriormente:
h=u+s
h =
10
8
11
UMA SEMANA DE CHUVA, por Miguel Esteves Cardoso
Voltou a chover. Vai continuar a chover. Não se via tal escândalo desde o ano passado, por esta altura exacta do mês de Maio.
Mas a Banda da Sociedade Recreativa e Musical de Almoçageme respondeu com nobreza ao apelo e tocou A Miraculosa como se estivesse uma tarde de sol.
Tal como o ano passado, depois de um fim-de-semana de praia, anda toda a gente espantada, ainda de calções e havaianas, a perguntar-me se eu já sei que vem aí uma semana de chuva.
Também costuma ser esta a semana em que alguém não muito longe de mim começa a dizer que este ano não vai haver cerejas por causa desta chuva, não obstante haver sempre cerejas todos os anos.
Na segunda metade de Maio declara-se, no primeiro dia de calor que o calor "chegou". Este "chegou" é dito com tal veemência que dispensa acrescentar o "para sempre".
Quando o calor que chegou se vai embora toda a gente se sente traída. Não é assim que o calor se deveria comportar. Os passarinhos, as borboletas e as rosas reagem com naturalidade, para não dizer indiferença. E continuam. Nós não. Fomos interrompidos e ficamos fulos.
A única diferença foi que, no ano passado, choveu no
Domingo à noite, molhando a Procissão das Velas. Este ano não choveu e a
procissão seguiu com todo o esplendor.
Este ano a chuva esperou
pela Nossa Senhora de Fátima. O ano passado uma vizinha nossa teve de
ralhar com a Banda: "Então não tocam ao menos 'A Miraculosa' para a
Nossa Senhora não ir desgostosa para a igreja?"Mas a Banda da Sociedade Recreativa e Musical de Almoçageme respondeu com nobreza ao apelo e tocou A Miraculosa como se estivesse uma tarde de sol.
Tal como o ano passado, depois de um fim-de-semana de praia, anda toda a gente espantada, ainda de calções e havaianas, a perguntar-me se eu já sei que vem aí uma semana de chuva.
Também costuma ser esta a semana em que alguém não muito longe de mim começa a dizer que este ano não vai haver cerejas por causa desta chuva, não obstante haver sempre cerejas todos os anos.
Na segunda metade de Maio declara-se, no primeiro dia de calor que o calor "chegou". Este "chegou" é dito com tal veemência que dispensa acrescentar o "para sempre".
Quando o calor que chegou se vai embora toda a gente se sente traída. Não é assim que o calor se deveria comportar. Os passarinhos, as borboletas e as rosas reagem com naturalidade, para não dizer indiferença. E continuam. Nós não. Fomos interrompidos e ficamos fulos.
segunda-feira, 19 de maio de 2014
MATRIZES MULTIDIMENSIONAIS
Frequentemente são utilizados muitos conjuntos de dados que expressam a variação de um parâmetro físico ao longo do tempo. Vejamos o exemplo simples da variação da temperatura de uma sala aula ao longo do dia. Esta temperatura pode variar devido a vários factores, como a entrada e saída de alunos na sala ou até pelo simples facto da sala estar mais ou menos exposta à radiação solar ao longo do dia. Mas para já não nos vamos preocupar com as causas dessa variação. O que interessa aqui é o seguinte: Temos um espaço onde é medida essa temperatura que pode ser representada por uma grelha rectangular de pontos (espaço bidimensional). Adicionalmente, existe a variação da temperatura ao longo do tempo. Imaginemos então que a nossa malha de pontos de medição da temperatura é uma matriz 4x4 e que os valores inscritos nessa matriz correspondem aos valores da matriz mágica (instrução magic (4)). Imaginemos, ainda, que os valores medidos correspondem às permutações das colunas de uma matriz de 4x4, ou seja, utilizando a linguagem combinatória isso equivale a dizer que temos 4! de permutações (4!=4x3x2x1=24).
No editor do Matlab podemos escrever um programa simples que vai fazer estas permutas:
p=perms(1:4); % vai fazer a permutação das colunas de uma matriz (4x4), ou seja, são no total 4! de permutações (4!=4x3x2x1=24)
A=magic(4); % define a matriz mágica
M=zeros(4,4,24); % representa o novo conjunto de 24 matrizes (de 4x4) que resultam das 4! permutações
for k=1:24 % inicia um ciclo com as 24 permutações (de 1 a 24)
M(:,:,k)=A(:,p(k,:)); % são trocadas sucessivamente todas as colunas da matriz de 4x4 tal como figura na instrução p associada ao índice j da notação matricial
end % fim do ciclo
E os resultados são:
val(:,:,1) =
13 3 2 16
8 10 11 5
12 6 7 9
1 15 14 4
val(:,:,2) =
13 3 16 2
8 10 5 11
12 6 9 7
1 15 4 14
val(:,:,3) =
13 2 3 16
8 11 10 5
12 7 6 9
1 14 15 4
val(:,:,4) =
13 2 16 3
8 11 5 10
12 7 9 6
1 14 4 15
val(:,:,5) =
13 16 2 3
8 5 11 10
12 9 7 6
1 4 14 15
val(:,:,6) =
13 16 3 2
8 5 10 11
12 9 6 7
1 4 15 14
val(:,:,7) =
3 13 2 16
10 8 11 5
6 12 7 9
15 1 14 4
val(:,:,8) =
3 13 16 2
10 8 5 11
6 12 9 7
15 1 4 14
val(:,:,9) =
3 2 13 16
10 11 8 5
6 7 12 9
15 14 1 4
val(:,:,10) =
3 2 16 13
10 11 5 8
6 7 9 12
15 14 4 1
val(:,:,11) =
3 16 2 13
10 5 11 8
6 9 7 12
15 4 14 1
val(:,:,12) =
3 16 13 2
10 5 8 11
6 9 12 7
15 4 1 14
val(:,:,13) =
2 3 13 16
11 10 8 5
7 6 12 9
14 15 1 4
val(:,:,14) =
2 3 16 13
11 10 5 8
7 6 9 12
14 15 4 1
val(:,:,15) =
2 13 3 16
11 8 10 5
7 12 6 9
14 1 15 4
val(:,:,16) =
2 13 16 3
11 8 5 10
7 12 9 6
14 1 4 15
val(:,:,17) =
2 16 13 3
11 5 8 10
7 9 12 6
14 4 1 15
val(:,:,18) =
2 16 3 13
11 5 10 8
7 9 6 12
14 4 15 1
val(:,:,19) =
16 3 2 13
5 10 11 8
9 6 7 12
4 15 14 1
val(:,:,20) =
16 3 13 2
5 10 8 11
9 6 12 7
4 15 1 14
val(:,:,21) =
16 2 3 13
5 11 10 8
9 7 6 12
4 14 15 1
val(:,:,22) =
16 2 13 3
5 11 8 10
9 7 12 6
4 14 1 15
val(:,:,23) =
16 13 2 3
5 8 11 10
9 12 7 6
4 1 14 15
val(:,:,24) =
16 13 3 2
5 8 10 11
9 12 6 7
4 1 15 14
Ou seja, temos um conjunto de 24 matrizes que podiam representar a variação da temperatura de uma sala de aula, de hora a hora, em 24 horas e medida em 16 pontos diferentes (matriz 4x4).
No editor do Matlab podemos escrever um programa simples que vai fazer estas permutas:
p=perms(1:4); % vai fazer a permutação das colunas de uma matriz (4x4), ou seja, são no total 4! de permutações (4!=4x3x2x1=24)
A=magic(4); % define a matriz mágica
M=zeros(4,4,24); % representa o novo conjunto de 24 matrizes (de 4x4) que resultam das 4! permutações
for k=1:24 % inicia um ciclo com as 24 permutações (de 1 a 24)
M(:,:,k)=A(:,p(k,:)); % são trocadas sucessivamente todas as colunas da matriz de 4x4 tal como figura na instrução p associada ao índice j da notação matricial
end % fim do ciclo
E os resultados são:
val(:,:,1) =
13 3 2 16
8 10 11 5
12 6 7 9
1 15 14 4
val(:,:,2) =
13 3 16 2
8 10 5 11
12 6 9 7
1 15 4 14
val(:,:,3) =
13 2 3 16
8 11 10 5
12 7 6 9
1 14 15 4
val(:,:,4) =
13 2 16 3
8 11 5 10
12 7 9 6
1 14 4 15
val(:,:,5) =
13 16 2 3
8 5 11 10
12 9 7 6
1 4 14 15
val(:,:,6) =
13 16 3 2
8 5 10 11
12 9 6 7
1 4 15 14
val(:,:,7) =
3 13 2 16
10 8 11 5
6 12 7 9
15 1 14 4
val(:,:,8) =
3 13 16 2
10 8 5 11
6 12 9 7
15 1 4 14
val(:,:,9) =
3 2 13 16
10 11 8 5
6 7 12 9
15 14 1 4
val(:,:,10) =
3 2 16 13
10 11 5 8
6 7 9 12
15 14 4 1
val(:,:,11) =
3 16 2 13
10 5 11 8
6 9 7 12
15 4 14 1
val(:,:,12) =
3 16 13 2
10 5 8 11
6 9 12 7
15 4 1 14
val(:,:,13) =
2 3 13 16
11 10 8 5
7 6 12 9
14 15 1 4
val(:,:,14) =
2 3 16 13
11 10 5 8
7 6 9 12
14 15 4 1
val(:,:,15) =
2 13 3 16
11 8 10 5
7 12 6 9
14 1 15 4
val(:,:,16) =
2 13 16 3
11 8 5 10
7 12 9 6
14 1 4 15
val(:,:,17) =
2 16 13 3
11 5 8 10
7 9 12 6
14 4 1 15
val(:,:,18) =
2 16 3 13
11 5 10 8
7 9 6 12
14 4 15 1
val(:,:,19) =
16 3 2 13
5 10 11 8
9 6 7 12
4 15 14 1
val(:,:,20) =
16 3 13 2
5 10 8 11
9 6 12 7
4 15 1 14
val(:,:,21) =
16 2 3 13
5 11 10 8
9 7 6 12
4 14 15 1
val(:,:,22) =
16 2 13 3
5 11 8 10
9 7 12 6
4 14 1 15
val(:,:,23) =
16 13 2 3
5 8 11 10
9 12 7 6
4 1 14 15
val(:,:,24) =
16 13 3 2
5 8 10 11
9 12 6 7
4 1 15 14
Ou seja, temos um conjunto de 24 matrizes que podiam representar a variação da temperatura de uma sala de aula, de hora a hora, em 24 horas e medida em 16 pontos diferentes (matriz 4x4).
sexta-feira, 16 de maio de 2014
Dias quentes de Maio (16)
Hoje, dia 16 de Maio, o céu estava parcialmente nublado em Lisboa. Estamos a entrar no fim de um ciclo de dias quentes que é anunciado pelo desenvolvimento de uma baixa pressão em altitude, transportando ar húmido vindo do Atlântico. A pouco e pouco, o ar quente e seco vindo de leste, deixará de circular e a temperatura baixará com o aumento correspondente da humidade.
Por volta das 14 horas o céu de Lisboa estava assim:
Por volta das 14 horas o céu de Lisboa estava assim:
Observa-se a presença de algumas nuvens de desenvolvimento vertical (cúmulos-nimbos), como que anunciando a chegada de alguma chuva e trovoada (situação típica do mês de Maio).
A imagem de satélite correspondente mostra bem a formação destas nuvens que sobressaem bem na imagem captada por infravermelho:
Por sua vez, a situação sinóptica mostra bem a formação da baixa-pressão em altitude, sendo visível que à superfície ainda se mantinha a corrente geral de leste de ar seco e quente, oriundo do Norte de África e com circulação pelo interior da Península Ibérica - aquele ar com o cheiro típico das planícies da Meseta Ibérica meridional:
Todo o conjunto de altas pressões e respectivas cristas vai desaparecer nos próximos dias e o ar frio e húmido vai invadir toda a orla ocidental da Península Ibérica, com a chegada de uma baixa-pressão vinda de norte.
A operação "CONCATENATION"
É o processo que permite juntar pequenas matrizes para fazer umas maiores:
Temos a nossa matriz mágica inicial (4x4):
Simples e eficaz!
Temos a nossa matriz mágica inicial (4x4):
E agora vamos usar a operação "concatenation" cujo operador é designado por [ ]. Ora bem, a nossa matriz inicial 4x4 vai ser transformada numa de 8x8 fazendo uma conjunto de operações de soma algébrica, seguindo a instrução abaixo:
B=[A A+32; A+48 A+16] isto significa que a matriz inicial vai sofrer uma transformação em que numa primeira fase "cresce para a direita", isto é, as quatro colunas vão ser replicadas através da soma do valor 32 (A+32) - estamos a crescer somando a todas as colunas o valor 32. Na segunda fase uma operação idêntica é realizada mas no sentido das linhas e somando o valor 48 a todas as células respectivas. Neste caso estamos a fazer crescer a matriz "para baixo". Na terceira fase vamos somar a todas as células iniciais o valor 16 ocupando o espaço 4x4 na posição direita inferior (espaço que faltava para obtermos a matriz 8x8). E o resultado final é:
Os chamados "subscripts" no Matlab
Os "subsripts" são muito importantes para localizar as células de uma matriz de dados e, também, para se poder fazer operações matemáticas utilizando células específicas da nossa matriz.
É preciso ter em mente que a regra no Matlab para localizar um elemento (ou célula) de uma matriz é a seguinte: A(i,j) em que i simboliza a linha e j a coluna.
Assim, considerando a nossa matriz "magic square", qual será o número inscrito na posição A(4,2)?
Vamos recordar a matriz mágica A:
Assim, a matriz mágica pode ser considerada como um vector coluna de grande dimensão "one long column vector". A posição A (4,2) será então equivalente, na nova notação, a A (8) .
Podemos também acrescentar uma nova coluna seguindo qualquer uma das notações anteriormente descritas:
X=A
X (4,5) =17 de reparar que não existe a 5.ª coluna na nossa matriz mágica de 4x4, mas o Matlab cria esta coluna preenchendo com zeros todas as células que não correspondem às coordenadas (4,5) e colocando 17 nessa posição:
X(4,5)=17
X =
16 2 3 13 0
5 11 10 8 0
9 7 6 12 0
4 14 15 1 17
Se eu quiser usar a notação mais simples e quiser colocar o valor 18 em vez do 17 faço assim:
X(20)=18
X =
16 2 3 13 0
5 11 10 8 0
9 7 6 12 0
4 14 15 1 18
Tudo é muito simples neste mundo matemático matricial em ambiente Matlab!
Respeitando a regra acima descrita facilmente se deduz que a célula procurada se encontra na linha 4 e na coluna 2, ou seja, trata-se da célula que tem o valor 15.
E se quisermos somar todos os valores de uma coluna usando esta notação? Faz-se assim:
A(1,4) + A(2,4) + A (3,4) + A (4,4) = 34. Estamos aqui a somar todos os valores de uma coluna (a 4.ª) e como se trata de uma matriz mágica o valor 34 será sempre igual independentemente da linha, coluna ou diagonal que escolhermos!
Mas o Matlab está cheio de surpresas, e neste campo existe uma forma mais elegante de localizar células específicas usando uma notação muito mais simplificada. O Matlab considera que as células de uma matriz são ordenadas por números inteiros crescentes seguindo coluna a coluna, da esquerda para a direita, isto é:
1 | 5 | 9 |
2 | 6 | 10 |
3 | 7 | 11 |
4 | 8 | 12 |
Podemos também acrescentar uma nova coluna seguindo qualquer uma das notações anteriormente descritas:
X=A
X (4,5) =17 de reparar que não existe a 5.ª coluna na nossa matriz mágica de 4x4, mas o Matlab cria esta coluna preenchendo com zeros todas as células que não correspondem às coordenadas (4,5) e colocando 17 nessa posição:
X(4,5)=17
X =
16 2 3 13 0
5 11 10 8 0
9 7 6 12 0
4 14 15 1 17
Se eu quiser usar a notação mais simples e quiser colocar o valor 18 em vez do 17 faço assim:
X(20)=18
X =
16 2 3 13 0
5 11 10 8 0
9 7 6 12 0
4 14 15 1 18
Tudo é muito simples neste mundo matemático matricial em ambiente Matlab!
Operações com matrizes mágicas de grandes dimensões
O Matlab permite fazer este tipo de operações de uma forma muito simples. Apenas temos que usar a instrução "magic" e definir a dimensão da matriz.
Começamos por nomear a nossa matriz (A) e fazemos:
A=magic(1000) - esta é uma matriz mágica de 1000 linhas por 1000 colunas
E podemos fazer o mesmo tipo de cálculos para verificar o efeito mágico (igualdade nas somas das linhas, das colunas e das diagonais)
sum(A) - vai somar todas as colunas e o número que dá é igual a 500000500
sum(A')' - vai somar todas a colunas da matriz transporta o que equivale a dizer que soma todas as linhas da matriz inicial. O resultado é o mesmo: 500000500
quinta-feira, 15 de maio de 2014
A utilidade da representação das variações em escalas aritmética e logarítmica
Com o Matlab a visualização gráfica destas escalas é muito fácil desde que se apliquem os princípios simples desta linguagem.
O primeiro passo consiste na definição do intervalo de variação do nosso "vector coluna" que corresponderá à escala aritmética, isto é, antes da transformação logarítmica:
x=(0:0.1:4)';
Aqui escolhemos só valores positivos para evitar a indeterminação do logaritmo 0 e só vamos até ao valor 4. Como queremos uma matriz a uma coluna temos que usar a plica (').
Vamos transformar a matriz x utilizando o operador logaritmo de base 10:
logs=[x; (log10(x))]
Esta operação vai gerar uma matriz de 41 linhas por 2 colunas (uma com o passo aritmético e outra com o passo logarítmico) que não vamos aqui representar para isto não ficar com o aspecto de uma folha de cálculo.
Depois é só aplicar a função "plot" para obter o gráfico:
plot (x,logs)
E o resultado é:
De uma forma simples podemos facilmente ver como varia a transformação logarítmica em comparação com a variação de uma progressão aritmética de passo igual a 0.1.
Os matemáticos poderão mais facilmente explicar a aplicabilidade directa desta função nas mais variadas situações!
O primeiro passo consiste na definição do intervalo de variação do nosso "vector coluna" que corresponderá à escala aritmética, isto é, antes da transformação logarítmica:
x=(0:0.1:4)';
Aqui escolhemos só valores positivos para evitar a indeterminação do logaritmo 0 e só vamos até ao valor 4. Como queremos uma matriz a uma coluna temos que usar a plica (').
Vamos transformar a matriz x utilizando o operador logaritmo de base 10:
logs=[x; (log10(x))]
Esta operação vai gerar uma matriz de 41 linhas por 2 colunas (uma com o passo aritmético e outra com o passo logarítmico) que não vamos aqui representar para isto não ficar com o aspecto de uma folha de cálculo.
Depois é só aplicar a função "plot" para obter o gráfico:
plot (x,logs)
E o resultado é:
De uma forma simples podemos facilmente ver como varia a transformação logarítmica em comparação com a variação de uma progressão aritmética de passo igual a 0.1.
Os matemáticos poderão mais facilmente explicar a aplicabilidade directa desta função nas mais variadas situações!
Operações com potências em ambiente matricial
Nesta fase tudo se torna mais interessante porque começamos a trabalhar com matrizes que se transformam a partir de operações simples. Vamos usar a potência, isto é, em linguagem corrente "um número elevado a outro". Como se faz isto no Matlab?
Nada mais simples:
Comecemos por definir um vector coluna. Não devemos esquecer que por omissão o Matlab ordena tudo em linhas. Por exemplo de quisermos ter uma matriz de números inteiros definida entre 0 e 9 a forma de a obter é:
n=(0:9);
o que dá:
uma matriz de uma linha 0 1 2 3 4 5 6 7 8 9
mas o que queremos é uma coluna e então usamos o sinal ' para transpor a nossa matriz:
n=(0:9)';
0
1
2
3
4
5
6
7
8
9
Agora vamos "compor" esta matriz usando a potência como operador e vamos realizar duas operações para além da representação inicial da matriz n a 1 coluna, isto é, vamos obter como resultado final uma matriz de 3X9.
pows=[n n.^2 2.^n]
O sinal ^ significa "elevado a" e deve em Matlab ser sempre precedido de um ponto. O que nos está a indicar o operador "pows" é a transformação nossa matriz inicial n (só com uma coluna) numa outra, cujas colunas adicionais resultam da elevação de cada elemento ao quadrado (n.^2) e do cálculo do valor 2 elevado a cada elemento da matriz inicial (2.^n). O cálculo é feito linha a linha
Os resultados são então:
0 0 1
1 1 2
2 4 4
3 9 8
4 16 16
5 25 32
6 36 64
7 49 128
8 64 256
9 81 512
Com isto está aberto o caminho para se poder trabalhar com as transformações logarítmicas de grandes matrizes de dados reais com o intuito de resolver a grande questão do "constrangimento dos valores a 100 %". Será um assunto a ser abordado em breve. Para já ainda existem umas etapas a ultrapassar.
Nada mais simples:
Comecemos por definir um vector coluna. Não devemos esquecer que por omissão o Matlab ordena tudo em linhas. Por exemplo de quisermos ter uma matriz de números inteiros definida entre 0 e 9 a forma de a obter é:
n=(0:9);
o que dá:
uma matriz de uma linha 0 1 2 3 4 5 6 7 8 9
mas o que queremos é uma coluna e então usamos o sinal ' para transpor a nossa matriz:
n=(0:9)';
0
1
2
3
4
5
6
7
8
9
Agora vamos "compor" esta matriz usando a potência como operador e vamos realizar duas operações para além da representação inicial da matriz n a 1 coluna, isto é, vamos obter como resultado final uma matriz de 3X9.
pows=[n n.^2 2.^n]
O sinal ^ significa "elevado a" e deve em Matlab ser sempre precedido de um ponto. O que nos está a indicar o operador "pows" é a transformação nossa matriz inicial n (só com uma coluna) numa outra, cujas colunas adicionais resultam da elevação de cada elemento ao quadrado (n.^2) e do cálculo do valor 2 elevado a cada elemento da matriz inicial (2.^n). O cálculo é feito linha a linha
Os resultados são então:
0 0 1
1 1 2
2 4 4
3 9 8
4 16 16
5 25 32
6 36 64
7 49 128
8 64 256
9 81 512
Com isto está aberto o caminho para se poder trabalhar com as transformações logarítmicas de grandes matrizes de dados reais com o intuito de resolver a grande questão do "constrangimento dos valores a 100 %". Será um assunto a ser abordado em breve. Para já ainda existem umas etapas a ultrapassar.
A matriz de Dürer no MATLAB (a melancolia)
Usando como base uma matriz de números presente na obra de Albercht Dürer "Engraving Melencolia I" para praticar o trabalho com matrizes em ambiente Matlab.
A partir daqui podem fazer-se uma série de simples operações matemáticas tirando proveito do facto desta matriz de números ter uma propriedade muito interessante: a soma de qualquer linha, coluna ou diagonal é igual a 34. Talvez seja por isso que está representada numa obra de arte com o nome de melancolia. Até a soma dos números inscritos nas células dos cantos extremos é igual a 34.
Para representar esta matriz usando o Matlab a escrita dos números é muito simples:
A= [16 3 2 13; 5 10 11 8; 9 6 7 12; 4 15 14 1]
A matriz é designada por A e os valores são ordenados linha a linha (com um espaço entre cada número), sendo que as diferentes linhas são separadas por ponto e vírgula. O resultado é:
A =
16 3 2 13
5 10 11 8
9 6 7 12
4 15 14 1
16 3 2 13
5 10 11 8
9 6 7 12
4 15 14 1
Podemos somar cada uma das colunas usando a expressão "sum" e o resultado é:
>> sum(A)
ans =
34 34 34 34
ans =
34 34 34 34
Aqui já nos estamos a perceber a verdadeira melancolia destas operações.
E se quisermos somar as linhas? Neste caso podemos usar uma instrução simples com o objectivo de transpor a matriz A e depois efectuar a soma:
O operador A' transpõe a matriz A:
A'
ans =
16 5 9 4
3 10 6 15
2 11 7 14
13 8 12 1
ans =
16 5 9 4
3 10 6 15
2 11 7 14
13 8 12 1
sum (A')
ans =
34 34 34 34
ans =
34 34 34 34
E se somarmos segundo uma coluna, teremos que:
sum (A')'
ans =
34
34
34
34
ans =
34
34
34
34
Que melancolia, o número 34...
quarta-feira, 14 de maio de 2014
Meio de Maio
O Atlântico Norte está mais calmo. As tempestades desapareceram, o anticiclone dos Açores fortaleceu-se e os dias tornaram-se quentes e luminosos às latitudes mediterrânicas:
terça-feira, 13 de maio de 2014
Cálculo da média e da mediana utilizando ciclo "for-end" (MATLAB)
A partir de 5 séries de 50 números aleatórios podemos facilmente calcular a média e a mediana usando um ciclo "for-end". Para isso temos que perceber bem como funciona a estrutura simples deste "script" do Matlab. Nesta fase já devemos saber que tipo de instruções devemos colocar no interior/exterior do ciclo e dominar a conversão dos números para texto utilizando a ferramenta "num2str". Aqui vão as linhas de comando com os respectivos comentários:
nsamples=5; % número de amostras ou de iterações
npoints=50;
for k=1:nsamples % vai fazer os vários ciclos em número igual ao das amostras
iterationString=['iteration #',int2str(k)]; % coloca o número da iteração na expressão "iteration #"
disp(iterationString) % mostra cada iteração por ordem numérica
currentData=rand(npoints,1); % vai gerar uma matriz de 50 linhas e i coluna de números aleatórios
sampleMean(k)=mean(currentData); % calcula a média de cada amostra que contém 50 números aleatórios
sampleMedian(k)=median(currentData); % calcula a mediana de cada amostra que contém 50 números aleatórios
MeanText=['Mean is equal to ',num2str(sampleMean(k))]; % converte o valor numérico da média para texto
disp(MeanText)% mostra o valor da média
MedianText=['Median is equal to ',num2str(sampleMedian(k))]; % converte o valor numérico da mediana para texto
disp(MedianText) % mostra o valor da mediana
end % fim do ciclo
overallMean=mean(sampleMean);% calcula a média global das 5 amostras de 50 números aleatórios
overallMeanText=['overallMean is equal to ',num2str(mean(sampleMean))];
disp(overallMeanText)
Eis os resultados:
iteration #1
Mean is equal to 0.52468
Median is equal to 0.58347
iteration #2
Mean is equal to 0.46597
Median is equal to 0.45275
iteration #3
Mean is equal to 0.45805
Median is equal to 0.41388
iteration #4
Mean is equal to 0.54595
Median is equal to 0.56493
iteration #5
Mean is equal to 0.43422
Median is equal to 0.42936
overallMean is equal to 0.48577
nsamples=5; % número de amostras ou de iterações
npoints=50;
for k=1:nsamples % vai fazer os vários ciclos em número igual ao das amostras
iterationString=['iteration #',int2str(k)]; % coloca o número da iteração na expressão "iteration #"
disp(iterationString) % mostra cada iteração por ordem numérica
currentData=rand(npoints,1); % vai gerar uma matriz de 50 linhas e i coluna de números aleatórios
sampleMean(k)=mean(currentData); % calcula a média de cada amostra que contém 50 números aleatórios
sampleMedian(k)=median(currentData); % calcula a mediana de cada amostra que contém 50 números aleatórios
MeanText=['Mean is equal to ',num2str(sampleMean(k))]; % converte o valor numérico da média para texto
disp(MeanText)% mostra o valor da média
MedianText=['Median is equal to ',num2str(sampleMedian(k))]; % converte o valor numérico da mediana para texto
disp(MedianText) % mostra o valor da mediana
end % fim do ciclo
overallMean=mean(sampleMean);% calcula a média global das 5 amostras de 50 números aleatórios
overallMeanText=['overallMean is equal to ',num2str(mean(sampleMean))];
disp(overallMeanText)
Eis os resultados:
iteration #1
Mean is equal to 0.52468
Median is equal to 0.58347
iteration #2
Mean is equal to 0.46597
Median is equal to 0.45275
iteration #3
Mean is equal to 0.45805
Median is equal to 0.41388
iteration #4
Mean is equal to 0.54595
Median is equal to 0.56493
iteration #5
Mean is equal to 0.43422
Median is equal to 0.42936
overallMean is equal to 0.48577
E que tal representar as funções seno e co-seno juntas?
O desafio é fazer esta representação num gráfico tridimensional usando o comando "meshgrid". Para fazer isto teremos que usar o editor do Matlab, escrevendo um pequeno programa:
x=0:pi/1000:4*pi
[x,y]=meshgrid(-4:0.1:4)
z=sin(x)
surf(x,y,z)
hold on - o uso do "hold on" é fundamental pois suspende a operação anterior para se poder adicionar a nova função que neste caso será o co-seno.
z2=cos(x)
surf(x,y,z2)
xlabel('x')
ylabel('y')
zlabel('sin(x) cos(x)') o eixo z representa a variação conjunta das duas funções trignométricas
Eis o resultado:
x=0:pi/1000:4*pi
[x,y]=meshgrid(-4:0.1:4)
z=sin(x)
surf(x,y,z)
hold on - o uso do "hold on" é fundamental pois suspende a operação anterior para se poder adicionar a nova função que neste caso será o co-seno.
z2=cos(x)
surf(x,y,z2)
xlabel('x')
ylabel('y')
zlabel('sin(x) cos(x)') o eixo z representa a variação conjunta das duas funções trignométricas
Eis o resultado:
Subscrever:
Mensagens (Atom)