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!
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:
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)')
[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:
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í!
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:
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:
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)
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)
Subscrever:
Mensagens (Atom)



_surf.jpg)
_surf.jpg)

.jpg)


