Programao e Aplicaes Grficas UNIVERSIDADE DA BEIRA INTERIOR
Programação e Aplicações Gráficas UNIVERSIDADE DA BEIRA INTERIOR Versão: 15 de Junho de 2007
Programação e Aplicações Gráficas • • Scripts Funções Programação Gráficos – 2 D – 3 D – Animação
Scripts – Script é um conjunto de comandos do MATLAB gravados num ficheiro (com a extensão. m chamados m-files). – Para executar basta escrever o nome do arquivo (sem a extensão. m). – É equivalente a escrever todos os comandos na janela principal, só que armazenado num arquivo. – Trabalha com variáveis globais (apresentadas no directório de trabalho) Programação e Aplicações Gráficas • Ficheiros Scripts
Vamos escrever um script para resolver o seguinte sistema linear de equações: Ax=b, onde A depende de uma variável r. Programação e Aplicações Gráficas • Exemplo de um script
>> r = 1 r= 1 >> solvex det_A = 64 x= -0. 0312 0. 2344 1. 6875 Os valores do “det_A” e “x" aparecem na janela porque não tem ponto e vírgula no final da linha correspondente Programação e Aplicações Gráficas • Executando o script no MATLAB
– NUNCA grave o script com o mesmo nome de uma variável nele inscrita. – O nome do arquivo script deve começar por uma letra. – Seja cuidadoso com os nomes das variáveis no script (todas essas variáveis são gravadas no directório de trabalho) Programação e Aplicações Gráficas • Cuidados que se deve ter:
Exercício 1 Faça um script que mostra na janela principal uma tabela de conversão de graus Celsius para graus Fahrenheit. ( Considere C=-40: 5: 100) Exercício 2 Escreva um script que representa a função tangente entre –pi/2 e insere o título e legendas nos eixos. Exercício 3 Construa um script que transforma um número x em graus, num número y em radianos.
Funções – Funções são m-files contendo um conjunto de comandos do MATLAB, 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 definindo as variáveis de entrada e de saída, e o nome da função. – O nome da função deve ter o mesmo nome do arquivo a ser gravado. Programação e Aplicações Gráficas • Funções (function files)
– Crie uma estrutura lógica e pense na sequência computacional antes de escrever o código. Escreva-a num papel!!! – Defina as variáveis de entrada e saída. – Traduza o que escreveu no papel para o MATLAB. – Defina nomes lógicos para as variáveis e funções. – Escreva o máximo de comentários possíveis no código. – Divida grandes blocos computacionais e escreva-os em funções separadas. – Verifique os erros e a saída com mensagens de erro e use o artifício do “; ” para verificar os passos intermédios de cálculo. Programação e Aplicações Gráficas • Dicas para criação de funções
– O termo de definição deve ser escrito com letra minúscula (“function” e não “Function”). – Os comentários começam com “%”, podendo ser colocados em qualquer lugar. Todas as linhas comentários 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 parênteses rectos [ ]. – O nome das variáveis de entrada e de saída na linha do termo de definição são variáveis locais. Programação e Aplicações Gráficas • Cuidados que se deve ter:
• Para executar uma função Considere uma função, cuja linha de definição é a seguinte: function [rho, H, F] = motion(x, y, t); >> [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 xt, yt e time devem ser definidas antes de executar o comando. 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.
function [det_A, x]=solvex(r) % SOLVEX Resolve um sistema de equações lineares de um matriz 3 x 3 % 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 = Ab; >> [det_A, y] = solvex(1); >> det_A ans = 64 >> y ans = -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 3 x 3 % 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); A x = Ab; 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”).
– pcode nomedoarquivo – protege o direito de uso do código. – profile – avalia a performance das funções. profile on [det_A, x] = solvex(r) profile report Programação e Aplicações Gráficas • Outros Comandos
• Exercício 1 Escreva uma função cuja entrada é um valor x em graus e o converte para radianos. • Exercício 2 Faça uma função que dadas 2 matrizes calcule a soma e diferença. • Exercício 3 Construa uma função que converte a pressão de atm para N/m 2.
Programação – Conjunto de comandos usados para controlar o fluxo das operações. – Tipos: (a) “for” e “while” – para “loops” (b) “if-else” – estrutura condicional simples (c) “switch-case-otherwise” – estrutura condicional avançada – Todos esses controladores de fluxo devem terminar com “end”. Programação e Aplicações Gráficas •
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 % Exemplo for n = 100: -2: 0, k=1/(exp(n)), end Programação e Aplicações Gráficas •
Fazendo “loops” – “while” – 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 Programação e Aplicações Gráficas •
Condicional simples – “if-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 Programação e Aplicações Gráficas •
• Condicional avançado – “switch-caseotherwise” % Exemplo 1 flag = 1; switch flag case 1 “ 1º bloco computacional” case 2 “ 2º bloco computacional” otherwise “último bloco computacional” end Programação e Aplicações Gráficas – Cria blocos condicionais. Uma variável é usada como um dispositivo de direccionamento (switch), onde cada valor dessa variável direcciona para um caso (case).
• Operadores – Comparam os elementos correspondentes entre duas matrizes da mesma dimensão – Se for comparar uma matriz com um escalar então compara cada elemento da matriz com o escalar – O resultado é uma matriz de 1 e 0 • Lógicos – “&” ou “AND” ; “|” ou “OR” ; “~” ou “NOT” ; “XOR” – Devolve variável Booleana, 1 ou 0 Programação e Aplicações Gráficas • Relacionais – <, <=, >, >=, ==, ~=
– break – dentro de um “for” ou “while”, termina a execução de um “loop” - ciclo. – 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. Programação e Aplicações Gráficas • Comandos de paragem
Exemplos - break % Exemplo 1 u = [2 4 8 4 -1 2]; v = u; a=0; for i = length(v) if u(i) < 0; % check para u negativo break % termina a execução do loop end a = a + v(i) end Programação e Aplicações Gráficas •
Exemplos - error function c = crossprod(a, b) % Calcula o prod. Escalar de dois vectores 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 vectores devem ter dimensão 3') end Programação e Aplicações Gráficas •
Exemplos - return x = exp(sqrt(163)) n = input(‘ Escreva o número max de iterações n=') while n >= 1 if n <=0 return end x = log(x) n = n - 1; end Programação e Aplicações Gráficas •
– input(‘mensagem’, opção) – mostra um texto na janela de comandos e espera que o utilizador introduza uma entrada pelo teclado. – menu(‘Título’, ‘opção 1’, ‘opção 2’, . . . ) – cria um menu na janela de comandos e efectua as opções do menu. – pause – pára a execução da rotina e espera um sinal do utilizador ou efectua uma pausa durante um determinado tempo (“pause(n)”). Programação e Aplicações Gráficas • Outros comandos
Exercício 1 Faça um programa que verifica se um número é primo. Exercício 2 Um fornecedor faz o seguinte desconto num determinado produto: mais de 200 unidades 7%; de 100 a 200 uni. 5%; de 50 a 100 uni. 3%; menos de 50 unidades tem desconto. Escreva um programa que calcula o preço total dado o nº. de unidades e o preço unitário. Exercício 3 Altere os programas dos capítulos anteriores de modo que peçam as entradas de modo interactivo.
• 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: lê informação binário num arquivo – fscanf: lê informação formatada num arquivo – fprintf: escreve informação formatada num arquivo Programação e Aplicações Gráficas Arquivos de entrada e saída
Formato Descrição %c Simples caracter %d Notação decimal %e Notação exponencial (usando “e” minúsculo ) %E Notação exponencial (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 Programação e Aplicações Gráficas • Formatação de arquivos
Exercício 1 Construa um programa que escreve num ficheiro de texto uma tabela de conversão entre as unidades de temperatura Fahrenheit, Kelvin e Celsius. Exercício 2 Crie um programa que gera aleatoriamente um conjunto de 100 elementos normalmente distribuídos escreva num ficheiro. Exercício 3 Faça um programa que lê o ficheiro da alínea anterior, calcule a média dos dados e apresente um gráfico dos valores lidos.
Exemplos – Escrever num arquivo F = -40: 5: 100; C = (F-32)*5/9; t = [F; C]; fid = fopen('temperatura. tab', 'w'); fprintf(fid, ' Tabela de Temperaturan'); fprintf(fid, '~~~~~~~~~~~~n'); fprintf(fid, 'Fahrenheit Celsiusn'); fprintf(fid, ' %4 i %8. 2 fn', t); fclose(fid); Programação e Aplicações Gráficas •
Exemplos – Ler um arquivo fid = fopen('temperatura. tab'); lixo=fscanf(fid, '%25 c', [1 1]) lixo=fscanf(fid, '%20 c', [1 1]) temp = fscanf(fid, '%i %f', [2 inf]) fclose(fid); Programação e Aplicações Gráficas •
Gráficos – Boas ferramentas de visualização; – Gráficos 2 D, 3 D e animações; – Especial sobre a parte gráfica do MATLAB é fácil o uso e expansibilidade. Programação e Aplicações Gráficas •
Gráficos 2 D – O comando básico e talvez o mais proveitoso para produzir um gráfico em 2 dimensões é: plot(xvalores, yvalores, ’estilo-opções’) Programação e Aplicações Gráficas •
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 Programação e Aplicações Gráficas •
Controle do eixo – Pode-se mudar os limites dos eixos com o comando “axis” axis([xmin xmax ymin ymax]) Programação e Aplicações Gráficas •
Outras opções do comando “axis” – axis(‘equal’) – coloca uma escala igual em ambos os eixos – axis(‘square’) – transforma a área do gráfico rectângular num quadrado – axis(‘normal’) – restaura os eixos para valores padrões – axis(‘off’) – remove a área do gráfico e legendas Programação e Aplicações Gráficas •
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(‘texto 1’, ‘texto 2’, . . . ) Programação e Aplicações Gráficas •
Exercício – Fazer o gráfico da 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: y 1 = sen(t) y 2 = t y 3 = t-t 3/3!+t 5/5! Usando as funções xlabel, ylabel, axis, gtext, hold on, plot. . . Programação e Aplicações Gráficas •
Exercício (solução) x=linspace(0, 2*pi, 100); y 1=sin(x); plot(x, y 1) hold on y 2=x; plot(x, y 2, ‘--’) y 3=x-(x. ^3)/6+(x. ^5)/120; plot(x, y 3, ‘o’) axis([0 5 -1 5]) Hold off Programação e Aplicações Gráficas •
• Gráficos especiais em 2 D – fplot Aula 03 » fplot('x. *sin(x)', [0 10*pi])
• Gráficos especiais em 2 D – semilogx » t=linspace(0, 2*pi, 200); » x=exp(-t); » y=t; » semilogx(x, y), grid
• Gráficos especiais em 2 D – semilogy » t=linspace(0, 2*pi, 200); » semilogy(t, exp(t)), grid
• Gráficos especiais em 2 D – loglog » t=linspace(0, 2*pi, 200); » x=exp(t); » y=100+exp(2*t); » loglog(x, y), grid
• Gráficos especiais em 2 D – polar » t=linspace(0, 2*pi, 200); » r=sqrt(abs(2*sin(5*t))); » polar(t, r)
• Gráficos especiais em 2 D – 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')
• Gráficos especiais em 2 D – 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])
• Gráficos especiais em 2 D – errorbar » x=0: 0. 1: 2; » aprx 2=x-x. ^3/6; » er=aprx 2 -sin(x); » errorbar(x, aprx 2, er)
• Gráficos especiais em 2 D – 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 2 D – plotyy » x=1: 0. 1: 10; » y 1=exp(-x). *sin(x); » y 2=exp(x); » Ax=plotyy(x, y 1, x, y 2) Ax = 72. 0021 74. 0096 » hy 1=get(Ax(1), 'ylabel'); » hy 2=get(Ax(2), 'ylabel'); » set(hy 1, 'string', 'e^-x*sin(x)'); » set(hy 2, 'string', 'e^x');
• Gráficos especiais em 2 D – area » x=linspace(-3*pi, 100); » y=-sin(x). /x; » area(x, y) » xlabel('x') » ylabel('sin(x). /x') » hold on » x 1=x(46: 55); » y 1=y(46: 55); » area(x 1, y 1, 'facecolor', 'y')
• Gráficos especiais em 2 D – 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 2 D – 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 2 D – stem » t=linspace(0, 2*pi, 100); » f=exp(-0. 2*t). *sin(t); » stem(t, f)
• Gráficos especiais em 2 D – compass » zx=cos(th); » zy=sin(th); » z=zx+i*zy; » compass(z)
• Gráficos especiais em 2 D – Comet (faz uma pequena animação) » q=linspace(0, 10*pi, 200); » y=q. *sin(q); » comet(q, y)
• Gráficos especiais em 2 D – 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 2 D – 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); » quiver(X, Y, dx, dy, 2);
• Gráficos especiais em 2 D – 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
Gráficos Múltiplos – Se pretender 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 desenha o gráfico na sub-janela p. Programação e Aplicações Gráficas •
Plots 3 D – O comando básico para produzir uma curva em 3 dimensões é: plot 3(x, y, z, ’estilo-opções’) Use agora o comando “zlabel” Programação e Aplicações Gráficas •
• ngulo de visão Aula 03 – view(azimute, elavação) – onde o azimute é em graus partir do eixo y sendo o sentido antihorário o sentido positivo, e a elevação em graus é o ângulo medido a partir do plano x-y. – rotate 3 d on – mais versátil e de fácil uso.
Gráfico de superfícies – Os comandos básicos para fazer um gráfico de uma superfície são: mesh e surf. – Utilize o comando “meshgrid” para gerar uma grelha de pontos quadrangular. mesh(X, Y, Z) surf(X, Y, Z) Programação e Aplicações Gráficas •
• Superfícies em 3 D – 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) >> mesh(X, Y, Z)
• Especiais em 3 D – fill 3 » X=[0 0 0 0; 1 1 -1 1; 1 -1 -1 1]; » Y=[0 0 0 0; 4 4 4 4]; » Z=[0 0 0 0; 1 1 -1 -1; -1 1 1 -1]; » fill 3(X, Y, Z, rand(3, 4)) » view(120, 30)
• Especiais em 3 D – contour 3 » r=linspace(-3, 3, 50); » [x, y]=meshgrid(r, r); » z=-5. /(1+x. ^2+y. ^2); » contour 3(x, y, z)
• Especiais em 3 D – 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 3 D – 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 3 D – 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 3 D – 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 3 D – pie 3 » pop=[3332; 696; 694; 437; 307]; » pie 3(pop) » title('população do mundo')
• Especiais em 3 D – stem 3 » t=linspace(0, 6*pi, 200); » x=t; » y=t. *sin(t); » z=exp(t/10)-1; » stem 3(x, y, z)
• Especiais em 3 D – ribbon » t=linspace(0, 5*pi, 100); » y=sin(t); » ribbon(t, y, 0. 1)
• Especiais em 3 D – sphere » sphere(20) ou » [x, y, z]=sphere(20); » surf(x, y, z) » axis('equal')
• Especiais em 3 D – cylinder » z=0: 0. 02: 1; » r=sin(3*pi*z)+2; » cylinder(r)
• Especiais em 3 D – 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’)
• Representando gráficamente 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”, “smooth 3”, “reducepatch”. Veja helpdesk para mais informações.
• Gráfico de superfícies interpoladora – 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)
• Gráfico de superfícies interpoladoras » xv=2*rand(1, 100)-1; » yv=2*rand(1, 100)-1; » zv=3. /(1+xv. ^2+yv. ^2); » stem 3(xv, yv, zv)
• Gráfico de superfícies interpoladoras » xi=linspace(-1, 1, 30); » yi=xi; » [xi, yi]=meshgrid(xi, yi); » [Xi, Yi, Zi]=griddata(xv, yv, zv, xi, yi, 'v 4'); » surf(Xi, Yi, Zi)
• Handle Graphics – O que é um handle? São números associados a todos os objectos de uma figura. Hierarquia dos objectos gráficos:
• Propriedade dos objectos » h=plot(1: 20) h= 1. 0056 » get(h) Color = [0 0 1] Erase. Mode = normal Line. Style = Line. Width = [0. 5] Marker = none Marker. Size = [6] Marker. Edge. Color = auto Marker. Face. Color = none XData = [ (1 by 20) double array] YData = [ (1 by 20) double array] ZData = []. . .
• Propriedade dos objectos » 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, 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)
Programação e Aplicações Gráficas Animação (Fazer um filme) •
- Slides: 86