Você está na página 1de 30

Curso de Matlab e suas Aplicaes em Oceanografia

1. Introduo: Este curso direcionado para quem nunca utilizou o Matlab. As aulas so baseadas nas aplicaes do Matlab para atuao na rea de Oceanografia. O Matlab tanto uma linguagem de programao quanto um ambiente de computao tcnica que possibilita a anlise e visualizao de dados, clculos matemticos e desenvolvimento de algoritmos, entre outras aplicaes. Sua primeira verso foi escrita no final da dcada de 70 nas Universidades do Novo Mxico e Stanford visando fornecer suporte a cursos de teoria matricial, lgebra linear e anlise numrica. Hoje o Matlab encontra-se na verso 7.0. 2. Janelas: No MS-windows basta clicar no cone e abre-se a interface grfica do usurio (GUI). No Linux, digite Matlab na linha de comando e surte o mesmo efeito. Para sair via menu, clique em File-->Exit Matlab, ou digite exit na janela de comando. Trabalhar com a GUI absolutamente dispensvel, o essencial apenas a janela de comandos. No Linux, para se livrar da GUI inicie o Matlab assim: Matlab no desktop. A GUI tem vrias sub-janelas, cinco neste exemplo. Se a sua no est assim, tente clicar em View->Desktop Layout-->Five Panel Comandos de movimentao entre diretrios, comuns aos usurios de DOS e shell (UNIX - LINUX), como dir, ls e cd diretrio podem ser usados normalmente no prompt do Matlab. Outros comandos do ambiente DOS (ex.: del, md, rd, zip, etc) e LINUX (ex.: remove, mkdir, gzip, etc) podem ser utilizados de dentro do Matlab desde que prescritos do smbolo de interrogao (!). Assim, se estamos trabalhando no ambiente Windows e queremos criar um diretrio: >> !md teste E criamos o diretrio teste. No ambiente Linux >> !mkdir teste E o diretrio teste estar criado. A Figura abaixo mostra as janelas disponveis no ambiente Matlab Windows 7.0. A janela "Launch Pad" uma srie de "links" para os manuais e demonstraes do Matlab; "Command History" mostra os ltimos comandos digitados; "Workspace" mostra o uso da memria; "Current Directory" mostra o contedo do diretrio atual e por fim a mais importante, "Command Window" onde entramos com os comandos.

por Carlos Teixeira

1/1

Curso de Matlab e suas Aplicaes em Oceanografia

3. O Comando Help O comando help o comando mais til e mais usado dentro do Matlab, o mesmo prov informao para a grande parte dos tpicos do Matlab. Existem muitos comandos dentro do ambiente Matlab e saber todas algo impossvel. Com o tempo criamos uma listagem, na nossa memria, dos comandos mais freqentes e para saber como utiliz-los usamos o comando help. O comando sem nenhum argumento mostra uma lista de diretrios que contm arquivos relacionados com Matlab. Cada linha mostrada lista o nome de um diretrio seguido por uma descrio do contedo do mesmo. Alguns diretrios so associados com os comandos bsicos do Matlab. Outros contm toolboxes, tais como control e signal; esses possuem funes adicionais do Matlab cobrindo reas de aplicaes mais especializadas. Para uma lista de funes relacionadas a um determinado diretrio, digita-se help seguido pelo nome do mesmo. Aparece uma lista de comandos, funes e smbolos especficos do Matlab. O comando help seguido por estes comandos ou funes fornece informaes sobre como utiliz-los em uma linha de comando. >> help O comando help mean o mesmo fornece uma descrio detalhada de como funciona o comando, nos d um exemplo de sua utilizao e outros comandos relacionados a mean. >> help mean MEAN Average or mean value. For vectors, MEAN(X) is the mean value of the elements in X. For matrices, MEAN(X) is a row vector containing the mean value of each column. For N-D arrays, MEAN(X) is the mean value of the elements along the first non-singleton dimension of X. MEAN(X,DIM) takes the mean along the dimension DIM of X.
por Carlos Teixeira 2/2

Curso de Matlab e suas Aplicaes em Oceanografia

Example: If X = [0 1 2; 3 4 5] then mean(X,1) is [1.5 2.5 3.5] and mean(X,2) is [1 4] See also median, std, min, max, cov. Quando no sabemos o nome de um comando podemos usar o comando lookfor seguido do que se est procurando. Assim se queremos descobrir o comando que encontra os mnimos de um vetor: >>lookfor minimum O Matlab provavelmente ir nos dar como resposta uma srie de comandos que tenham a palavra minimum no seu help. Cabe a ns descobrir qual o comando. 4. Nmeros, Caracteres: O Matlab foi criado para operar com matrizes. Um nmero uma matriz de uma linha e uma coluna. Um vetor uma matriz de uma linha e vrias colunas. Estas matrizes podem conter nmeros inteiros, reais, binrios, caracteres, etc. Podemos criar matrizes separando as colunas com espaos ou vrgulas e separando as linhas com ponto-e-vrgula: >> x=[1 0.14] x= 1.00 >>y=[1,3.14]; O resultado de comandos terminados em ponto-e-vrgula no mostrado. Isto muito til quando estamos trabalhando com matrizes muito grandes. O comando whos descreve as variveis da memria e nos d algumas informaes sobre esta varivel. >> whos Name y Size 1x2 Bytes 16 Class double array 0.14

Limpamos a varivel da memria com o comando clear seguido do nome da varivel (clear x no exemplo abaixo). Se digitarmos o comando clear sem o nome de nenhuma varivel ou seguido do comando all o mesmo limpa todas as variveis presentes na memria do computador. >>clear x >> clear all

por Carlos Teixeira

3/3

Curso de Matlab e suas Aplicaes em Oceanografia

H vrios tipos de nmeros no ambiente Matlab. No exemplo abaixo a varivel num contm um nmero (3.1415) e serve para fazermos contas. A varivel nome contm os seis caracteres 3.1415 que no servem para fazermos contas. Isto o que chamamos de string. Um string criado colocando-se letras ou nmeros entre aspas simples (' '). De forma similar meunome contm quinze caracteres que evidentemente no servem para fazermos contas. >> num=3.1415; >> nome='3.1415'; >> meunome=Carlos Teixeira'; >> whos Name nome num meunome Size 1x6 1x1 1x15 Bytes 12 8 30 Class char array double array char array

Uma varivel (no caso z) pode ter o resultado de uma operao (x+y). Definidas as variveis possvel ento efetuar operaes matemticas com elas. As operaes bsicas so listadas na tabela abaixo: >> x=1; y=2; >>z=x+y; Operao Smbolo

adio subtrao multiplicao Diviso Potenciao

a+b a-b a*b a/b a^b

Algumas regras devem ser obedecidas na definio de variveis: as variveis so sensveis a caracteres maisculos e minsculos; devem conter no mximo 31 caracteres; os nomes devem comear com letras e caracteres acentuados no so permitidos. Alguns exemplos de nomes para variveis so: total_anual2000, media25, MEDIA25, X1251330. Note que, segundo as regras acima, o segundo e o terceiro exemplo referem-se a variveis diferentes. Algumas variveis j so pr-definidas, como pi (), i e j (nmero imaginrio ou raiz de -1), realmin e realmax (menor e maior nmero real utilizvel pelo Matlab, especificamente). Outra forma de se construir vetor especificando-se valores iniciais, finais e incrementos. No exemplo abaixo foi definido um vetor a variando de 1 a 5 (de um em um) e outro b indo de 1 a 9, mas de dois em dois.

por Carlos Teixeira

4/4

Curso de Matlab e suas Aplicaes em Oceanografia

>> a=1:5, b=1:2:9 a= 12345 b= 13579 O comando linspace(i,f,n) fornece um vetor linha de n elementos entres os valores i e f. Assim, o vetor a do exemplo anterior pode ser redefinido da seguinte forma: >> a=linspace(1,5,5) a= 12345 O tamanho de um vetor pode ser verificado com o comando length, como no exemplo abaixo: >>length(b) ans= 5 5. Operaes aritmticas: Ao fazermos operaes matemticas e lgicas devemos sempre atentar para o fato que estamos lidando com matrizes. Se definirmos as variveis a e b como tendo apenas um elemento, qualquer uma das operaes acima no gera problemas. Assim se quisermos podemos usar o Matlab como uma simples calculadora. >>a=1,b=2; c=a+b; c=a*b, J no caso de vetores alguns cuidados devem ser tomados. Vejamos: >> a=[1 2 3] a= b= 2 3 4 >> c=a+b ??? Error using ==> + Matrix dimensions must agree. >> b=[2 3 4] b= 2 c= 3 3 5 4 7 >> c=a+b No primeiro caso criamos as matrizes a e b com trs elementos cada, mas a 1x3 (uma linha e trs colunas) e b 3x1 (trs linhas uma coluna). O comando que criou a tem espaos (ou pode ter vrgulas) onde b tem pontos-e-vrgulas. Como soma de matrizes funciona elemento a elemento, o Matlab reclama. Na segunda tentativa a e b forma criadas do mesmo modo, as duas so 1x3 e tudo funciona como de forma correta. >> a=[1 2 3] a= 1 2 3 >> b=[2; 3; 4]
por Carlos Teixeira 5/5

>> b=[2; 3; 4]

Curso de Matlab e suas Aplicaes em Oceanografia

b= 2 3 4 >> c=a*b c = 20 >> d=a.*b ??? Error using ==> .* Matrix dimensions must agree. >> b=[2 3 4] b= d= 2 2 3 6 4 12 >> d=a.*b Como no exemplo anterior criamos as matrizes a e b com trs elementos cada, uma em p e a outra deitada. A multiplicao das matrizes * resulta em 20 (que pode se visto como uma multiplicao de matrizes), pois 1x2 + 2x3 + 3x4 =20. No caso seguinte colocamos um ponto antes do asterisco.* indicando para o Matlab que queremos fazer um produto escalar, ou seja, multiplicar elemento por elemento. No d certo porque as matrizes so de tamanhos diferentes. Recriando b no mesmo formato de a e fazendo o produto escalar obtemos d com o mesmo tamanho de a e b. Uma operao escalar entre matrizes possui a forma: A./B = [a1/b1 a2/b2 ... an/bn]; A.*B = [a1b1 a2b2 ... anbn]; A.^B = [a1^b1 a2^b2 ... an^bn]; No caso anterior no precisaramos reescrever b para transform-lo de um vetor 3 x 1 (no caso de b=[2; 3; 4]) para um vetor 1 x 3 (no caso b=[2 3 4]), basta utilizar um apstrofe aps a varivel e teremos a transposta da mesma. A transposta de uma matriz transforma matrizes-linha em matrizes-coluna e vice-versa. Assim: >> b=[2; 3; 4] b= 2 3 4 >> b ' ans = 234 Operaes matemticas simples (adio, subtrao, diviso, envolvendo escalares e matrizes seguem a mesma interpretao natural. >> m=[8 1 6;3 5 7;4 9 2]; >> 3*m ans = 24 3 18 9 15 21 12 27 6 >>m+100
por Carlos Teixeira 6/6

multiplicao)

Curso de Matlab e suas Aplicaes em Oceanografia

ans =

108 101 106 103 105 107 104 109 102

J a potenciao de cada elemento uma operao escalar. Assim, se queremos elevar cada um dos elementos da matriz m ao quadrado teremos? >>m . ^2 ans = 64.00 9.00 16.00 6. Matrizes Como vimos nos exemplos acima Matrizes so definidas no Matlab de forma anloga definio dos vetores linhas ou colunas: usam-se vrgulas ou espaos para separar os elementos de uma linha e pontos-e-vrgulas para separar as linhas: >> m=[8 1 6;3 5 7;4 9 2] m= 816 357 492 Os elementos, linhas e colunas de uma matriz podem ser acessados usando-se ndices, que definem a posio do elemento dentro da matriz. Este processo chama-se indexao e tem como objetivo, localizar elementos dentro de uma matriz. o processo mais importante dentro do Matlab e o mesmo utilizado nas principais operaes. Assim, o elemento da segunda linha na terceira coluna da matriz m pode ser acessado da seguinte maneira: >> m(2,3) ans = 7 E o elemento da terceira linha primeira coluna da seguinte maneira: >> m(3,1) ans = 4 Para a seleo de linhas ou colunas inteiras usa-se o operador dois pontos (:). O comando m(:,2) significa todas as linhas da coluna 2; m(3,:) retorna a linha 3, com todos os seus elementos. >>m(:,2) ans = 1.00 5.00 9.00 >> m(3,:) ans = 4.00 9.00 2.00
7/7

1.00 25.00 81.00

36.00 49.00 4.00

por Carlos Teixeira

Curso de Matlab e suas Aplicaes em Oceanografia

partir da matriz m possvel definir outra matriz : >> n=m(1:2,2:3) n= 16 57 No exemplo acima o operador dois pontos foi usado duas vezes: uma para delimitar o intervalo de linhas desejado (da linha 1 a 2) e outra para especificar o intervalo de colunas (da coluna 2 a 3). Quando necessrio remover alguma linha ou coluna de uma matriz atribui-se a esta linha ou coluna a matriz nula [ ]. Dessa forma a matriz remanescente ser composta apenas das linhas (ou colunas) remanescentes: >> m(:,3)=[] m= 81 35 49 No exemplo acima foi atribuda coluna 3 a matriz nula, resultando numa nova matriz m. possvel tambm montar grandes matrizes atravs de outras pequenas, como: >> a=[1 1;1 1];b=[2 2;2 2];c=[a b;b a] c= 1122 1122 2211 2211 O comando find encontra os ndices da matriz de valores lgicos, o mesmo muito utilizado para encontrar valores que obedecem a uma condio. Abaixo encontram-se alguns operadores lgicos que normalmente so usados com o comando find.

< <= > >= == ~= isnan ~isnan

menor que menor ou igual que maior que maior ou igual que igual diferente Valor que so Nan Valores que no so nan

por Carlos Teixeira

8/8

Curso de Matlab e suas Aplicaes em Oceanografia

A operao abaixo encontra os ndices da matriz m que obedecem a condio nan. O valor a = 5 corresponde ao quinto elemento da matriz m. Da mesma forma se desejamos obter o ndice da linha e da coluna a construo do comando deve seguir a forma [lin,col]=find.... >>m=[-1 2 70; 5 nan -10; 50 1 2]; >>a=find(isnan(m)) a= 5.00 >>[lin,col]=find(m==1) lin = 3.00 col = 2.00 Se desejarmos saber quais os elementos da matriz so maiores do que dez. >>a=find(m>=10) a= 3.00 7.00 O ndice a pode ser usado para substituir dados valores. Assim se queremos substituir todos os valores negativos da matriz m pelo valor zero. >> a=find(m<0) a= 1.00 8.00 >> m(a)=0 m= 0 5.00 50.00 2.00 NaN 1.00 70.00 0 2

O valor nan, significa not a numeric number usado quando no se tem um valor de um determinado elemento de uma matriz. o que conhecemos com um espao vazio em planilhas eletrnicas. Os operadores & e | correspondem aos operadores lgicos e, ou. Assim se queremos obter os valores maiores que zero e iguais a -10. >>m=[-1 2 70; 5 nan -10; 50 1 2]; >>a=find (m>0 | isnan(m))

por Carlos Teixeira

9/9

Curso de Matlab e suas Aplicaes em Oceanografia

a= 2.00 3.00 4.00 5.00 6.00 7.00 9.00 7. Funes matemticas e trigonomtricas: Abaixo so listadas algumas funes matemticas e trigonomtricas elementares que podem ser usadas tanto com vetores quanto matrizes. importante notar que o Matlab no trabalha com ngulos e sim radianos. Assim se possumos um valor em graus devemos dividir o mesmo por 180 e multiplicar por pi para obter os valores em radianos. O valor de pi j uma varivel do Matlab sendo carregada quando se inicia o programa. >> sin(90/180*pi) ans = 1.00 >> asin(1)*180/pi ans = 90.00

por Carlos Teixeira

10/10

Curso de Matlab e suas Aplicaes em Oceanografia

