Você está na página 1de 27

Cap tulo 2 o em Matlab Programac a

2.1 o Introduc a

um software comercial multiplataforma, proO Matlab (abreviatura de Matrix Laboratory) e duzido pela companhia The MathWorks, Inc., que constitui uma plataforma e uma linguagem de o extremamente ex o programac a vel, particularmente apta para o c alculo matricial e para a criac a es complexas. Como linguagem o Matlab assemelha-se ao C no que se rede gr acos e animac o o orientada a objectos, mas diverge do C pelo facto de ser uma fer ao paradigma de programac a linguagem interpretada e n ao compilada. Os programas do Matlab constituem cheiros ASCII, denominados genericamente como m-les, que podem ser processados pelo interpretador do software, de maneira interactiva ou como sub-processo do sistema. A exibilidade do Matlab permite que o programador se concentre mais na ess encia do problema que pretende resolver, em vez de o dos algoritmos requeridos para resolver tarefas ver-se sobrecarregado com a eventual programac a secund arias. Para al em dos m-les desenvolvidos pela companhia The MathWorks, Inc., que acompanham o interpretador, existe na internet um arquivo livre no enderec o

http://www.mathworks.com/matlabcentral/leexchange

reas de investigac o. com m-les desenvolvidos por utilizadores particulares para as mais variadas a a reas parPara al em disso a companhia The MathWorks, Inc. desenvolve pacotes de apoio para a o (Processamento de Sinal, Matem ticulares de investigac a atica Simb olica, Estat stica, etc.), os chamados Toolboxes, que s ao comercializados independentemente do pacote original. O prop osito fundamental deste cap tulo consiste em introduzir alguns dos conceitos mais im o com o Matlab, visando aplicac es concretas em problemas de c portantes da programac a o alculo vectorial e de cinem atica. A vers ao do Matlab usada para preparar estes apontamentos foi a a 5.1.0.421, esperando-se que os comandos abordados funcionem da mesma maneira em vers oes mais avanc adas. 23

24

2.2. Dados escalares

2.2

Dados escalares

No linux uma sess ao de Matlab pode ser invocada a partir de uma janela de comandos. Ap os inicializado o interpretador do Matlab exibe a seguinte mensagem de arranque: < M A T L A B (R) > (c) Copyright 1984-97 The MathWorks, Inc. All Rights Reserved Version 5.1.0.421 May 25 1997

To get started, type one of these commands: helpwin, helpdesk, or demo. For information on all of the MathWorks products, type tour. >> es inseridas na sua linha pr mostrando-se pronto para executar as instruc o opria de comandos, indicada pelo s mbolo >> o dado vazio, denido como O dado mais simples de representar e >> a = [] o de func es por A utilidade deste tipo de dado ser a comprendida quanto se discuta a criac a o parte do utilizador. Denamos agora um par de dados escalares: >> a = 1, b = 2 es b Consideremos agora algumas operac o asicas: >> a+b,a-b,a*b,a/b,b^5 o dos comandos basta usar o coPara consultar a lista de vari aveis criadas durante a execuc a mando >> whos Surge aqui a primeira particularidade do Matlab: a linha de comandos conrma o armazena es (com excepc o do resultado para a divis mento das vari aveis e dos resultados das operac o a ao), representados-as na linha de comandos como se fossem inteiros. No entanto, o comando who revela que todas as grandezas se encontram armazenadas como var aveis reais de precis ao dupla. No entanto, no sentido de simplicar o trabalho do programador o Matlab compacta de maneira o das casas decimais das diferentes grandezas. No entanto, o comando eciente a exibic a

Cap tulo 2. Programac a o em Matlab >> format long

25

instrui o Matlab no sentido de exibir todas as casas decimais de todas os dados at e ai inseridos. es com O Matlab disponibiliza tamb em os seguintes comandos, relevantes para muitas operac o v rgula utuante: eps: precis ao relatica de v rgula utuante. Indica a diferenc a entre 1,0 e o n umero de v rgula utuante imediatamente superior. Permite identicar a precis ao m nima de trabalho. Qual tratado pelo Matlab como sendo id quer n umero inferior ao valor indicado de eps e entico a zero. realmin: o menor n umero real positivo com que o Matlab consegue lidar. Qualquer vari avel inferior a este valor pode fazer transbordar a capacidade de armazenamento das grandezas armazenadas na mem oria do computador. realmax: o maior n umero real positivo com que o Matlab consegue lidar. Qualquer vari avel superior a este valor pode fazer transbordar a capacidade de armazenamento das grandezas armazenadas na mem oria do computador. Para lidar com este tipo de problemas de armazemento em mem oria o Matlab dene as grandezas nan (not-a-number) e inf (innito positivo) para lidar com c alculos do tipo: >> a = 0/0, b = 1/0 O Matlab permite lidar igualmente com dados complexos, por defeito o comando >> i,j conrmado pelo Matlab como representando a unidade imagin e aria. Isto n ao impede que o uti o pr lizador use a sua denic a opria: >> i = 1,j = 2 o que deve ser feito com algum cuidado caso o utilizador pretenda lidar com dados complexos. Para apagar todos os dados criados durante a sess ao o utilizador pode invocar o comando >> clear all : ATENC AO Linguagens como o C e o FORTRAN possuim um conjunto de palavras pre-reservadas, que o es. Caso contr programador n ao pode usar como nomes de vari aveis ou func o ario o compilador recusa produzir o execut avel a partir do correspondente c odigo fonte. O Matlab, pelo contr ario, n ao p oe entraves aos nomes das vari aveis, interpretando as sequ encias de comandos desde que o pode ser ilustrada pelo n ao apresentem erros de sintaxe. Um exemplo particular desta situac a comando

