Introdução ao MATLAB 5.3 para Hidrólogos Aula 03 – Scripts, funções e Gráficos Programando e plotando no MATLAB Carlos Ruberto Fragoso Júnior Christopher Freire Souza Porto Alegre, setembro de 2005
Aula 03 Scripts Funções Linguagem de programação Gráficos 2D 3D Animação
Aula 03 Scripts
Aula 03 Scripts files Script é um m-file com um conjunto de comandos do MATLAB dentro dele. Para executar basta digitar o nome do arquivo (sem a extensão .m). É equivalente a digitar todos os comandos na tela principal, só que armazenado em um arquivo. Trabalha com variáveis globais (apresentadas no diretório de trabalho)
Aula 03 Exemplo de um script Vamos escrever um script para resolver o seguinte sistema linear de equações: A.x=b, onde A depende de uma variável r.
Aula 03 Executando o script no MATLAB 1 >> solvex det_A = 64 x = -0.0312 0.2344 1.6875 Os valores do “det_A” e “x" aparecem na tela porque não tem ponto e virgula no final da linha correspondente
Cuidados que se deve ter: NUNCA salve o script com o mesmo nome de uma variável nele digitada. O nome do arquivo script deve iniciar com uma letra. Seja cuidadoso com os nomes das variáveis digitadas no script (todas essas variáveis são gravadas no diretório de trabalho)
Exercício 1 A equação de uma uma reta é y = mx+b, onde m e b são constantes compute os valores de y para os seguintes valores de x: x = 0,1.5,3,4,5,7,9,10 Exercício 2 Crie um vetor t com 10 elementos de: 1,2,...,10. Depois compute os seguintes valores: x = t.sen(t) y = (t-1)/(t+1) z = sen(t2)/t2
Aula 03 Funções
Aula 03 Dicas para criação de funções Crie uma estrutura lógica e pense na seqüência computacional antes de escrever o código. Escreva isso em um papel!!! Defina as variáveis de entrada e saída. Traduza o que você escreveu no papel para o MATLAB. Defina nomes lógicos para suas variáveis e funções. Escreva o máximo de comentários possíveis no código. Quebre grandes blocos computacionais e escreva em função separadas. Check erros e a saída com mensagens de erros e use o artifício do “;” para verificar os passos de cálculo.
Cuidados que se deve ter: O termo de definição deve ser digitado com letra minúscula (“function” e não “Function”) . Linhas comentadas começam com “%”, podendo ser colocado em qualquer lugar. Todas as linhas comentadas imediatamente após o termo de definição são mostradas no MATLAB help. Uma simples variável de saída não precisa ser fechada por colchetes. O nome das variáveis de entrada e de saída na linha do termo de definição são variáveis locais.
function [rho,H,F] = motion(x,y,t); Para executar uma função Considere uma função, cuja a linha de definição é a seguinte: function [rho,H,F] = motion(x,y,t); As variáveis xt, yt e time devem ser definidas antes de executar o comando. >> [r,angmom,force] = motion(xt,yt,time); >> [r,h,f] = motion(rx,ry,[0:100]); >> [r,h,f] = motion(2,3.5,0.001); >> [radius,h] = motion(rx,ry); >> motion(xt,yt,t); As variáveis rx e ry devem ser definidas antes de executar o comando e t é especificada. Todas as variáveis são especificadas. A terceira variável de entrada tem que ser especificada dentro da função. A terceira variável e saída não é disponível. Nenhuma variável de saída fica disponível.
>> [det_A,y] = solvex(1); >> det_A ans = 64 >> y function [det_A,x]=solvex(r) % SOLVEX Resolve um sistema de equações lineares de um matriz 3x3 % com parâmetro r. % Para chamar esta função, digite: % [det_A,x] = solvex(r) % r é a entrada e det_A e x são as saídas A = [5 2*r r; 3 6 2*r-1; 2 r-1 3*r] b = [2;3;5]; det_A = det(A); x = A\b; >> [det_A,y] = solvex(1); >> det_A ans = 64 >> y -0.0312 0.2344 1.6875
Executando uma função dentro de outra function [det_A,x]=solvex(r) % SOLVEX Resolve um sistema de equações lineares de um matriz 3x3 % com parâmetro r. % Para chamar esta função, digite: % [det_A,x] = solvex(r) % r é a entrada e det_A e x são as saídas A = [5 2*r r; 3 6 2*r-1; 2 r-1 3*r] b = [2;3;5]; det_A = det(A); x = A\b; A função “det” é chamada dentro da função solvex. Porém, quando o nome da função é dinâmico é feito de forma diferente (use “feval”).
Aula 03 Funções (function files) funções são m-files contendo um conjunto de comandos do MATLAB dentro dele, como um script, só que todas as variáveis são locais e não globais. São como programas ou subrotinas no Fortran. A 1ª linha do arquivo começa definido as variáveis de entradas e de saídas, e o nome da função. O nome da função deve ser o mesmo nome do arquivo a ser salvo.
Aula 03 Macetes pcode nomedoarquivo – proteger o direito de uso do código. profile – avalia a performance das funções. profile on [det_A,x] = solvex(r) profile report
Exercício 3 Todos os pontos com coordenadas x = r.cosө, y = r.senө, sendo r uma constante, satisfazem a equação x2 + y2 = r. Crie um vetor coluna: ө = 0,π/4, π/2, 3π/4, π e 5π/4 E calcule as coordenadas x e y em função do raio r.
Linguagem de Programação Aula 03 Linguagem de Programação
Aula 03 Linguagem de Programação São usadas para controlar o fluxo das operações. Tipos: “for” e “while” – para “loops” “if-elseif-else” – estrutura condicional simples “switch-case-otherwise” – estrutura condicional avançada Todos esses controladores de fluxo devem terminar com “end”.
Aula 03 Linguagem de Programação São usadas para controlar o fluxo das operações. Tipos: “for” e “while” – para “loops” “if-elseif-else” – estrutura condicional simples “switch-case-otherwise” – estrutura condicional avançada
Aula 03 Fazendo “loops” – “for” Um “for” é usado para repetir uma operação ou um grupo de operações para um número fixo de vezes. % Exemplo for m=1:100 num = 1/(m+1) end for n = 100:-2:0, k=1/(exp(n)), end
Aula 03 Condicional simples – “if-elseif-else” Um “while” é usado para repetir uma operação ou um grupo de operações para um número indefinido de vezes até que a condição especificada pelo “while” seja satisfeita. % Exemplo num = 1; i = 1; while num<10000 num = 2^i; v = [i; num]; i = i + 1; end
Aula 03 Condicional simples – “if-elseif-else” Cria blocos condicionais. % Exemplo i = 6; j = 21; if i > 5 k = i; elseif (i > 1) & (j == 20) k = 5*i + j else k = 1; end
Aula 03 Condicional avançado – “switch-case-otherwise” Cria blocos condicionais. Uma variável é usada como um dispositivo de direcionamento (switch), onde cada valor dessa variável direciona para um caso (case). Aula 03 % Exemplo 1 flag = 1; switch flag case 1 “1º bloco computacional” case 2 “2º bloco computacional” otherwise “último bloco computacional” end
Aula 03 Macetes break – dentro de um “for” ou “while”, termina a execução de um loop. error(‘mensagem’) – dentro de uma função ou script, sai da execução da rotina e mostra uma mensagem de erro. return - dentro de uma função ou script, sai da execução da rotina.
Aula 03 Exemplos - break % Exemplo 1 u = [2 4 8 4 -1 2}; v = u; for i = length(v) if u(i) < 0; % check para u negativo break % termina a execução do loop end a = a + v(i)
Aula 03 Exemplos - error function c = crossprod(a,b) % Cálcula o prod. Escalar de dois vetores if nargin ~= 2 % se não for 2 variáveis de entrada error('São necessárias duas variáveis de entrada') end if length(a) == 3 & length(b) == 3 % começa o cálculo c = cross(a,b); else error('Os vetores devem ter 3 dimensões')
Aula 03 Exemplos - return x = exp(sqrt(163)) n = input('Entre com o número max.de iterações') while n >= 1 if n <=0 return end x = log(x) n = n - 1;
Aula 03 Outros macetes input(‘mensagem’, opção) – mostra um texto na tela e espera pelo o usuário dá uma entrada no teclado. menu(‘Título’,‘opção1’, ‘opção2’,...) – cria um menu na tela e lista as opções no menu. pause – pausa a execução da rotina e espera um sinal do usuário ou pausa um determinado tempo (“pause(n)”).
Arquivos de entrada e saída Aula 03 Arquivos de entrada e saída
Aula 03 Entrada e Saída O MATLAB possui algumas funções para ler e escrever dados em arquivos do tipo binário ou ASCII formatados. As funções são: fopen: abre um arquivo existente ou cria um novo arquivo fclose: fecha um arquivo aberto fwrite: escreve uma informação binário para um arquivo fread: ler uma informação binário de um arquivo fscanf: ler uma informação formatada de um arquivo fprintf: escreve uma informação formatada para um arquivo
Formatação de arquivos Formato Descrição %c Simples caracter %d Notação decimal %e Notação exponecial (usando “e” minúsculo ) %E Notação exponecial (usando “e” maiúsculo ) %f Notação fixando ponto %g O mais compactado de %e ou %f %o Notação Octal %s Grupos de caracteres %x Notação Hexadecimal
Exercício 1 Gerar e escrever em um arquivo ASCII uma tabela de conversão de temperatura de Fahrenheit para Celsius. Sabendo que: F = -40:5:100 C = (F-32)*5/9 Exercício 2 Ler os dados de temperatura do arquivo gerado em um matriz de temperatura.
Aula 03 Exemplos – Escrever em um arquivo F = -40:5:100; C = (F-32)*5/9; t = [F;C]; fid = fopen('temperatura.tab','w'); fprintf(fid,' Tabela de Temperatura\n'); fprintf(fid,'~~~~~~~~~~~~~~~~~~~~~~~~\n'); fprintf(fid,'Fahrenheit Celsius\n'); fprintf(fid,' %4i %8.2f\n',t); fclose(fid);
Aula 03 Exemplos – Ler um arquivo fid = fopen('temperatura.tab'); lixo=fscanf(fid,'%25c',[1 1]) lixo=fscanf(fid,'%20c',[1 1]) temp = fscanf(fid,'%i %f',[2 inf]) fclose(fid);
Aula 03 Gráficos
Aula 03 Gráficos Boas ferramentas de visualização; Gráficos 2D, 3D e animações; O especial sobre a parte gráfica do MATLAB é o fácil uso e expansibilidade.
plot(xvalores,yvalores,’estilo-opções’) Aula 03 Plots 2D O comando básico e talvez o mais proveitoso comando para produzir um gráfico em 2 dimensões é: plot(xvalores,yvalores,’estilo-opções’)
Aula 03 Opções de estilo Cor linha Descrição y (amarelo) - (sólido) + (sinal de soma) m (margenta) -- (tracejado) o (cículo) c (ciano) : (pontinhado) * (asterisco) r (vermelho) -. (tracejado-potinhado) x (sinal x) g (verde) . (ponto) b (azul) ^ (triangulo) w (branco) s (quadrado) k (preto) d (diamante), etc
Aula 03 Outras opções do comando “axis” axis(‘equal’) – coloca uma escala igual em ambos os eixos axis(‘square’) – transforma a área de plotagem retangular em um quadrado axis(‘normal’) – restaura os eixos para valores padrões axis(‘off’) – remove a área de plotagem e legendas
axis([xmin xmax ymin ymax]) Aula 03 Controle do eixo Você pode mudar os limites dos eixos com o comando “axis” axis([xmin xmax ymin ymax])
Aula 03 Inserindo textos nos gráficos xlabel(‘eixo x’) – legenda do eixo x ylabel(‘eixo y’) – legenda do eixo y title(‘título’) – título do gráfico text(2,6,‘texto’) – escreve ‘texto’ na coordenada (2,6) legend(‘texto1’, ‘texto2’, ...)
plot(x1,y1,‘estilo1’,x2,y2,‘estilo2’) Aula 03 Sobreposição de gráficos Usando o comando plot Usando o comando “hold on” plot(x1,y1,‘estilo1’,x2,y2,‘estilo2’) plot(x1,y1,‘estilo1’) hold on plot(x2,y2, ‘estilo2’)
Aula 03 Exercício Plotar a função seno em conjunto com duas funções de aproximação por série de Taylor (1ª e 3ª ordem). As funções são: y1 = sen(t) y2 = t y3 = t-t3/3!+t5/5! Usando as funções xlabel, ylabel, axis, gtext, hold on, plot...
Aula 03 Exercício (solução) x=linspace(0,2*pi,100); y1=sin(x); plot(x,y1) hold on y2=x; plot(x,y2,‘--’) y3=x-(x.^3)/6+(x.^5)/120; plot(x,y3,‘o’) axis([0 5 -1 5]) Hold off
Aula 03 Gráficos especiais em 2D fplot » fplot('x.*sin(x)',[0 10*pi])
Aula 03 Gráficos especiais em 2D semilogx » t=linspace(0,2*pi,200); » x=exp(-t); » y=t; » semilogx(x,y), grid
Aula 03 Gráficos especiais em 2D semilogy » t=linspace(0,2*pi,200); » semilogy(t,exp(t)), grid
Aula 03 Gráficos especiais em 2D loglog » t=linspace(0,2*pi,200); » x=exp(t); » y=100+exp(2*t); » loglog(x,y), grid
Aula 03 Gráficos especiais em 2D polar » t=linspace(0,2*pi,200); » r=sqrt(abs(2*sin(5*t))); » polar(t,r)
Aula 03 Gráficos especiais em 2D fill » t=linspace(0,2*pi,200); » r=sqrt(abs(2*sin(5*t))); » x=r.*cos(t); » y=r.*sin(t); » fill(x,y,'k') » axis(‘equal')
Aula 03 Gráficos especiais em 2D bar » t=linspace(0,2*pi,200); » r=sqrt(abs(2*sin(5*t))); » y=r.*sin(t); » bar(t,y) » axis([0 pi 0 inf])
Aula 03 Gráficos especiais em 2D errorbar » x=0:0.1:2; » aprx2=x-x.^3/6; » er=aprx2-sin(x); » errorbar(x,aprx2,er)
Gráficos especiais em 2D barh » cont=char('Asia','Europa','Africa','America do Norte', 'America do Sul'); » pop=[3332;696;694;437;307]; » barh(pop) » for i=1:5, gtext(cont(i,:)); end » xlabel('Polulação em Milhões') » title('População do Mundo (1992)')
Gráficos especiais em 2D plotyy » x=1:0.1:10; » y1=exp(-x).*sin(x); » y2=exp(x); » Ax=plotyy(x,y1,x,y2) Ax = 72.0021 74.0096 » hy1=get(Ax(1),'ylabel'); » hy2=get(Ax(2),'ylabel'); » set(hy1,'string','e^-x*sin(x)'); » set(hy2,'string','e^x');
Gráficos especiais em 2D area » x=linspace(-3*pi,3*pi,100); » y=-sin(x)./x; » area(x,y) » xlabel('x') » ylabel('sin(x)./x') » hold on » x1=x(46:55); » y1=y(46:55); » area(x1,y1,'facecolor','y')
Gráficos especiais em 2D pie » cont=char('Asia','Europa','Africa','America do Norte', 'America do Sul'); » pop=[3332;696;694;437;307]; » pie(pop) » for i=1:5, gtext(cont(i,:)); end
Gráficos especiais em 2D hist » y=randn(50,1); » hist(y)
Gráficos especiais em 2D stairs » t=linspace(0,2*pi,200); » r=sqrt(abs(2*sin(5*t))); » y=r.*sin(t); » stairs(t,y) » axis([0 pi 0 inf])
Gráficos especiais em 2D stem » t=linspace(0,2*pi,100); » f=exp(-0.2*t).*sin(t); » stem(t,f)
Gráficos especiais em 2D compass » zx=cos(th); » zy=sin(th); » z=zx+i*zy; » compass(z)
Gráficos especiais em 2D Comet (faz uma pequena animação) » q=linspace(0,10*pi,200); » y=q.*sin(q); » comet(q,y)
Gráficos especiais em 2D contour » r=-5:0.2:5; » [X,Y]=meshgrid(r,r); » Z=-0.5*X.^2 + X.*Y + Y.^2; » cs=contour(X,Y,Z); » clabel(cs)
Gráficos especiais em 2D quiver » r=-2:0.2:2; » [X,Y]=meshgrid(r,r); » Z=-0.5*X.^2 + X.*Y + Y.^2; » [dx,dy]=gradient(Z,.2,.2); » quiver(X,Y,dx,dy,2);
Gráficos especiais em 2D quiver » r=-2:0.2:2; » [X,Y]=meshgrid(r,r); » Z=-0.5*X.^2 + X.*Y + Y.^2; » pcolor(Z) » axis('off') » shading interp
Aula 03 Gráficos Múltiplos Se vc quer fazer alguns gráficos e colocá-los lado a lado (sem sobrepor gráficos), use o comando “subplot”: subplot(m,n,p) Dividi a janela em m x n sub-janelas, e plota o gráfico na sub-janela p.
plot3(x,y,z,’estilo-opções’) Aula 03 Plots 3D O comando básico para produzir uma curva em 3 dimensões é: plot3(x,y,z,’estilo-opções’) Use agora o comando “zlabel”
Aula 03 Ângulo de visão view(azimute,elavação) – onde o azimute é em graus partir do eixo y sendo o sentido anti-horário o sentido positivo, e a elevação em graus é o ângulo medido a partir do plano x-y. rotate3d on – mais versátil e de fácil uso, você mesmo manipula a melhor visão.
Aula 03 Plotando superfícies Os comandos básicos para plotar uma superfície são: mesh e surf. Utilize o comando “meshgrid” para gerar uma grade de pontos quadrangular. mesh(X,Y,Z) surf(X,Y,Z)
Superfícies em 3D mesh e surf >> x=linspace(-3,3,100); >> [X,Y]=meshgrid(x,x); >> Z=X.*Y.*(X.^2-Y.^2)./((X.^2+Y.^2)); >> mesh(X,Y,Z) >> surf(X,Y,Z)
Especiais em 3D fill3 » X=[0 0 0 0;1 1 -1 1;1 -1 -1 1]; » Y=[0 0 0 0; 4 4 4 4; 4 4 4 4]; » Z=[0 0 0 0; 1 1 -1 -1; -1 1 1 -1]; » fill3(X,Y,Z,rand(3,4)) » view(120,30)
Especiais em 3D contour3 » r=linspace(-3,3,50); » [x,y]=meshgrid(r,r); » z=-5./(1+x.^2+y.^2); » contour3(x,y,z)
Especiais em 3D contour3 » r=linspace(-3,3,50); » [x,y]=meshgrid(r,r); » z=-5./(1+x.^2+y.^2); » contour3(x,y,z)
Especiais em 3D surfc » u=-5:0.2:5; » [X,Y]=meshgrid(u,u); » Z = cos(X).*cos(Y).*exp(-sqrt(X.^2+Y.^2)/4); » surfc(X,Y,Z) » axis('off')
Especiais em 3D surfl » u=-5:0.2:5; » [X,Y]=meshgrid(u,u); » Z = cos(X).*cos(Y).*exp(-sqrt(X.^2+Y.^2)/4); » surfl(X,Y,Z) » shading interp » colormap hot
Especiais em 3D meshz » x=linspace(-3,3,50); » y=x; » [x,y]=meshgrid(x,y); » z=-5./(1+x.^2+y.^2); » meshz(x,y,z)
Especiais em 3D waterfall » x=linspace(-3,3,50); » y=x; » [x,y]=meshgrid(x,y); » z=-5./(1+x.^2+y.^2); » waterfall(x,y,z) » hidden off
Especiais em 3D pie3 » pop=[3332;696;694;437;307]; » pie3(pop) » title('população do mundo')
Especiais em 3D stem3 » t=linspace(0,6*pi,200); » x=t; » y=t.*sin(t); » z=exp(t/10)-1; » stem3(x,y,z)
Especiais em 3D ribbon » t=linspace(0,5*pi,100); » y=sin(t); » ribbon(t,y,0.1)
Especiais em 3D sphere » sphere(20) ou » [x,y,z]=sphere(20); » surf(x,y,z) » axis('equal')
Especiais em 3D cylinder » z=0:0.02:1; » r=sin(3*pi*z)+2; » cylinder(r)
Especiais em 3D slice » v=[-3:0.2:3]; » [x,y,z]=meshgrid(v,v,v); » f=(x.^2+y.^2-z.^2); » xv=[-2 2.5]; » yv=2.5; » zv=0; » slice(x,y,z,f,xv,yv,zv) » view(-30,30) » xlabel('x') » ylabel('y') » zlabel('z') » colorbar(‘horiz’)
Plotando informações volumétricas As funções disponíveis para visualização de informação volumétrica são: “slice”, “isosurface”, “isonormal”, “isocaps”, “subvolume”, “reducevolume”, “smooth3”, “reducepatch”. Veja helpdesk para mais informações.
[Xi,Yi,Zi]=griddata(x,y,z,xi,yi,‘método) Plotando superfícies interpoladas Muitas vezes, nós temos alguma informação em forma (x,y,z) e queremos ajustar uma superfície a essa informação. Para isso usamos o comando “griddata”. [Xi,Yi,Zi]=griddata(x,y,z,xi,yi,‘método)
Plotando superfícies interpoladas » xv=2*rand(1,100)-1; » yv=2*rand(1,100)-1; » zv=3./(1+xv.^2+yv.^2); » stem3(xv,yv,zv)
Plotando superfícies interpoladas » xi=linspace(-1,1,30); » yi=xi; » [xi,yi]=meshgrid(xi,yi); » [Xi,Yi,Zi]=griddata(xv,yv,zv,xi,yi,'v4'); » surf(Xi,Yi,Zi)
Handle Graphics O que é um handle? São números associados a todo objeto de uma figura. Hierarquia dos objetos gráficos:
Propriedade dos objetos » h=plot(1:20) h = 1.0056 » get(h) Color = [0 0 1] EraseMode = normal LineStyle = - LineWidth = [0.5] Marker = none MarkerSize = [6] MarkerEdgeColor = auto MarkerFaceColor = none XData = [ (1 by 20) double array] YData = [ (1 by 20) double array] ZData = [] ...
Propriedade dos objetos » h=plot(1:20) h = 1.0056 » get(h) Color = [0 0 1] EraseMode = normal LineStyle = - LineWidth = [0.5] Marker = none MarkerSize = [6] MarkerEdgeColor = auto MarkerFaceColor = none XData = [ (1 by 20) double array] YData = [ (1 by 20) double array] ZData = [] ...
Propriedade dos objetos » h=plot(1:20) h = 1.0056 » set(h,'Linewidth',2) %muda a espessura da linha » set(h,'Color',[0 1 1]) %muda a cor da linha
Animação (Fazer um filme) nframes = 36; Frames = moviein(nframes); angulo = linspace(0,360,36); x=linspace(-3,3,100); [X,Y]=meshgrid(x,x); Z=X.*Y.*(X.^2-Y.^2)./((X.^2+Y.^2)); mesh(X,Y,Z) for i=1:nframes view(angulo(i),30) Frames(:,i)=getframe; end movie(Frames,2)