Algumas dessas operaes podem ser aplicadas a vetores ou matrizes. Para a funo de desvio padro std(x), por exemplo, se o argumento x for um vetor o resultado ser o desvio padro desse vetor. Se x for uma matriz, ser calculado o desvio para cada coluna dessa matriz. O mesmo ocorre com as funes sum, max e mean, entre outras. >> x=1:10 x= Columns 1 through 8 1.00 9.00 >> std(x) ans = 3.03 >> >> b=magic(3) b= 8.00 3.00 4.00 >>mean(b) ans = 5.00 5.00 5.00 1.00 5.00 9.00 6.00 7.00 2.00 2.00 10.00 3.00 4.00 5.00 6.00 7.00 8.00 Columns 9 through 10

O Matlab tem uma srie de matrizes especiais pr-fabricadas (ones, zeros, magic, etc), uma delas se chama magic e foi usada acima para se criar a matriz b. O comando magic cria uma matriz quadrtica (no caso acima 3 x 3) onde todas as linhas e colunas possuem a mesma soma. Vamos ver: Esta a soma de todas as colunas. >>sum(b) ans = 15.00 15.00 15.00

Se fizermos a transposta, temos a soma de todas as linhas. >>sum(b) ans = 15.00 15.00 15.00

por Carlos Teixeira

11/11

Curso de Matlab e suas Aplicaes em Oceanografia

8. Controle de Fluxo num Programa O controle de fluxo num programa escrito no Matlab bem similar quele usado em outras linguagens de programao. Ele faz com que uma srie de comandos seja executada repetidas vezes. Para isso utiliza-se o comando for. Devemos ter em mente que o Matlab um programa que trabalha com matrizes e vetores. A vetorizao de operaes no Matlab torna a execuo dos clculos muito mais rpida. Vamos ver dois exemplos para o calculo de n: A primeira utiliza loops com o comando for:

>> for n=1:10 >>x(n)=sin(n*pi/10); >>end O que estiver entre o for n=1:10 e o end ser repetido tantas vezes quantos forem os elementos de n, sendo que em cada passada do loop n assume um valor. Na segunda o calculo de x foi vetorizado e obtemos os mesmo valores s que de forma muito mais rpida.

>>n=1:10; >>x=sin(n*pi/10); Existe tambm outra forma de condicionar a execuo de alguns comandos. Isso pode ser feito com o comando while: >> EPS=1; >> while (1+EPS)>1 >>EPS=EPS/2; >>end Enquanto a soma (1+EPS) for maior do que 1 o comando EPS=EPS/2 executado. Quando isso deixar de ser verdadeiro o ciclo termina. Esse programa s possvel porque quando EPS chega a 10-16 ele sai do limite de preciso finita do Matlab e ento considerado zero. Por fim, pode-se usar a estrutura if-else-end, que apresenta a seguinte forma: >> if expresso >>comandos executados se expresso for Verdadeira >>else >>comandos executados se Falso >>end

por Carlos Teixeira

12/12

Curso de Matlab e suas Aplicaes em Oceanografia

9. Escrevendo programas no Matlab Seqncias de comandos podem ser armazenadas em arquivos e executadas no espao de trabalho do Matlab. Para isso basta criar um arquivo com os comandos do Matlab em qualquer editor de texto e salvar o arquivo com a extenso "m". Os comandos digitados no prompt do Matlab podem ser guardados num arquivo, assim no precisamos reescrever tudo da prxima vez! Estes arquivos m sero seus programas no Matlab. recomendvel que sempre se inclua comentrios, de preferncia um ou mais por linha de programa. Depois de alguns dias um programa sem comentrios uma sopa de letrinhas que ningum - nem mesmo o programador - entende. Este hbito facilita a leitura e entendimento dos programas por voc e quem mais for ler e usar seu programa. Para comentar uma linha coloca-se o smbolo de porcentagem (%) no comeo da mesma. O Matlab tem um editor de programas que possui algumas funes especiais que podem nos ajudar. Vamos escrever o programa abaixo no editor do Matlab. % Este programa e parte do curso de Matlab % % Escrito em xx/xx/2005 por Carlos Teixeira em Salvador for i=1:0.5:20, % Monta um loop de 1 a 20 de 0.5 em 0.5 if mod(i,2), % Se i for impar b(i)=i/10; % o i-esimo b sera um decimo de i else % se for par, b(i)=i*10; % o i-esimo b sera o decuplo de i end % fecha o if end % fecha o for b % mostra o valor de b Salvamos o nosso programa com um nome qualquer (ex.: prog1.m). Existem duas formas de executar o programa abaixo: copiando e colando o programa no prompt do Matlab; escrevendo o nome do programa no prompt do Matlab (no caso prog1)

>>prog1 Note que todas as vezes que voc modificar algo no programa, deve-se salvar o mesmo antes de se executar. 10. Finalizando e Salvando o Espao de Trabalho Para finalizar o Matlab digite quit ou exit. Terminando uma sesso do Matlab, voc apaga as variveis do espao de trabalho. Antes de terminar, pode-se salvar as variveis digitando save >> save Este comando salva todas as variveis em um arquivo em disco chamado Matlab.mat. Na prxima vez que Matlab chamado, pode-se executar o comando load para restaurar o espao de trabalho com as variveis de Matlab.mat.

por Carlos Teixeira

13/13

Curso de Matlab e suas Aplicaes em Oceanografia

Podem ser utilizados os comandos save e load em arquivos com outros nomes, ou salvar somente algumas variveis. O comando save temp salva todas as variveis em um arquivo de nome temp.mat. O comando >> save temp X salva somente a varivel X, enquanto que >> save temp X Y Z salva as variveis X, Y e Z. 11. Importando dados: O comando usado para carregar um arquivo contendo dados o load nome_do_arquivo. Esse comando utilizado para dados no formato ASCII. Assim se quisermos ler o arquivo salvo na seo acima: >> load temp Da mesma forma se quisermos ler apenas uma das variveis dentro do arquivo: >> load temp Z Um comando muito usado no ambiente Windows o xlsread. O mesmo importa dados diretamente de uma planilha excell. Para tanto devemos usar o comando xlsread seguido do caminho e nome do arquivo e da planilha que se pretende ler. O comando abaixo vai ler a planilha teste1 do arquivo meu_excell, salvo no diretrio c:\Matlab\work\. NUMERIC = xlsread('c:\Matlab\work\meu_excell','teste1') 12. Formatos de Sada O Matlab mostra o resultado de uma linha de comando na tela, e atribui este resultado a uma varivel especfica, ou a ans se a varivel no dada. Voc pode utilizar o comando format para controlar o formato numrico mostrado. Se todos os elementos de uma matriz forem inteiros exatos, a matriz mostrada em um formato sem pontos decimais. Se ao menos um elemento de uma matriz no um inteiro exato, vrios formatos de sada so possveis. O formato padro, chamado de short format, mostra aproximadamente cinco dgitos decimais significativos. Os outros formatos mostram mais dgitos significativos ou utilizam notao decimal. Como um exemplo, suponha: >> x = [4/3 1.2345e-6] Os formatos e as sadas resultantes para este vetor so: format short 1.3333 0.0000 format short e 1.3333e+00 1.2345e-06 format long 1.33333333333333 0.00000123456000 format long e 1.333333333333333e+00 1.234500000000000e-06 format bank 1.33 0.00

por Carlos Teixeira

14/14

Curso de Matlab e suas Aplicaes em Oceanografia