26 >> sin = 1

2.3. Vectores, matrices e tensores (hiper-matrices)

o esta que se sobrep ` denic o da func o sin(x), necess o denic a oe a a a aria para calcular a func a trigonom etrica seno. Evidentemente que esta permissividade constitui uma fonte potencial de aconselhado vivamente que se consultem os problemas para o programador, raz ao pela qual e comandos mais importantes, usando o comando >> help lang o por si denida, o programador Adicionalmente, antes de escolher o nome para uma func a o j dever a conrmar que n ao existe uma func a a pr e-denida com o mesmo nome.

2.3

Vectores, matrices e tensores (hiper-matrices)

es de vectores: Consideremos as seguintes denic o >> a = [1 2 3 4 5], b = [6 7 8 9 10], c = [5;4;3;2;1] >> a.^3, d = a(:), e = b(:), f = fliplr(a), g = flipud(b) O comprimento de cada vector pode ser calculado com o comando >> length( a ), length( b ), length( c ), length( d ), length( e ) Compare com o comando >> size( a ), size( b ), size( c ), size( d ), size( e ) es entre alguns dos vectores Consideremos agora as seguintes operac o >> a + 1, b + 1, a*b, A = b*a, b.*c

es mostram a exibilidade do Matlab em somar o mesmo escalar As duas primeiras operac o a cada uma das componentes de um vector, seja ele um vector linha ou um vector coluna. A es, em que se multiplica um vector linha por um vector coluna, constitui um terceira destas operac o til da multiplicac o escalar de vectores: exemplo u a
N

ab=

an bn .
n=1

o de um vector O quarto exemplo permite obter a matrix A, obtida como resultado da multiplicac a ltimo exemplo mostra a maneira compacta com que o Matlab pode coluna por um vector linha. O u o das composer invocado para calcular um vector, cujas componentes resultam da multplicac a nentes dos vectores originais: cn = an bn . Os vectores acima indicador foram denidos componente por componente, mas o Matlab permite o eciente de vectores das maneiras seguintes: a gerac a

Cap tulo 2. Programac a o em Matlab >> x0 = 0, xN = 2*pi, N = 50, h = (xN-x0)/N >> x = [x0:h:xN], y = linspace(x0, xN, N), o da constante pi, predenida pelo Matlab: Repare-se na utilizac a >> format long, pi

27

equivalente a gerar os ( = 3,14159265358979). O comando usado para gerar o vector x e valores x1 = x0 , x2 = x0 + h , x3 = x0 + 2h , . . . , xN +1 = xN , com h = (xN x0 )/N . No segundo caso os valores do vector y s ao gerados da maneira seguinte: y1 = x0 , y2 = x0 + h , y3 = x0 + 2h , . . . , yN = xN , com h = (xN x0 )/(N 1). Para al em do comando linspace o utilizador pode gerar valores distribu dos logaritmicamente usando o comando logspace. es matriciVamos gerar agora algumas matrices para ver o Matlab lidar com algumas operac o ais: >> A = [a b c d e] >> A(1,:), A(:,1), A(1,[5 1 3]), diag(A), det(A), inv(A) O segundo e terceiro comandos indicam como seleccionar uma coluna ou linha espec ca da matriz (nos exemplos indicados tratou-se da primeira). No terceiro exemplo s ao seleccionados o ltimo resultado n 5o., 1o. e 3o. elementos da 1a. linha de A. O u ao nos deve surprender dada a depend encia linear das colunas de A, o que a torna numa matriz singular. Vamos gerar agora uma matrix regular usando o gerador de n umeros aleat orios do Matlab: >> A = rand(length(a)), det(A), inv(A) es matriciais: Consideremos agora as seguintes operac o >> B = A, C = A + sqrt( -1 )*B, D = C, E = C. es de transposic o e . devolveriam o mesmo resulNo caso de matrices reais as operac o a o dos elementos tado, mas no caso de matrices com elementos complexos da-se uma transposic a o simples (sem conjugac o). Nos conjugados, enquanto que no segundo caso da-se a transposic a a exemplos indicados as matrices s ao exibidas na linha de comandos tal como imaginadas pelo programador, mas internamente o Matlab armazena os elementos da matrix como se se tratase de um vector: >> A = [[1;2;3] [4;5;6] [7;8;9]], A(1:9) o de algumas matrices usadas frequentemente em c O Matlab permite igualmente a gerac a alculo matricial:

28 >> zeros( size(A) ), ones( size(A) ), eye( size(A) ) >> magic( length(a) ), hilb( length(a) )

2.4. Estruturas

o detalhada sobre os u ltimos dois comandos aconselha-se consultar o help Para obter informac a do Matlab: >> help magic, help hilb Acontece frequentemente no c alculo matricial lidar com matrices de grande tamanho, em que a maior parte dos elementos s ao nulos. Para lidar com este tipo de matrices de maneira eciente o o compacta da matriz com ajuda do comando sparse: Matlab permite uma representac a >> I = eye( 5 ), J = sparse( I ) o de hiper-matrices (i.e., Muitos problemas da F sica e da Matem atica requerem a manipulac a de tensores), os quais podem ser denidos de maneira imediata como dados do Matlab: >> clear C, A = [[1;2;3] [4;5;6] [7;8;9]], >> B = A, C(:,:,1) = A, C(:,:,2) = B O tratamento vectorial do Matlab extende-se inclusivamente aos dados denidos como cadeias de caracteres: >> c1 = Fisica, c2 = Computacional, c3 = 2005/2006, >> c1, c2, c3, c = [c1 , c2 , c3], char(c1,c2,c3)

2.4

Estruturas

o de estruturas: Tal como no C o Matlab permite a criac a >> aluno.nome=Pedro, aluno.numero = 2005, aluno.notas = [0 0 0] o orientada a objectos o dado aluno constitui um objecto, cuNo paradigma da programac a jas propriedades s ao constitu das pelo seu nome, numero e notas. Estas estruturas podem ser igualmente vectorizadas, tal como exemplicado a seguir: >> aluno(1).nome=Pedro; aluno(1).numero = 2005; aluno(1).notas = [0 0 0]; >> aluno(2).nome=Tiago; aluno(2).numero = 2006; aluno(2).notas = [0 0 0]; >> aluno(1), aluno(2) o Os elementos de uma estrutura podem corresponder inclusive a outras estruturas. Maior informac a o de estruturas pode ser consultada usando o comando sobre a manipulac a >> help struct

Cap tulo 2. Programac a o em Matlab

29

2.5
2.5.1

Ciclos
Ciclos incondicionais

Um ciclo incondicional em Matlab tem a forma geral for i = ... comando 1 comando 2 .... end Vejamos alguns exemplos concretos: >> >> >> >> >> >> for I = I = I = I = I = i = 1:11, a = i*i, end [1:11]; for i = I, a = i*i, end [11:-1:1]; for i = I, a = i*i, end [11:-0.2:1]; for i = I, a = i*i, end [11 5 3]; for i = I, a = i*i, end [11:-1:1]; for i = I, a(11-i+1) = i*i; end; a

Os ciclos incondicionais podem estar aninhados: >> for i = 1:11, for j = 1:11, a(i,j) = i*j; end; end, a

2.5.2

Ciclos condicionais

o ciclo if,...,end, que na sua O ciclo condicional usado com maior frequ encia em Matlab e forma mais simples tem a forma: if ... comando 1 comando 2 .... end Vejamos um exemplo: >> a = 0; b = a > 10; if b == 0, b = b + 1, end >> a = 20; b = a > 10; if b == 0, b = b + 1, end Neste exemplo foram usados os operadores l ogicos > (maior que) e == (id entico a). Outros operadores l ogicos s ao: < (menor que)

30 >= (maior ou igual que) <= (menor ou igual que) & and l ogico. | or l ogico. o l negac a ogica. Na sua forma mais elaborada o ciclo if,...,end tem a forma if ... comando 1 comando 2 .... elseif .... elseif .... else .... end Vejamos outro exemplo:

2.5. Ciclos

>> a = 0; b = a < 10, >> if b == 0, b = b + 1; elseif b == 0.5, b = b*b; else, b = b - 1; end, b o ciclo while,...,end, O segundo ciclo condicional usado com maior frequ encia em Matlab e que tem a forma: while ... comando 1 comando 2 .... end Vejamos um exemplo: >> n = 1; while n < 10, n = n + 1, end

Cap tulo 2. Programac a o em Matlab

31

2.6

Gr acos

O Matlab incorpora comandos de sa da gr aca bi e tridimensional, que podem ser manipulados de maneira eciente pelo programador para exibir os resultados dos seus c alculos. Vejamos alguns exemplos: >> >> >> >> >> >> >> >> >> >> >> >> >> >> N = 51; x = linspace(-2*pi,2*pi,N); y1 = sin(x); y2 = cos(x); plot(x,y1,x,y2), box on, grid on, title(O meu primeiro grafico em Matlab) plot(x,y1,x,y2,ro), box on, grid on plot(x,[y1;y2]), box on, grid on plot(x,[y1;y2]), legend(sin(x),cos(x)), box on, grid on y3 = sin(x)./x; plot(x,y3), xlabel(x), ylabel(sin(x)/x) figure(2) subplot(311), plot(x,y1) subplot(312), plot(x,y2) subplot(313), plot(x,y3) figure(3) subplot(131), plot(x,y1) subplot(132), plot(x,y2) subplot(133), plot(x,y3) o de uma curva param Vejamos a gerac a etrica: >> N = 51; t = linspace(0,2*pi,N); x = cos(t); y = sin(t); >> plot(x,y), box on, grid on, axis(equal) >> fill(x,y,b), axis(equal) Sugest ao: Experimente criar algumas das guras de Lissajous t picas, que podem ser geradas es: denindo parametricamente as coordenadas de um ponto no plano atrv es das equac o x(t) = cos(Kt + 1) e y (t) = cos(M t + 2 ) ,

onde K e M s ao n umeros inteiros. Para os valores K = M = 1 comece com os valores 1 = 2 = 0. Experimente depois 1 = 0, 2 = /2, 1 = 0, 2 = , 1 = 0, 2 = /4. Ap os ganhar es de valores. alguma experi encia tente outras combinac o o das capacidades de animac o do Matlab: Fac amos agora uma demonstrac a a >> >> >> >> >> >> N = 51; t = linspace(0,2*pi,N); x = cos(t); y = sin(t); close all for n = 1:N, figure(1), plot(x(1:n),y(1:n)); axis(equal); axis([-1 1 -1 1]); title(Trajectoria circular)

32 >> >> >> >> >> >> >> >> end N = 101; t = linspace(0,10*pi,N); x = cos(t); y = sin(t); z = t/(10*pi); for n = 1:N figure(2), plot3(x(1:n),y(1:n),z(1:n)); axis(equal); axis([-1 1 -1 1 0 1]); title(Trajectoria Helicoidal) ; end es tridimensionais: Vejamos como visualizar algumas func o >> >> >> >> >> >> >> >> >> >> >> N = 51; x = linspace(-1,1,N); y = linspace(-1,1,N); [X,Y] = meshgrid(x,y); Z = X.*exp( -X.^2 -Y.^2 ); figure(1), contour(x,y,Z) figure(2), contour(X,Y,Z) figure(3), pcolor(X,Y,Z), shading interp, colorbar figure(4), mesh(X,Y,Z), shading interp, colorbar figure(5), meshz(X,Y,Z), shading interp, colorbar figure(6), surf(X,Y,Z), shading interp figure(7), surfl(X,Y,Z), shading interp

2.7. Func o e-denidas es pr

o de algumas primitivas gr Vejamos agora a gerac a acas pr e-denidas no Matlab: >> >> >> >> >> >> >> >> >> >> close all, N = 51; [X,Y,Z] = sphere(N); figure(1), surfl(X,Y,Z), axis(equal) [X,Y,Z] = cylinder(ones([1 N]),N); figure(2), surfl(X,Y,Z), axis(equal) t = linspace(0,1,N); [X,Y,Z] = cylinder(exp(t)); figure(2), surfl(X,Y,Z), axis(equal) I = imread(ualg.jpg); warp(X,Y,Z,I);

2.7
2.7.1

es pr Func o e-denidas
es matem Func o aticas elementares e especializadas

es pr es elementares O Matlab possui um vasto conjunto de func o e-denidas. Dentre as func o destacam-se as seguintes:

Cap tulo 2. Programac a o em Matlab >> help matlab/elfun Trigonometric. sin - Sine. sinh - Hyperbolic sine. asin - Inverse sine. asinh - Inverse hyperbolic sine. cos - Cosine. cosh - Hyperbolic cosine. acos - Inverse cosine. acosh - Inverse hyperbolic cosine. tan - Tangent. tanh - Hyperbolic tangent. atan - Inverse tangent. atan2 - Four quadrant inverse tangent. atanh - Inverse hyperbolic tangent. sec - Secant. sech - Hyperbolic secant. asec - Inverse secant. asech - Inverse hyperbolic secant. csc - Cosecant. csch - Hyperbolic cosecant. acsc - Inverse cosecant. acsch - Inverse hyperbolic cosecant. cot - Cotangent. coth - Hyperbolic cotangent. acot - Inverse cotangent. acoth - Inverse hyperbolic cotangent. Exponential. exp log log10 log2 pow2 sqrt nextpow2 Complex. abs angle conj

33

Exponential. Natural logarithm. Common (base 10) logarithm. Base 2 logarithm and dissect floating point number. Base 2 power and scale floating point number. Square root. Next higher power of 2.

- Absolute value. - Phase angle. - Complex conjugate.

34 imag real unwrap isreal cplxpair -

2.7. Func o e-denidas es pr Complex imaginary part. Complex real part. Unwrap phase angle. True for real array. Sort numbers into complex conjugate pairs.

Rounding and remainder. fix - Round towards zero. floor - Round towards minus infinity. ceil - Round towards plus infinity. round - Round towards nearest integer. mod - Modulus (signed remainder after division). rem - Remainder after division. sign - Signum. es especiais pode ser simplicada usando o comando lookfor: A procura de func o >> lookfor bessel >> lookfor chebyshev >> lookfor hankel

2.7.2

Polin omios

o dos seus coecientes. Por exemplo, o O Matlab permite denir polin omios atrav es da denic a polin omio p(x) = x4 8x2 + 6x 10 pode ser denido e evaluado da maneira seguinte: >> >> >> >> >> >> >> >> >> coeficientes = [1 0 -8 6 -10]; x = [-3.5:0.1:3]; p = polyval(coeficientes,x); figure(1), plot(x,p), box on, grid on, hold on raizes = roots(coeficientes) for i = 1:length(raizes) k = isreal( raizes(i)); if k == 1, plot(raizes(i),0,o), end end hold off

Os coecientes do polin omio resultante do produto de dois polin omios pode ser calculado como se segue: >> coeficientes1 = [1 2 -4]; coeficientes2 = [1 0 3 -4]; >> coeficientes = conv(coeficientes1,coeficientes2);

Cap tulo 2. Programac a o em Matlab Dois comandos adicionais de grande utilidade s ao polyder: permite calcular a derivada de um polin omio.

35

polyfit: determina os coecientes do polin omio, que ajusta um conjunto discreto de dados, minimizando o erro quadr atico m edio.

2.7.3

o Interpolac a

o frequente em c o num Uma situac a alculo matricial consiste em determinar o valor de uma func a valor (ou valores) do argumento, que n ao fazem parte dos valores originais. Esta tarefa pode ser levada a cabo com ajuda do comando interp1: >> x = linspace(0,2*pi,11); y = sin( x ); >> xi = linspace(pi/2,pi,11); yi = interp1(x,y,xi);

2.7.4

o Zeros de uma func a

o pr o O comando fzero permite o c alculo dos zeros de uma func a e-denida, ou de uma func a es do comando: denida pelo utilizador. Por exemplo, o c alculo de 2 pode ser desenvolvido atrav >> fzero(x^2-2,[0 2],[],1)

2.7.5

C alculo aproximado de derivadas e integrais

O c alculo de derivadas pode ser desenvolvido utilizando os comandos denidos para lidar com os o menos elaborada: polin omios, ou usando uma aproximac a >> N = 51; x = linspace(0,2*pi,N); y = sin( x ); >> dydx = diff( y )./diff( x ); x2 = x(1:N-1) + diff( x )/2; >> figure(1), plot(x2,dydx) o desta aproximac o reside no facto da derivada n A limitac a a ao car denida nos mesmos pontos o original. em que se dene a func a Para o c alculo de integrais denidos existem os comandos seguintes: o e do seu argumento: trapz: permite o c alculo do integral a partir dos valores dados da func a >> N = 51; x = linspace(0,2*pi,N); y = sin( x ); I = trapz(x,y)

es denidas analiticamente: quad: permite o c alculo do integral de func o >> I = quad(sin,0,2*pi) Nos dois exemplos foi calculado o integral
2

I=
0

sin(x) dx .

36

2.8. Func o es denidas pelo utilizador

2.8

es denidas pelo utilizador Func o

es para al es Um programador pode denir as suas pr oprias func o em do vasto conjunto de func o es seguintes apresentam-se alguns exemplos com um grau pr e-denidas pelo Matlab. Nas secc o crescente de diculdade.

2.8.1

o quadr Ra zes de uma equac a atica

necess o que calcule as ra o quadr Imaginemos que e ario escrever uma func a zes da equac a atica ax2 + bx + c = 0 , usando a bem conhecida f ormula x 1 ,2 = b b2 4ac . 2a

o deve ser invocada com os dados de entrada a, b e c e deve devolver as ra A func a zes x1 e x2 , que eventualmente podem ser apresentadas como um vector com duas componentes. Como medida de o o programador deve evitar a aplicac o das f prevenc a a ormulas nos casos em que a = 0. Para levar o: a cabo esta tarefa o programador pode criar com um simples editor de texto a seguinte func a Listing 2.1: quadratica.m
function x = quadratica ( a , b , c )

d i s p ( S o r r y T o r d a r : t h i s f u n c t i o n i s o b s o l e t e ! u s e m a t l a b b u i l t i n p o l y n o m i a l f u n c t i o n return % % % % % % % % % D e t e r m i n a a s r a i z e s de uma e q u a c a o q u a d r a t i c a SINTAXE : x = q u a d r a t i c a ( a , b , c ) onde a , b e c c o r r e s p o n d e m a o s c o e f i c i e n t e s da e q u a c a o q u a d r a t i c a e x e um v e c t o r c o n t e n d o a s duas r a i z e s . E s c r i t o p o r O r l a n d o Camargo R o d r i g u e z

x = []; i f a = = 0 , d i s p ( O c o e f i c i e n t e a d e v e s e r d i f e r e n t e de z e r o ! ) , r e t u r n , end x ( 1 ) = ( b + s q r t ( bb 4 ac ) ) / ( 2 a ) ; x ( 2 ) = ( b s q r t ( bb 4 ac ) ) / ( 2 a ) ;

o do Matlab, denida pela sintaxe Este exemplo particular ilustra o aspecto t pico de uma func a % Comentarios % ..

Cap tulo 2. Programac a o em Matlab function dados_de_saida = nome_da_funcao( dados_de_entrada ) comandos .....

37

o pode ser invocada como se segue: Na linha de comandos do Matlab a func a >> >> >> >> quadratica(0,1,1) quadratica(1,0,-2) quadratica(1,-4,3) quadratica(1,1,3)

o que demonstra a facilidade com que o Matlab permite obter as ra zes, sejam elas reais, ima o deste m-file foram tidas em contas as seguintes guias de gin arias ou complexas. Na criac a o: programac a o referente ao autor, Coment arios: indique no cabec alho, e ao longo do programa, informac a o, prop data de criac a osito do programa e etapas dos c alculos. o: na medida do poss es em que o programa pode car bloqueado, Prevenc a vel evite situac o es imposs como no caso de uma divis ao por zero, condic o veis num ciclo condicional ou dados cujos valores n ao s ao actualizados apropriadamente ao longo dos c alculos. Portabilidade: n ao use acentos nos coment arios e muito menos nos nomes dos m-files. As tabelas de caracteres ASCII s ao reconhecidas por qualquer computador, enquanto que a o de caracteres regionais varia de pa representac a s para pa s. o s Os nomes atribu dos aos dados denidos dentro de uma func a ao dados locais, i.e., s ao dados o decorre de maneira transparente para o programador, sem que interferam com cuja manipulac a o. Esta vantagem de programac o permite que os dados criados pelo programa que invoca a func a a o programador use nomes iguais para dados diferentes, e torna o c odigo escrito em Matlab f acil de adaptar e modicar quando tal se torna necess ario.

2.8.2

Pol gonos inscritos e circunscritos

o, que ilustra o m Imaginemos que se pretende fazer uma animac a etodo usado por Arquimedes para calcular os limites inferior e superior de , construindo pol gonos inscritos e circunscritos o que dena os v num c rculo de raio unidade. E preciso criar uma func a ertices de cada pol gono, a partir do n umero de lados N . O c rculo de raio unidade pode ser calculado como um pol gono o com N com um valor grande de N . Cada pol gono inscrito pode ser calculado invocando a func a o as coordenadas do pol = 3, 4, 5 lados, etc.. Em cada passo da animac a gono circunscrito podem ser calculadas multiplicando as coordenadas do pol gono inscrito pelo factor k = sin (/2) / sin (/2 /N ) .

38

2.8. Func o es denidas pelo utilizador

o do m-file deve prevenir-se o caso em que a func o e invocada para N = 1 ou N = 2. Na criac a a um exemplo particular da func o pretendida. O m-file poligono.m e a

Cap tulo 2. Programac a o em Matlab Listing 2.2: poligono.m


function [ x , y ] = poligono ( N ) % % % % % % % % C o o r d en a d a s de um p o l i g o n o r e g u l a r de N l a d o s SINTAXE : [ x , y ] = p o l i g o n o ( N ) onde N r e p r e s e n t a o numero de l a d o s e x , y correspondem as coordenadas dos v e r t i c e s . E s c r i t o p o r O r l a n d o Camargo R o d r i g u e z

39

x = []; y = []; i = sqrt ( 1 ) ; i f N < 3 , d i s p ( Nao e x i s t e m p o l i g o n o s com menos de 3 l a d o s ! ) , r e t u r n , end d e l t a t h e t a = 2 p i /N; t h e t a = [ 0 : d e l t a t h e t a :2 pi ] ; z = exp ( i t h e t a ) ; x = real ( z ) ; y = imag ( z ) ;

40

2.8. Func o es denidas pelo utilizador o pretendida pode ser escrita tal como mostrado pelo script arquimedes.m. A animac a Listing 2.3: arquimedes.m

% Animacao i l u s t r a n d o a b a s e do metodo u s a d o p o r A r q u i m e d e s % p a r a c a l c u l a r o s l i m i t e s s u p e r i o r e i n f e r i o r de p i . % D e t e r m i n e a s c o o r d e n a d a s do c i r c u l o u n i t a r i o : [ xc , yc ] = p o l i g o n o ( 5 1 ) ; % I n d i q u e o numero de l a d o s que cada p o l i g o n o v a i t e r : N = [4:30]; % O . K . : m o s t r a r animacao : for n = N [ xp , yp ] = p o l i g o n o ( n ) ; k = sin ( pi / 2 ) / sin ( pi /2 pi / n ) ; xo = k xp ; yo = k yp ; figure (1) p l o t ( xc , yc , k , xp , yp , b , xo , yo , r ) , box on , g r i d on axis ( equal ) a x i s ([ s q r t ( 2 ) s q r t ( 2 ) s q r t ( 2 ) s q r t ( 2 ) ] ) pause ( 1 ) end

o poligono.m para que calcule as coordenadas de uma elipse, Sugest ao: Modique a func a centrada no ponto (x0 , y0 ), com os valores a e b dos semi-eixos.

Cap tulo 2. Programac a o em Matlab

41

2.8.3

Rodando guras no plano

o de um ponto com coorUma f ormula bem conhecida do Geometria Anal tica indica que a rotac a ngulo pode ser representada na seguinte forma matricial: denadas (x, y ) num a x y = cos sin sin cos x y ,

o. O programador pretende onde (x , y ) representam as coordenadas do ponto ap os a sua rotac a o que ao ser invocada com os dados vectoriais x e y , e o dado escalar theta devolve criar uma func a o. Deve ser dada a devida atenc o ao facto dos vectores as coordenadas respectivas ap os a sua rotac a a o o x e y possuirem o mesmo n umero de elementos. Para testar o funcionamento da sua func a o, em que verica a rotac o progressiva de um pent programador decide criar uma animac a a agono. o de rotac o. O m-file rotacao.m constitui um exemplo particular de como criar a func a a Listing 2.4: rotacao.m
function [ xr , yr ] = rotacao ( x , y , t h e t a ) % % % % % % % % % R o t a c a o de um p o n t o no p l a n o num a n g u l o t h e t a . SINTAXE : [ x r , y r ] = r o t a c a o ( x , y , t h e t a ) onde x , y r e p r e s e n t a m a s c o o r d e n a d a s d o s p o n t o s o r i g i n a i s e xr , yr re pre se nta m as coordenadas dos p o n t o s apos r o t a c a o . E s c r i t o p o r O r l a n d o Camargo R o d r i g u e z

xr = [ ] ; yr = [ ] ; % V e r i f i q u e que o s v e c t o r e s x e y p o s s u i m o mesmo numero de % elementos : lx = length ( x ) ; ly = length ( y ) ; i f lx = ly d i s p ( As c o o r d e n a d a s x e y devem p o s s u i r o mesmo numero de e l e m e n t o s ! ) , return end R = [ cos ( t h e t a ) sin ( t h e t a ) ; sin ( t h e t a ) cos ( t h e t a ) ] ; for n = 1 : lx r = R [ x ( n ) ; y ( n ) ] ; xr ( n ) = r ( 1 ) ; yr ( n ) = r ( 2 ) ;

42

2.8. Func o es denidas pelo utilizador

end

o pretendida. Seguidamente, o script rotacao pentagono.m mostra como gerar a animac a Listing 2.5: rotacao pentagono.m
% D e t e r m i n e a s c o o r d e n a d a s do p e n t a g o n o : [ xp , yp ] = p o l i g o n o ( 5 ) ; % I n d i q u e o s a n g u l o s de r o t a c a o : N = 5 0 1 ; t h e t a = l i n s p a c e ( 0 , 2 pi ,N) ; % O . K . : m o s t r a r animacao : for n = 1 :N [ x , y ] = r o t a c a o ( xp , yp , t h e t a ( n ) ) ; figure (1) p l o t ( xp , yp , b , x , y , r ) , box on , g r i d on axis ( equal ) axis ([1 1 1 1]) end

Sugest oes: o ilustrando a vis tomo de hidrog 1. Crie uma animac a ao cl assica de um a enio, com um electr ao rbita circular em torno de um prot azul a descrever uma o ao cinzento. o ilustrando a n es de deslocamento e rotac o. 2. Crie uma animac a ao-comutatividade das operac o a Isto pode ser feito mostrando o que acontece com um pol gono regular de N lados, quando e ngulo , e transladado a seguir; a segunda operac o mostra o que rodado num determinado a a deslocado primeiro e rodado depois. acontece com o mesmo pol gono quando e es de deslocamento, escala, rotac o a ` volta da origem, torc o em relac o ao 3. As operac o a a a o em relac o ao eixo Y de um ponto no plano com coordenadas (x, y ), eixo X e torc a a o podem ser representadas de maneira compacta atrav es da operac a

