Академический Документы
Профессиональный Документы
Культура Документы
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
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
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
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
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
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
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
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.
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 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
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
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
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 )
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
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
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
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.
41
2.8.3
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
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:
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
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 .
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
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..
47
2.8.5
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
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 ) ;
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