13. Plotando dados no Matlab A grande vantagem de linguagens do tipo Matlab a facilidade de visualizao dos dados. A seguir vamos utilizar exemplos prticos de Oceanografia para demonstrar inicialmente grficos do tipo "xy" e depois contornos, imagens e vetores. Plotando Sries Temporais: Nesta seo iremos apresentar como proceder para a criao de sries temporais. O arquivo dados.mat possui dados de correntometria, salinidade e temperatura de um fundeio realizado na entrada de um esturio. Estes dados foram coletados a cada meia hora em setembro de 1999. Inicialmente carregamos os dados com o comando load o mesmo cria a matriz dados de 191 x 10. >> load dados.mat;%lendo os dados A seguir foram criadas variveis auxiliares para facilitar a plotagem dos dados. Assim os dias de amostragem que estavam na segunda coluna da varivel dados foram atribudos da varivel dia, os meses a varivel mes e assim sucessivamente at a varivel dircor. Percebe-se que varivel ano foi somado o valor de 1900, isto foi necessrio pois os dados originais tinham o formato 99 e no 1999. A varivel hora foi criada com o comando fix dos valores da coluna 5. O comando fix nos d o valor a esquerda da vrgula e foi necessrio, pois nos dados originais estes valores tinham o formato 1.30, 2.30, isto alm da hora os minutos da medio tambm eram informados. >>dia=dados(:,2); %dias em que foram feitas as medies >>mes=dados(:,3); %mes em que foram feitas as medies >>ano=dados(:,4)+1900; %anos em que foram feitas as medies >>hora=fix(dados(:,5)); %horas em que foram feitas as medies >>min=dados(:,11); %min em que foram feitas as medies >>seg(1:191,1)=0; %segundos em que foram feitas as medies >>temp=dados(:,6); %temperatura >>sal=dados(:,8); %salinidade >>dircor=dados(:,9); %direo da corrente >>velcor=dados(:,10); %itensidade (vetor) da corrente Os dados de corrente foram decompostos nas componentes u e v usando-se o seno (sin) e cosseno (cos)da direo e intensidade das correntes. Percebe-se que os dados originais estavam em graus e, portanto foram convertidos em radianos multiplicando-se por pi e dividindo-se por 180. >>u=velcor.*(cos(dircmat*pi/180)); %cria a varivel u nossa velocidade zonal. >>v=velcor.*(sin(dircmat*pi/180)); %cria a varivel v nossa velocidade meridional.

por Carlos Teixeira

15/15

Curso de Matlab e suas Aplicaes em Oceanografia

Foi criada uma varivel tempo atravs do comando julian. O comando julian transforma datas de nosso calendrio (Calendrio Gregoriano) em datas decimais (Calendrio Juliano). Por conveno o dia Juliano 2440000 comea s 0 horas, do dia 23 de Maio do ano de 1968. O comando utiliza a varivel ano, ms, dia, hora, minuto e segundo e cria a varivel tempo. >>tempo=julian([ano mes dia hora min seg]); %cria dia juliano Se desejamos transformar um dia juliano no formato do nosso calendrio usamos o comando gregorian. Assim: >>gregorian(tempo(1)) ans = 1999.00 8.00 3.00 19.00 0 0 Representa o nosso primeiro dia de medio, enquanto: >>gregorian(tempo(end)) ans = 1999.00 8.00 7.00 18.00 0 0 Representa o ltimo dia de medio. Os comandos julian e gregorian no fazem parte do Matlab eles fazem parte um pacote de rotinas disponvel no site SEAMAT http://woodshole.er.usgs.gov/operations/sea-mat/. Este site possui uma srie de rotinas com aplicaes em oceanografia que sero utilizadas ao longo do curso. Esse conjunto de rotinas deve ser salvo dentro do seu diretrio \Matlab\toolbox\. Sugiro que se crie um sub-diretrio com o nome oceanografia e que se salvem estes pacotes de rotina dentro do mesmo. Aps isso temos que informar o Matlab sobre estas sub-rotinas. Para tanto no menu superior click em file/setpath/ addfolder. Informe a localizao do diretrio e click em ok e save. Para todos os conjuntos de rotinas que adicionamos devemos de informar a localizao das mesmas para o Matlab, adicionando o caminho no path. A seguir sero criadas sries temporais de salinidade e temperatura. Para tanto, inicialmente usamos o comando figure para abrir uma nova figura. A seguir usamos o comando plot com a varivel tempo (eixo x) e a varivel sal (eixo y). >>figure >>plot(tempo,sal) O comando ylabel acrescenta um rotulo ao eixo y enquanto o comando xlabel um rotulo para o eixo x. >>ylabel('Salinidade'); %rotulo do eixo y >>xlabel('tempo') %rotulo do eixo x O comando gregaxd transforma os valores julianos que esto plotados no eixo x em dias gregorianos. Para isso temos que informar qual a nossa varivel que possui os valores julianos (no caso a varivel tempo) e o espaamento entre os rtulos que sero escritos no eixo x (no caso dois dias). Existem tambm as rotinas gregaxh, gregaxm, gregaxy que rotulam o eixo x em horas, meses e anos respectivamente.

por Carlos Teixeira

16/16

Curso de Matlab e suas Aplicaes em Oceanografia

>>gregaxd(tempo, 2)%Transforma os dias Julianos do eixo X em dias Gregorianos No exemplo a seguir vamos criar uma srie temporal de temperatura e plotar a temperatura mdia no mesmo grfico. Da mesma forma que o exemplo anterior, abrimos uma nova figura com o comando figure, plotamos a varivel tempo e temp com o comando plot, rotulamos os eixos y e x com os comandos ylabel e xlabel e finalmente transformamos o valor juliano do eixo x em horas julinas atravs do comando gregaxh e um espaamento de 18 horas. >>figure %abre nova figura >>plot(tempo,temp) %plota temperature ao longo do tempo >>ylabel('Temperatura') %rotula eixo y >>xlabel('tempo') %rotula eixo x >>gregaxh(tempo, 18) %transforma dia juliano em hora gregoriana O comando hold on serve para se plotar uma curva sobre outra que j esta plotada. Quando plotamos algo no Matlab e no utilizamos o comando figure para abrir uma nova figura o Matlab cria uma nova figura sobre a antiga, eliminando a ltima. Assim quando queremos adicionar um grfico a outro j existente usamos o comando hold on. >>hold on A seguir, plotamos a mdia da temperatura, para tanto usamos o comando plot do mean(mdia) da varivel temp (temperatura). O argumento 'r aps no final do comando plot refere-se a cor da linha. Neste caso escolhemos a cor vermelha. >>plot(tempo, mean(temp),'r') Alm da cor podemos especificar o tipo de linha e o tipo de marcador usado na plotagem conforme tabela abaixo.

Smbolo y m c r g b w k

Cor amarelo magenta cian vermelho verde azul branco preto

Smbolo . o x + * : -. --

Estilo de Linha ponto crculo x sinal positivo asterisco slida pontilhada trao e ponto tracejada

por Carlos Teixeira

17/17

Curso de Matlab e suas Aplicaes em Oceanografia

Por exemplo, >>plot(X,Y,k*) - plota um asterisco azul em cada ponto de dado. >>plot(X,Y,g:) - plota uma linha verde pontilhada. No exemplo abaixo plotaremos os dados de temperatura e salinidade num mesmo grfico, s que usando eixos com escalas diferentes. Para isso usamos o comando plotyy da varivel tempo e temp e da varivel tempo e sal. Uma forma de se alterar as propriedades dos objetos referenciando este objeto depois de sua criao e utilizar tais referencias para comandos posteriores. Pode-se fazer isto utilizando um handle que retornando pela funo de criao. No exemplo abaixo guardamos as propriedades da plotagem dos eixos usados na plotagem e das duas linhas nos handle eixos linha1 e linha2. >> [eixos linha1 linha2]=plotyy(tempo,temp,tempo,sal); temperatura e salinidade >>xlabel('Tempo') %colocando um rotulo no eixo x Aqui usamos o comando axes e a varivel eixos para colocar cada um dos eixos ativos. A varivel eixos(1) possui as propriedades do eixo 1 e a varivel eixos(2) as propriedades do eixo 2. O comando axes coloca um eixo ativo. Aps colocarmos o eixo 1 (onde esto plotadas as temperaturas) ativo damos um nome a ele com o comando ylabel. Tambm transformamos os valores julianos em dias gregorianos com o comando gregaxd. O mesmo procedimento repetido s que agora para o eixo 2 (onde esto plotadas as salinidades). >>axes(eixos(1)) %colocando o eixo 1 ativo >>ylabel('Temperatura') %colocando um rotulo no eixo 1 >>gregaxd(tempo,1) %transformando os valores julianos do eixo 1 em dias gregorianos. >>axes(eixos(2)) %colocando o eixo 2 ativo >>ylabel('Salinidade') %colocando um rotulo no eixo 2 >>gregaxd(tempo,1) %transformando os valores julianos do eixo 2 em dias gregorianos. As duas plotagens podem ser combinadas numa s usando-se o comando subplot. Atravs deste comando podem ser mostrados vrios grficos em uma mesma janela ou imprimi-los em uma mesma folha de papel. Iremos utilizar tal comando para fazer um subplot dos grficos de temperatura e salinidade versus tempo e do vetor corrente. O comando subplot(m,n,p) divide a janela em uma matriz m (na vertical) por n (na horizontal) de sub-regies e seleciona a p-sima sub-regio para o grfico que est sendo plotado no momento. Os grficos so numerados comeando pela primeira linha na parte superior da janela; em seguida, a segunda linha, e assim segue. Assim: Abrimos uma nova figura com o comando figure e fazemos uma subplot dividindo a janela de plotagem em duas sub-janelas na vertical e selecionando a primeira. O comando plotyy repetido como no exemplo acima. %plotando serie temporal de

