sexta-feira, 16 de maio de 2014

A operação "CONCATENATION"

É o processo que permite juntar pequenas matrizes para fazer umas maiores:

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 é:



Simples e eficaz!

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:


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

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!




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!



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.

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

Podemos somar cada uma das colunas usando a expressão "sum" e o resultado é:

>> sum(A)

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

 sum (A')

ans =

    34    34    34    34

E se somarmos segundo uma coluna, teremos que:

sum (A')'

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

O manto negro que nos cobre (Cidade Universitária de Lisboa, Junho 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

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:


segunda-feira, 12 de maio de 2014

E o co-seno?

x=0:pi/1000:2*pi
[x,y]=meshgrid(-4:0.1:4)
z=cos(x)
surf(x,y,z)
xlabel('x')
ylabel('y')
zlabel('cos(x)')


Matlab: como representar uma função trignométrica em modo tridimensional?

É um processo muito simples.
x=0:pi/1000:2*pi  (definição do intervalo de variação)
[x,y]=meshgrid(-4:0.1:4) (definição da malha bidimensional)
z=sin(x) (definição da função seno a ser projectada no eixo vertical)
surf(x,y,z) (instrução para fazer o gráfico tridimensional)
xlabel('x') (legenda do eixo x)
ylabel('y') (legenda do eixo y)
zlabel('sin(x)') (legenda do eixo z)

surf(x,y,z) (instrução para fazer o gráfico tridimensional)

Eis o resultado:


terça-feira, 6 de maio de 2014

O grande anticiclone subtropical dos Açores

Forte e ainda sem desenvolvimento da crista no sobre o Golfo da Biscaia. Sem a "conquista" deste golfo jamais o ar seco e quente chegará à costa ocidental da Ibéria...

MAIO DE 2014

Eis o mês mais desejado do ano!
O mês das flores, dos dias grandes, das papoilas, das nuvens brancas, dos ventos marítimos, dos ares secos do suão mediterrânico e africano... o solstício está aí!



  

terça-feira, 22 de abril de 2014

MATLAB REVISITED - O meu primeiro programa

Vou calcular a média de uma sucessão de 50 números aleatórios de uma distribuição uniforme (que varia entre 0 e 1).
 No Matlab é muito simples:
 % Gerar valores aleatórios de uma distribuição uniforme calculando a média desses dados
n = 50; % número de dados (50)
r = rand(n,1); % rand é a expressão random (aleatório) e são porjectados 50 valores numa coluna plot(r) % graficar os valores aleatórios gerados pela função rand
% desenho da linha da média
 m = mean(r); % cálculo da média
 hold on % ordem para reter o gráfico que está em uso
(plot(r)) plot([0,n],[m,m]) % novo gráfico que vai mostrar a linha da média de (O,m) até (n,m)
hold off % volta ao estado anterior e o Matlab vai apagar o antigo gráfico e constrói um novo com os eixos rearranjados
title('Mean of Random Uniform Data') % título do gráfico
Save plotrand % instrução para gravar o programa que poderá ser carregado usando o comando "load"

Eis o resultado: