sexta-feira, 16 de maio de 2014

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:

MATLAB REVISITED (equação do 2.º grau num gráfico tridimensional X,Y,Z)

Como representar Z em função de (X,Y) em que Z resulta da multiplicação de X pelo quadrado de Y (uma equação do 2.ºgrau). No Matlab é muito simples: [X,Y]=meshgrid(-2:0.2:2); (a função mehsgrid faz a malha do gráfico bidimensional X-Y)
Z=X.*Y.^2; (corresponde à multiplicação de X pelo quadrado de Y estendida a todos os valores de X e de Y definidos na meshgrid)
surf (X,Y,Z) (projecta o gráfico tridimensional)
Vejamos o gráfico:

MATLAB_REVISITED

Matalab significa "MATrix LABoratory" Se eu quiser representar o comportamento de duas funções matemáticas muito usadas pelos sedimentólogos (na definição das escalas utilizadas para determinar a dimensão das partículas sedimentares) tenho que fazer o seguinte: A) Mostrar a curva correspondente à conversão dos valores expressos na escala phi (eixo das abcissas) para mm (eixo das ordenadas) Definir o intervalo da variável x (abcissa): x=-1:0.1:4 (intervalo da escala phi no domínio dimensional da areia) y=2.^(-x) (o operador .^ define a aplicação da função exponencial para todo o intervalo de x) plot(x,y) (instrução para fazer o gráfico):
B) Mostrar a operação inversa (de mm para phi) x=0.0001:0.1:8 (o limite inferir tem que ser superior a 0 para não dar uma indeterminação no cálculo do logaritmo) y2=-log2(x) plot(x,y2)