>>title('Temperatura e Salinidade X Tempo')%colocando um titulo no grafico

por Carlos Teixeira

18/18

Curso de Matlab e suas Aplicaes em Oceanografia

>>figure %abre uma nova janela >>subplot(2,1,1) %divide a janela em duas sub-janelas na vertical e seleciona a primeira delas >> [eixos linha1 linha2]=plotyy(tempo,temp,tempo,sal); temperatura e salinidade >>xlabel('Tempo') %colocando um rotulo no eixo x >>axes(eixos(1)) %colocando o eixo 1 ativo >>ylabel('Temperatura') %colocando um rotulo no eixo 1 >>gregaxd(tempo,1) %transformando os valores julianos do eixo 1 em dias gregorianos. >>axes(eixos(2)) %colocando o eixo 2 ativo >>ylabel('Salinidade') %colocando um rotulo no eixo 2 >>gregaxd(tempo,1) %transformando os valores julianos do eixo 2 em dias gregorianos. Agora com o comando subplot, novamente a janela dividida em duas sub-janelas na vertical e a segunda janela selecionada. O comando feather utiliza as componentes u e v para criar vetores de velocidade. >>subplot(2,1,2) %divide a janela em duas sub-janelas na vertical e seleciona a segunda delas >>feather(u,v);%utiliza as componetes u e v para plotar o vetor >>title('Vetor Velocidade da Corrente ');%colocando titulo >>xlabel('tempo'); %rotulando eixo x Uma forma de se alterar as propriedades dos objetos utilizando os comandos get e set. O comando get captura as propriedades de um objeto e o comando set altera tais propriedades. Se usarmos o comando get(gca) vamos obter todas as propriedades do eixo ativo. No exemplo abaixo iremos mudar os limites de plotagem atravs do comando set. As propriedades que esto sendo mudadas so os limites vertical (ylim) e horizontal (xlim) do grfico e seus respectivos valores so respectivamente -15 a 15 e -10 a 200. Para saber quais as propriedades que podem ser mudadas e quais as opes para tal propriedade utilize o comando set(gca). >>set(gca,'ylim',[-15 15], 'xlim',[-10 200]); Como se pode perceber no exemplo acima a funo feather no plota uma srie temporal de vetores, apenas a distribuio dos mesmos. Uma forma de plotar series temporais de vetores velocidade usando o comando timeplt. Este comando pertence ao pacote de rotinas de mesmo nome disponvel na pagina do Seamat http://woodshole.er.usgs.gov/operations/sea-mat/. Antes de plotar o vetor com o comando timeplt, devemos de construir uma outra varivel formada pela componente u e a componente v multiplicada pelo nmero imaginrio i. >>w=u+i*v; %aqui criamos um vetor formado pela parte real e imaginaria da velocidade. Agora usamos o comando timeplt para plotar a varivel w na posio 1 e definimos seus rtulos e limites. Para definir os limites do eixo x, usamos o comando min e max para achar os mnimos e mximos valores do eixo x e somamos dois para melhorar a aparncia do grfico. %plotando serie temporal de

>>title('Temperatura e Salinidade X Tempo')%colocando um titulo no grafico

por Carlos Teixeira

19/19

Curso de Matlab e suas Aplicaes em Oceanografia

>>figure %abrindo nova figura >>[t]=timeplt(tempo,[w],[1]);%usando timeplt para plotar os vetores na posio 1 >>ylabel('Velocidade');%colocando rtulos no eixo y >>set(gca, 'XLim', [min(tempo)-2 max(tempo)+2])%definindo os limites do eixo x O comando timeplt tambm pode ser usado como uma alternativa para o comando subplot quando estamos trabalhando com sries temporais. Assim: >>figure %abrindo nova figura >> [t]=timeplt(tempo,[temp,sal,velcor,w],[1 2 3 4]); %plotando os dados de temperatura, salinidade e intensidade da corrente e vetor velocidade nas posies 1 a 4 respectivamente >>axes(t(1));%colocado eixo 1 ativo >>ylabel('Temperatura');%colocando rtulos no eixo y >>set(gca, 'XLim', [min(tempo)-2 max(tempo)+2])%definindo os limites do eixo x >>axes(t(2));%colocado eixo 2 ativo >>ylabel('Salinidade');%colocando rtulos no eixo y >>set(gca, 'XLim', [min(tempo)-2 max(tempo)+2])%definindo os limites do eixo x >>axes(t(3));%colocado eixo 3 ativo >>ylabel('Intensidade');%colocando rtulos no eixo y >>set(gca, 'XLim', [min(tempo)-2 max(tempo)+2])%definindo os limites do eixo x >>axes(t(4));%colocado eixo 4 ativo >>ylabel('Vetor');%colocando rtulos no eixo y >>set(gca, 'XLim', [min(tempo)-2 max(tempo)+2])%definindo os limites do eixo x Plotando Diagramas Propriedade versus Profundidade: Nesta seo iremos demonstrar a criao de diagramas propriedade versus profundidade e do diagrama TS. Para tanto sero usados dados de CTD coletados na plataforma continental prxima a cidade de Rio Grande. O arquivo ctd3152.cnv possui os dados de presso, temperatura e salinidade para esta estao. Primeiramente o arquivo de dados carregado atravs do comando load ctd3152.cnv o que cria a varivel ctd3152. Para facilitar a plotagem so criadas as variveis press, temp e sal com os dados das colunas de 1 a 3 da varivel ctd3152, respectivamente. >>load ctd3152.cnv %lendo os dados >>press=ctd3152(:,1); %criando a varivel presso a partir a coluna um >>temp=ctd3152(:,2);%criando a varivel temperatura a partir a coluna dois >>sal=ctd3152(:,3);%criando a varivel salinidade a partir a coluna trs Com as variveis criadas, plotamos os dados de temperatura versus presso atravs do comando plot(temp,press). O titulo e os rotulos dos eixos so colocados com os comandos title, xlabel e ylabel.
por Carlos Teixeira 20/20

Curso de Matlab e suas Aplicaes em Oceanografia

>>plot(temp,press) %plotando temperatura versus presso >>title('Temperatura versus Profundidade')%colocando titulo no grfico >>xlabel('Temperatura (C)')%colocando rotulo no eixo x >>ylabel('Profundidade (m)')%colocando rotulo no exo y Atravs do comando set colocamos a propriedade Xgrid (linhas de grade na direo X) ativa. Com o mesmo comando set colocamos a propriedade Ydir na direo reversa, isto o eixo est direcionado para baixo. Este procedimento foi necessrio, pois o campo de presso cresce com a profundidade. >>set (gca,'Xgrid','on') %colocando o grid em X ativo >>set (gca,'Ydir','reverse') %colocando direo do eixo y como inversa Agora vamos plotar um grfico da distribuio da densidade ao longo da profundidade. Como no possumos o valor da densidade, temos que calcular a mesma. Para isso iremos usar os dados de temperatura, salinidade e presso e a funo sw_pden. Esta funo faz parte do pacote SEAWATER disponvel no site Seamat. Este pacote possui funes para calcular uma srie de propriedades da gua do mar. Para se ver uma lista das funes contidas neste pacote use o comando help sw_contents No exemplo abaixo calculamos a densidade potencial, com o comando sw_pden atravs das variveis sal, temp e press e como nvel de referencia a profundidade 0. O mesmo procedimento usado acima foi usado para se criar o grfico densidade versus presso. >>dens=sw_pden(sal,temp,press,[0]);%calculando a densidade potencial atravs da rotina sw_pden >>figure%abrindo nova figura >>plot(dens,press) %plotando densidade versus presso >>title('Densidade versus Profundidade') %colocando titulo >>xlabel('Densidade')%colocando rotulo no eixo x >>ylabel('Profundidade (m)')%colocando rotulo no eixo y >>set (gca,'Xgrid','on')%colocando o grid em X ativo >>set (gca,'Ydir','reverse')%colocando direo do eixo y como inversa Agora iremos criar um diagrama TS simples. Para tanto basta plotar a nossa varivel sal em funo da varivel temp usando a funo plot e como argumento o tipo de marcador *. Aps esta etapa colocamos o titulo e rotulos dos eixos. O comando grid torna visvel as linhas de grade nas direes x e y. >>figure %abrindo nova figura >>plot(sal,temp,'*') %pltando salinidade versus temperatura com marcadores * >>title('Diagrama TS')%colocando titulo no grafico >>xlabel('Salinidade')%colocando rotulo no eixo x >>ylabel('Temperatura')%colocando rotulo no eixo y >>grid No prximo exemplo ser criado o mesmo diagrama TS, porm sero includos contornos de densidade e seus respectivos valores.