uma matrix de tamanho 3 3, com a seguinte estrutura: onde M e a11 a12 a13 M = a21 a22 a23 . 0 0 1

x x y = M y , 1 1

Cap tulo 2. Programac a o em Matlab Os coecientes da matriz podem ser denidos para cada um dos casos como se segue: Deslocamento: 1 0 x0 M = 0 1 y0 . 0 0 1 sx 0 0 M = 0 sy 0 . 0 0 1

43

Escala:

o a ` volta da origem do sistema de coordenadas: Rotac a

cos sin 0 M = sin cos 0 . 0 0 1 o em relac o ao eixo X : Torc a a 1 tan 0 1 0 M= 0 . 0 0 1 o em relac o ao eixo Y : Torc a a 1 0 0 M = tan 1 0 . 0 0 1 es pode ser representada na forma Uma sequ encia de transformac o

x x y = M1 M2 . . . y , 1 1 o, cujos dados de entrada s o Dena uma func a ao as coordenadas dos pontos, o tipo de transformac a (acompanhado do par ametro que f or necess ario), e cujos dados de sa da s ao as coordenadas o. Teste o funcionamento da func o dos pontos transformados e a matriz de transformac a a o poligono.m. com ajuda da func a

2.8.4

Coordenadas de uma seta tridimensional

O programador pretende criar um m-file que seja invocado com os dados de entrada r1 e r2, que denem as coordenadas de dois pontos no espac o tridimensional, e devolva como dado de sa da o o programador as coordenadas de uma seta que liga os dois pontos entre si. Para gerar esta func a decide seguir a seguinte estrat egia: 1. Cria uma seta no plano XZ , com as coordenadas indicadas na Fig.2.1. 2. Determina o vector d = r2 r1 .

44 3. Determina as coordenadas esf ericas de d. 4. Multiplica as coordenadas da seta unit aria por |d|. 5. Orienta o vector resultante segundo d. 6. Desloca o vector resultante para r1 .

2.8. Func o es denidas pelo utilizador

0.3

0.2

0.1

0.1

0.2

0.3

0.1

0.2

0.3

0.4

0.5

0.6

0.7

0.8

0.9

Figura 2.1: Coordenadas da seta unit aria usada no m-file seta.m. o da func o com vectores que n O programador deve evitar a invocac a a ao sejam tridimensionais. o pretendida. O m-file seta.m constitui um exemplo da func a

Cap tulo 2. Programac a o em Matlab Listing 2.6: seta.m


f u n c t i o n [ xs , ys , zs ] = s e t a ( r1 , r2 ) % C o o r d en a d a s de uma s e t a t r i d i m e n s i o n a l . % % SINTAXE : [ x , y , z ] = s e t a ( r 1 , r 2 ) % % E s c r i t o p o r O r l a n d o Camargo R o d r i g u e z xs = [ ] ; ys = [ ] ; zs = [ ] ; r1 = r1 ( : ) ; r2 = r2 ( : ) ; % V e r i f i c a r que r 1 e r 2 s a o v e c t o r e s 3D: l1 = length ( r1 ) ; l2 = length ( r2 ) ;

45

i f l 1 = 3 , d i s p ( O p r i m e i r o v e c t o r d e v e s e r um v e c t o r 3D ! ) , r e t u r n , end i f l 2 = 3 , d i s p ( O s e g u n d o v e c t o r d e v e s e r um v e c t o r 3D ! ) , r e t u r n , end % D e f i n i r uma s e t a u n i t a r i a no p l a n o XZ : xs = [ 0 0 0.9 0.9 1 0.9 0.9 0 0]; zs = [ 0 0 . 0 5 0 . 0 5 0 . 1 0 0 . 1 0 . 0 5 0 . 0 5 0 ] ; ys = zeros ( s i z e ( xs ) ) ; % D e t e r m i n a r a s c o o r d e n a d a s e s f e r i c a s do v e c t o r d i f e r e n c a : d e l t a r = r2 r1 ; [ t h e t a , phi , r ] = cart2sph ( d e l t a r ( 1 ) , d e l t a r ( 2 ) , d e l t a r ( 3 ) ) ; % M u l t i p l i c a r o v e r s o r p e l o modulo do v e c t o r d i f e r e n c a : xs = xs r ; ys = ys r ; zs = zs r ; % O r i e n t a r o v e c t o r r e s u l t a n t e segundo o v e c t o r d i f e r e n c a : [ t h e t a s , p h i s , r s ] = cart2sph ( xs , ys , zs ) ; [ xs , ys , zs ] = sph2cart ( t h e t a s + t h e t a , p h i s + phi , r s ) ; % D e s l o c a r o v e c t o r r e s u l t a n t e p a r a a s c o o r d e n a d a s do p o n t o i n i c i a l : xs = xs + r1 ( 1 ) ; ys = ys + r1 ( 2 ) ; zs = zs + r1 ( 3 ) ;

46

2.8. Func o es denidas pelo utilizador o pode ser vericado construindo um sistema de eixos ortogonais: O funcionamento da func a

>> >> >> >> >>

o = [0 0 0]; ex = [1 0 0]; ey = [0 1 0]; ez = [0 0 1]; [xX,yX,zX] = seta(o, ex); [xY,yY,zY] = seta(o, ey); [xZ,yZ,zZ] = seta(o, ez); fill3(xX,yX,zX,y,xY,yY,zY,b,xZ,yZ,zZ,r), axis(equal) Sugest oes: o ilustrando a soma de dois vectores com m 1. Crie uma animac a odulos iguais. No decorrer o o primeiro vector deve permanecer xo, sempre orientado segundo a mesma da animac a o e sentido, enquanto que o segundo vector deve ir rodando progressivamente at direcc a e o completa. concluir uma revoluc a o mostrando a traject 2. Crie uma animac a oria de um proj ectil, assim como o correspondente o, vector velocidade e vector acelerac o. vector posic a a 3. Modique o m-file para que permita um maior controlo do aspecto da seta, como por ngulo da cabec exemplo o tamanho e o a a, a sua altura, etc..

Cap tulo 2. Programac a o em Matlab

47

2.8.5

Produto externo de vectores

o particular do C O produto externo de vectores constitui uma operac a alculo Vectorial, de grande o denida como utilidade pr atica e te orica para a F sica. Trata-se de uma operac a

ex ey ez ay

ab= ax

bx by bz

az = az b x ax b z

ay bz az by

ax b y ay b x

o, que ao ser invocada com os dados de entrada x e y O programador pretende criar uma func a devolva um vector tridimensional, cujas componentes s ao calculadas atrav es das express oes acima o da func o deve vericar-se que os dados de entrada correspondem a vectores indicadas. Na criac a a o o programador deve criar uma animac o, em que mostra tri-dimensionais. Para testar a func a a o de dois vectores unit com setas a orientac a arios de entrada, e o correspondente vector de sa da. O primeiro vector de entrada deve ser um vector unit ario orientado ao longo do eixo X ou do eixo Y , enquanto que o segundo vector comec a por coincidir com o primeiro vector, mas depois o tenha sido programada correctamente o vai rodando progressivamente no plano. Caso a func a produto externo dever a comportar-se como um vector vertical, cujo m odulo varia progressivamente entre 0 e 1, para al em de mudar de sentido. O m-file mostrado no listing produto externo.m constitui um exemplo de como criar a o pretendida. func a

48

2.8. Func o es denidas pelo utilizador

function a times b = produto externo ( a , b ) ; d i s p ( S o r r y T o r d a r , t h i s f u n c t i o n i s o b s o l e t e ! u s e M a t l a b b u i l t i n c r o s s f u n c t i o n ! ) return % % % % % % P r o d u t o e x t e r n o ( ou p r o d u t o v e c t o r i a l ) entre dois vectores SINTAXE : a t i m e s b = p r o d u t o e x t e r n o ( a , b ) E s c r i t o p o r O r l a n d o Camargo R o d r i g u e z

l = length ( a ) ; i f l = 3 , d i s p ( O p r i m e i r o v e c t o r nao e t r i d i m e n s i o n a l ! ) , r e t u r n , end l = length ( b ) ; i f l = 3 , d i s p ( O s e g u n d o v e c t o r nao e t r i d i m e n s i o n a l ! ) , r e t u r n , end a times b = zeros ( s i z e ( a ) ) ; a times b ( 1 ) = a (2) b (3) a (3) b ( 2 ) ; a times b ( 2 ) = a (3) b (1) a (1) b ( 3 ) ; a times b ( 3 ) = a (1) b (2) a (2) b ( 1 ) ;

Listing 2.7: produto externo.m

Cap tulo 2. Programac a o em Matlab o o programador pode criar o script, mostrado no listing testarpe.m. Para testar a func a
% D e f i n i r a o r i g e m do s i s t e m a de r e f e r e n c i a % e o v e r s o r segundo X: o = [0 0 0]; ex = [ 1 0 0 ] ; % Gerar a s c o o r d e n a d a s do v e c t o r o r i e n t a d o s e g u n d o o e i x o X : [ xa , ya , z a ] = s e t a ( o , ex ) ; % I n d i c a r o s a n g u l o s de r o t a c a o : N = 5 0 1 ; t h e t a = l i n s p a c e ( 0 , 2 pi ,N) ; % D e f i n i r tambem um c i r c u l o u n i t a r i o % para mostrar a t r a j e c t o r i a : [ x t , y t ] = p o l i g o n o (N ) ; z t = z e r o s ( s i z e ( x t ) ) ; xt = f l i p l r ( xt ) ; yt = f l i p l r ( yt ) ; % O . K . : m o s t r a r animacao : for n = 1 :N [x , y ] = rotacao (1,0, theta (n ) ) ; a t i m e s b = p r o d u t o e x t e r n o ( [ x y 0 ] , ex ) ; [ xb , yb , zb ] = s e t a ( o , [ x y 0 ] ) ; [ xc , yc , z c ] = s e t a ( o , [ a t i m e s b ( 1 ) a t i m e s b ( 2 ) a t i m e s b ( 3 ) ] ) ; figure (1) p l o t 3 ( x t ( 1 : n ) , y t ( 1 : n ) , z t ( 1 : n ) , . ) , h o l d on f i l l 3 ( xa , ya , z a , y , xb , yb , zb , b , xc , yc , z c , r ) axis ([1 1 1 1 1 1]) hold o f f end Listing 2.8: testarpe.m

49