por Carlos Teixeira

21/21

Curso de Matlab e suas Aplicaes em Oceanografia

Para criarmos contornos de densidade o primeiro passo calcular as densidades. Para isso iremos usar uma varivel auxiliar de temperatura e salinidade, com valores extremos um pouco maiores que nossos valores medidos. Assim nossa varivel T vai possuir os valores de temperatura onde, o menor valor vai ser o mnimo (min(temp)) de temperatura medido menos um e o mximo medido (max(temp)) mais um. Como espaamento entre os valores de temperatura usamos dois graus. A varivel auxiliar de salinidade foi criada da mesmo forma s que espaada de 0.25. >>T = (min(temp)-1:2:max(temp)+1); %criando varivel auxiliar de temperatura >>S = (min(sal)-0.5:0.25:max(sal)+0.5);%criando varivel auxiliar de salinidade A seguir criamos matrizes (Grz e GrT)de salinidade e temperatura atravs do comando meshgrid das variveis S e T. O comando meshgrid transforma o domnio especificado pelos dois vetores, S e T, em matrizes, (Grz e GrT),.consistindo de linhas e colunas repetidas. Isto necessrio para se criar uma superfcie de densidade. >>[GrS,GrT] = meshgrid(S,T); %criando matriz de salinidades e temperaturas Agora vamos criar nossa matriz de densidades (dens). Para tanto iremos usar a funo sw_dens0 e as matrizes Grz e GrT. O comando sw_dens0 calcula a densidade ao nvel do mar e apenas precisamos entrar com os dados de salinidade e temperatura. >>dens = (sw_dens0(GrS,GrT)) - 1000;%calculando as densidades das matrizes de salinidade e temperatura Aps isto, abrirmos uma nova figura, usamos o comando contur para plotar as linhas de contorno de densidade. Voc pode mapear dados atravs do comando contur para isto necessita-se de uma posio x e y e de um valor para a coordenada (x,y). No exemplo abaixo nossa coordenada x so os dados de salinidade e a coordenada y os dados de temperatura. Escolhemos plotar as linhas de densidade de um valor de 17 a 31 com um intervalo de 0.4. O comando hold on foi usado para se inserir os rtulos das linhas de densidade atravs do comando clabel. Percebe-se que o comando clabel utiliza as informaes criadas pelo comando contour e salvas na varivel c. No exemplo abaixo inserimos um rotulo nas linhas entre 21 e 31 com um intervalo de 1. >>figure; %abrindo nova figura >>c = contour(GrS,GrT,dens,17:0.4:31);%criando linhas de contorno de densidade >>hold on; %segurando o grafco >>clabel(c,20:1:31); %colocando os rotulos nas linhas de densidade Definimos os eixos como tendo o mesmo fator de escala na horizontal e na vertical. Para isso usamos o comando axis e o atributo square. A seguir nomeamos o grfico e plotamos os dados de temperatura e salinidade como pontos. Finalmente inserimos os rtulos nos eixos do grfico. >>axis('square'); %setando a dimenso dos eixos como quadrada >>title('DIAGRAMA TS'); %colocando titulo no grafico
por Carlos Teixeira 22/22

Curso de Matlab e suas Aplicaes em Oceanografia

>>plot(sal,temp,'.'); %plotando os dados de salinidade e teperatura >>xlabel('Salinidade'); %colocando rotulo do eixo x >>ylabel('Temperatura em C'); %colocando rotulo do eixo y Agora iremos plotar o mesmo grfico, porm ao invs de linhas de contorno utilizaremos padres. Para isso usamos o comando conturf, ele funciona da mesma forma que o contur, s que agora definimos o nmero de padres como 20. Os rtulos de cada linha sero inseridos de forma manual, para tanto basta clicar sobre o grfico perto de cada linha que se quer rotular. Quando terminamos de rotular o grfico apertamos a tecla enter e o programa prossegue. >>figure(10); %abrindo nova figura >>c = contourf(GrS,GrT,dens,20);%criando padres de contorno de densidade >>hold on; %segurando o grafco >>clabel(c,'manual'); %colocando os rotulos no grafico de forma manual >>colorbar %inserindo uma barra de cores >>axis('square'); %setando a dimenso dos eixos como quadrada >>title('DIAGRAMA TS'); %colocando titulo no grafico >>plot(sal,temp,'+'); %plotando os dados de salinidade e teperatura >>xlabel('Salinidade'); %colocando rotulo do eixo x >>ylabel('Temperatura em C'); %colocando rotulo do eixo y

Criando seces verticais: Nesta seo iremos apresentar a criao de seces verticais de uma propriedade, isto como esta propriedade varia ao longo da profundidade e de uma distncia. Para tanto sero utilizados dados de temperatura, salinidade e presso provenientes de um cruzeiro realizado na regio equatorial. Estes dados esto guardados em sete arquivos com o nome w2cpz0xx, onde xx representa o nmero da estao e no caso varia de 35 a 41. Inicialmente iremos ler o contedo dos arquivos. Muitas vezes iremos deparar com dados que esto distribudos em vrios arquivos. Podemos simplesmente dar um load seguido do nome de cada arquivo, mas devemos convir de que isso seria algo muito trabalhoso em se tratando de vrios arquivos. Assim no exemplo abaixo criamos um string com o nome de cada arquivo e atravs de um loop carregamos cada um individualmente. Assim fazemos um loop (atravs do comando for) variando de 35 (nome do primeiro arquivi) a 41 (nome do ltimo arquivo). Criamos a varivel nome1 que vai ser igual a w2cpz035.pro quando j=35, w2cpz036.pro quando j=36 e assim sucessivamente. Percebe-se que usamos o comando num2str para transformar j (um nmero) em um string. >>for j = 35:41, %criamos um loop para ler os arquivos de 35 a 41. >>nome1 = ['w2cpz0',num2str(j),'.pro']; %aqui estamos criando um string com o nome dos arquivos

por Carlos Teixeira

23/23

Curso de Matlab e suas Aplicaes em Oceanografia

Agora usamos o comando load, do arquivo descrito na varivel nome1, para criar a varivel entrada. A varivel entrada possui em sua primeira linha informaes sobre a posio da estao e a partir da segunda linha as informaes de temperatura, salinidade e presso a cada metro. Esta varivel vai possui diferentes valores para cada passo do loop. >>entrada = load (nome1); %aqui estamos lendo os dados dos arquivos e criando a varivel entrada. A seguir criaremos a varivel temperatura, presso e salinidade, usando os dados da varivel entrada entre a linha 2 e a linha 1502 de dez em dez. Isto significa que usamos os valores da profundidade 0 a 1500 m a cada dez metros. Cada coluna das variveis temperatura, presso e salinidade vai possuir as informaes relativas a uma estao. No passo j=35 (estao 35) as informaes so guardadas na coluna 1, pois j-34 igual a 1. No passo j=36 na coluna 2 (j-34=2) e assim sucessivamente at chegarmos coluna 7 (j-34=7) onde estaro guardadas as informaes da estao 41. >>temperatura(:,(j-34)) = entrada(2:10:1502,3); %estamos criando uma matriz de temperatura sendo que cada arquivo de entrada esta guardado em uma coluna >>salinidade(:,(j-34)) = entrada(2:10:1502,5);%estamos criando uma matriz de salinida sendo que cada arquivo de entrada esta guardado em uma coluna >>pressao(:,(j-34)) = entrada(2:10:1502,2);%estamos criando uma matriz de presso sendo que cada arquivo de entrada esta guardado em uma coluna As informaes de latitude e longitude (posio) de cada estao sero guardadas nas variveis lat e lon. A seguir limpamos a varivel entrada (j que a mesma foi usada apenas como auxiliar na leitura dos dados) e fichamos o loop. >>lat((j-34)) = entrada(1,5); %guardamos os dados de latitude >>lon((j-34)) = entrada(1,6); %guardamos os dados de longitude >> clear entrada;% limpamos a varivel entrada >>end %final do loop Para criar uma seco vertical precisamos de uma profundidade e uma distancia horizontal. A profundidade vai ser igual a um vetor de 0 a 1500 espaados de dez em dez. E a distancia horizontal vai ser dada pela posio das estaes. Assim partindo da estao 35 (nossa primeira estao), temos que saber a distancia cumulativa at a cada uma estao. Para tanto convertemos os valores de latitude e longitude de dois pontos em distancia em quilmetros, atravs do comando sw_dist. O comando sw_dist nos d a distancia entre dois pontos de latitude e longitude. A seguir usamos o comando cumsum para saber a distncia acumulada em relao ao primeiro ponto. >>prof = 0:10:1500; %criando uma variavel profundidade >>distancia(1) = 0; %criando o primeiro valor da variavel distancia >>distancia(2:7) = sw_dist(lat,lon,'km'); %calculando as distancias entra as estaoes e guardando na variavel distancia >>distancia = cumsum(distancia)); %calculando a distancia acumulada entre cada estaao e invertendo os valores
por Carlos Teixeira 24/24

Curso de Matlab e suas Aplicaes em Oceanografia

Agora vamos criar os grficos com as seces. Para tanto abrimos uma nova figura com o comando figure e fazemos um contorno (comando contourf) de padres dos dados de temperatura ao longo de uma profundidade e de uma distncia. Escolhemos como intervalo de ploategem 2 a 30 C com um espaamento de 0.5. O comando colormap serve para escolher e alterar o mapa de cores usado na plotagem. Existe uma srie de outros mapas de cores prdefinidos, para uma listagem do mesmo use help graph3d. A barra de valores foi criada com o comando colorbar e a seguir rotulamos as linhas de plotagem (comando clabel) entre 0 e trinta com um espaamento de 2 graus. Finalmente se acrescentam os rtulos dos eixos e um ttulo ao grfico. >>figure(1); %criando nova figura >>c=contourf(distancia,-prof,temperatura,2:0.5:30); %fazendo um contorno de padres do valoes de temperatura >>colormap('jet');%definindo o mapa de cores como jet >>colorbar; %criando a barra lateral de valores >>clabel(c,0:2:30); %rotulando as linhas >>xlabel('Distncia em km'); %colocando rotulo no eixo x >>ylabel('Profundidade em m');%colocando rotulo no eixo y >>title('Secao da Temperatura Zonal'); %colocando titulo no grfico O mesmo procedimento usado s que agora para criar uma seco de salinidade. >>figure(2); %criando nova figura >>c=contourf(distancia,-prof,salinidade,20); >>colormap('cool'); %definindo o mapa de cores >>colorbar; %criando barra lateral >>clabel(c,33:1:37); %rotulando linhas >>xlabel('Distncia em km');%colocando rotulo no eixo x >>ylabel('Profundidade em m');%colocando rotulo no eixo y >>title('Secao da Salinidade Zonal');%colocando titulo no grfico Criando mapas e plotando informaes espaciais: Esta seco ensina a criar mapas e plotar informaes nestes mapas. Para tanto vamos usar o pacote m_map. Este pacote de rotinas permite criar mapas em dezoito tipos de projeo, plotar a linha de costa e a batimetria local. Exemplos do tipo de utilizao do pacote podem ser encontrados em http://www2.ocgy.ubc.ca/~rich/#M_Map. O pacote vem com dados de baixa resoluo tanto para batimetria como para linha de costa, porm outros arquivos de dados podem ser inseridos melhorando a resoluo dos dados. Abaixo criaremos um mapa da costa brasileira, com alguns contornos batimtricos. Sero usados os dados default de linha de costa e batimetria.

por Carlos Teixeira

25/25

Curso de Matlab e suas Aplicaes em Oceanografia

Aps abrirmos uma nova figura, definimos o tipo de projeo (no caso mercator) e os limites de latitude e longitude. Para isso usamos o comando m_proj. Utilize o comando m_proj('get') para ter uma lista das projees disponveis. A seguir usamos o comando m_cost para criar a linha de costa. O atributo patch controla a cor do preenchimento do continente, no caso o valor [.7 .7 .7] resulta em uma cor cinza. J o atributo edgecolor controla a cor da linha de costa, no caso escolhemos a cor azul. O comando m_grid cria as linhas de grade do mapa. >>figure(1)%abrindo uma nova figura >>m_proj( 'mercator','lon<gitude>', [-58 -30],'lat<itude>',[-42 -5]) %definindo a projeo e os limites de lat e long >>m_coast('patch',[.7 .7 .7],'edgecolor','b'); %criando a linha de costa >>m_grid %criando um grid Agora plotamos os contornos batimtricos com o comando m_elev, com o atributo contour (que produz linhas) e a lista das profundidades que queremos plotar, no caso 100, 200, 500, 1000 e 3000 m. As informaes do comando m_elev so guardadas nas variveis a e b que sero usadas no comando clabel para criar os rtulos das linhas plotadas. Inserimos o titulo do grfico normalmente com o comando title. Percebe-se, que nos dois ltimos comandos, escolhemos o tamanho da fonte diretamente atravs do atributo fontsize. >> [a,b]=m_elev('contour',[-100 -200 -500 -1000 -3000],'b');%fazendo os contornos de batimetria >>clabel(a,b,'fontsize',8) %rotulando os contornos de batimetria >>title('\bf Mapa de batimetria','fontsize',12);%inserindo um titulo O comando m_text, abaixo, serve para se plotar um texto numa determinada posio definida por uma longitude e uma latitude. No string criado, usamos um \bf (bold face) e \otime antes do texto com o nome das localidades. Estes dois comentrios criam a fonte em negrito e um smbolo circular, respectivamente. So comandos usados na linguagem Ltex, a qual normalmente interpretada pelo Matlab. Alm do string entramos com o atributo fontsize para definir o tamanho da fonte e com o atributo HorizontalAlignment para definir o alinhamento horizontal (no caso escolhido como esquerda). >>m_text(-49.5,-28.6,'\bf \otimes Cabo de Sta Marta','fontsize',8, 'HorizontalAlignment', 'left'); %colocando texto no mapa >>m_text(-52.5,-32,'\bf \otimes Rio Grande','fontsize',8,'HorizontalAlignment', 'left'); %colocando texto no mapa >>m_text(-53.5,-33.5,'\bf \otimes Arroio Chui','fontsize',8,'HorizontalAlignment', 'left'); %colocando texto no mapa >>m_text(-38.5,-13, '\bf \otimes Salvador','fontsize',8,'HorizontalAlignment', 'left'); %colocando texto no mapa >>m_text(-39, -14, '\bf \otimes Camamu','fontsize',8,'HorizontalAlignment', 'left'); %colocando texto no mapa

por Carlos Teixeira

26/26

Curso de Matlab e suas Aplicaes em Oceanografia

No exemplo a seguir vamos ler, analisar e plotar dados de temperatura da superfcie do mar (TSM) para Sudoeste do Atlntico. Estes dados so provenientes do site http://podaac.jpl.nasa.gov/ que disponibiliza uma srie de produtos de satlite. Os arquivos originais so imagens dirias de TSM, do tipo Pathfinder como uma resoluo espacial de 9 Km x 9 Km. Estes arquivos esto no formato hdf e so referentes aos primeiros sete dias do ano de 1991. Uma outra forma de ler vrios arquivos no Matlab sem ter que digitar o nome de cada um deles usar a estrutura criada pelo comando dir. O comando dir resulta uma varivel na forma de estrutura que contm o nome, data de modificao e tamanho do arquivo. Para tanto temos de informar o diretrio e parte do nome dos arquivos que estamos procurando atravs de um string. Assim primeiramente criamos a varivel dir_label com o string e a seguir usamos o comando dir. O comando vai retornar as caractersticas de todos os arquivos contidos no diretrio D:\users\teixeira\pessoal\curso_matlab\ que comeam com 19910 e terminam com .hdf. A seguir definimos quantos arquivos existem no diretrio atravs do comando length e guardamos este nmero na varivel n_image. O comando length nos retorna o comprimento de em vetor. >>dir_label='D:\users\teixeira\pessoal\curso_matlab\19910*.hdf'; % criando string com o diretorio das imagens >>file_names = dir(dir_label); %string com o nome dos arquivos de cada imagem >>n_image = length(file_names);%definindo o numero de imagens que temos para se fazer o lao Agora criamos um lao para ler todos os arquivos do diretrio. Agora carregamos os dados atravs do comando imread, seguido do nome do arquivo (que retornado atravs do comando getfield da varivel file_names e do campo name) e do tipo de imagem (no caso hdf). Antes do comando imread usamos o comando double que transforma os dados do formato uint8 para o formato double. Esta linha de comando faz diversas operaes de uma s vez. Recuperamos o nome dos arquivos, carregamos o mesmo e mudamos o seu formato. Poderamos fazer cada uma destas operaes separadamente, mas isto levaria mais tempo e consumiria mais memria fsica. Assim sempre que possvel devemos tentar juntar diversos comandos em apenas uma linha de comando. Neste exemplo criamos uma matriz tri-dimensional, onde as duas primeiras dimenses correspondem ao espao e a terceira dimenso corresponde ao tempo. Cada i do nosso loop corresponde a um dos sete dias de imagens. Assim nossa matriz data1 vai ter um formato 273 x 273 x 7, ou seja, 273 informaes de TSM na horizontal (longitude), 273 na vertical (latitude) e 7 na terceira dimenso (tempo ou dias). Devemos pensar nesta matriz como sete mapas empilhados onde cada nvel corresponde a um dia. Aps a leitura dos dados mostramos o valor da varivel i, isto uma estratgia para saber em que passo do loop estamos. O loop fechado com o comando end. >>for i=1:n_image %fazendo um lao da se ler da primeira a ultima imagem >>data1(:,:,i) = double(imread(getfield(file_names(i),'name'),'hdf')); %criando arquivo com os dados de TSM >>i %indice para saber qual imagem esta sendo lida. >>end; %final do lao

por Carlos Teixeira

27/27

Curso de Matlab e suas Aplicaes em Oceanografia

O maior problema quando estamos trabalhando com imagens de TSM provenientes de satlite a cobertura de nuvens. O sensor no consegue ler atravs das nuvens e gera gaps nas mesmas. Estes gaps recebem uma mascara (um valor) pelo algoritmo de processamento das imagens. No nosso caso esta mascara possui o valor zero e devemos substituir este valor por um nan. Para isto primeiro devemos identificar a posio de cada um dos valores igual a zero e depois fazer a substituio. A identificao feita atravs do comando find e a posio de cada valor zero esta guardada na varivel izer. A seguir substitumos todos os zeros por nan. >>izer=find(data1==0); %achando todos os elementos com valor igual a zero >>data1(izer)=nan; %substituido os valores zero por nan Os dados contidos nos arquivos hdf no vem em graus Celsius, mas sim numa escala de cores que varia entre 1 e 256. Atravs da equao abaixo transformamos estes dados em TSM. >>data1=0.15*data1-3.0; %Converter temperatura p/ graus Celsius Atravs do comando smartmean conseguimos calcular a mdia (x_bar), o desvio padro (st_dev) e o nmero de dados validos (n_data) usados na operao (no nans) de uma matriz tri dimensional. Para tanto devemos entrar com o nome da matriz e a dimenso sobre a qual queremos realizar a operao, no nosso caso a terceira dimenso ou tempo. O comando smartmean no pertence ao Matlab ele foi criado por um oceangrafo brasileiro e ser distribudo aos participantes do curso. >>[x_bar, st_dev, n_data]=smartmean(data1,3); %achando mdia, desvio e numero de dados das imagens Para plotarmos as informaes acima num mapa, precisamos ter uma matriz com as posies (latitude e longitude) de cada um dos pixeis. Os passos para a criao dos vetores de latitude e longitude, envolvem operaes simples descritas no manual das imagens e no se aplicam ao escopo do curso. Estas operaes esto descritas abaixo: >>y1=-18.0615781; %definindo a posio vertical (latitude) do primeiro pixel >>x1=-61.918890624; %definindo a posio horizontal (longitude) do primeiro pixel >>dx=0.087890625; %definindo o incremento de laitude e longitude >>i=1:273; %numero de pixels na horizontal >>j=1:273;%numero de pixels na vertical >>longitude=(i-1)*dx+x1; %achando as longitude >>latitude=y1-((j-1)*dx); %achando as latitudes Atravs do comando meshgrid criamos matrizes de latitude e longitude a partir dos vetores longitude e latitude >>[mlon,mlat]=meshgrid(longitude,latitude); %criando matriz de latitude e longitude

por Carlos Teixeira

28/28

Curso de Matlab e suas Aplicaes em Oceanografia

Agora que temos a media, o desvio, o nmero de dados validos e as posies vamos plotar estas informaes num mapa. O primeiro passo definir o tipo de projeo que queremos e os limites do mapa atravs do comando m_proj. No precisamos repetir este comando para cada mapa, pois esta projeo e estes limites ficam ativos at que o Matlab seja reiniciado ou uma nova projeo e/ou novos limites definidos. >>m_proj('mercator','longitudes',[-62 -38],'latitudes',[-42 -18]);%definindo projeo e limites do mapa Inicialmente abrimos uma nova figura e plotamos a linha de costa atravs do comando m_gshhs_h. Este comando plota as linhas de costa contidas no banco de dados Global Selfconsistant Hierarchical High-resolution. Este banco de dados no vem com o pacote m_map e deve ser baixado e instalado conforme instrues contidas na pgina do pacote m_map. No comando definimos ainda a cor de preenchimento da costa (path), a cor da linha de costa (edgecolor) e a espessura da linha (LineWidth). >>figure %abrindo nova figura >>m_gshhs_h('patch',[0.8 0.8 0.8],'edgecolor',[0 0 0],'LineWidth',.05);%plotando a linha de costa com uma resoluo de cinco minutos Atravs do comando m_pcolor plotamos a mdia da TSM em funo da longitude e da latitude. >>m_pcolor(mlon,mlat,x_bar); %plotando as mdias de TSM em funo da latitude e longitude Agora vamos plotar os contornos batimetricos de 200 e 1000 metros. Para isso iremos usar o comando m_tbase que usa o banco de dados de batimetria TerrainBase que possui uma resoluo de 5 minutos. Este banco de dados tambm no vem com o pacote m_map e deve ser baixado e instalado conforme instrues contidas na pgina do pacote do prprio m_map. Agora inserimos um titulo atravs do comando title no grfico e criamos o grid do mapa atravs do comando m_grid. >>m_tbase('contour',[-200 -1000],'edgecolor','k'); %plotando as linhas batimetricas de 200 e 1000 metros com resoluo de 5 minutos >>title('Media'); %titulo do grafico >>m_grid %colocando o grid O comando m_pcolor plota os dados usando como limite seus mximos e mnimos, porm muitas vezes queremos ressaltar certas feies ou definir outros limites de plotagem. Para isso usamos o comando caxis e como atributo os limites que desejamos(no nosso caso 5 e 30 graus). Finalmente inserimos uma barra de valores lateral atravs do comando colorbar . >>caxis([5,30]) %definindo os limites dos valores plotados >>colorbar %colocando barra lateral

por Carlos Teixeira

29/29

Curso de Matlab e suas Aplicaes em Oceanografia

Bibliografia:
Curso Rpido de Matlab (http://orion.io.usp.br/cursomat/).

Paulo

S.

Polito

Olga

T.

Sato Analysis

SEA-MAT Matlab Tools for (http://woodshole.er.usgs.gov/operations/sea-mat/).

Oceanographic

Curso de MATLAB - Projeto REENGE - DEL - Laboratrio de Computao da Engenharia Eltrica UFES. Site da Mathworks (http://www.mathworks.com/).

por Carlos Teixeira

30/30