Escolar Documentos
Profissional Documentos
Cultura Documentos
=
= +
1
9
1 3
2 5
*
1 3
9 2 5
X B X A
b a
b a
>> A = [ 5 2 ; 3 - 1 ]
B = [ 9 ; 1 ]
A =
5 2
3 - 1
B =
9
1
>> mat r i z_x = l i nsol ve( A , B )
mat r i z_x =
1
2
Temos tambm um pouco de Clculo Funcional (operaes sobre matrizes N x
N, usadas geralmente para resolver sistemas diferenciais).
Operao Funo
Raiz Quadrada de Matriz matriz2 = sqrtm( matriz1 )
Exponencial de Matriz matriz2 = expm( matriz1 )
Logaritmo de Matriz matriz2 = logm( matriz1 )
Trigonomtricas de Matriz
matriz2 = funm( matriz1 , @SIN )
matriz2 = funm( matriz1 , @COS )
matriz2 = funm( matriz1 , @SINH )
matriz2 = funm( matriz1 , @COSH )
4.5 Clculo Diferencial e Integral
24
Primeiramente convm lembrar mais uma vez que o MatLab uma excelente
ferramenta para nmeros. Portanto comearemos com as funes que fazem o Clculo
Numrico.
Operao Funo
Derivada Numrica vet_derivada = diff( vet_funcao ) /
valor_passo
Integral Definida Numrica
(quadrature)
valorIntegral = quad( funcao , tempoIni ,
tempoFim )
Resoluo Numrica de Equao ou
Sistema Diferencial de 1. Ordem
[vet_tempo vet_y] = ode45( funcao , [
tempoIni tempoFim ] , vet_condIni )
<onde y = funo>
Calma que a gente explica com exemplos.
A funo diff apenas retorna as subtraes de cada elemento do vetor com o
elemento anterior. Lembrando que a definio da derivada
t
t y t t y
t
dt
dy
t
+
=
) ( ) (
lim ) (
0 0
0 0
,
podemos calcul-la com o resultado da funo diff dividido pelo intervalo dum
infinitesimal um valor suficientemente pequeno.
exemplo: derivada de y = cos( t ) * t, do instante 0 a 5s
>> dt = 0. 001 ;
>> vet _t = 0 : dt : 5 ;
>> vet _y = cos( vet _t ) . * vet _t ;
>> vet _der i vada = di f f ( vet _y ) / dt ;
A funo quad usa um mtodo de Simpson alternativo e recebe um parmetro
funo que pode ser passado por string ou numa referencia a alguma funo j existente
em arquivo .m.
exemplo: calcular a integral da funo anterior no mesmo intervalo de tempo
>> quad( ' cos( t ) . * t ' , 0 , 5 )
ans =
- 5. 5110
Resolver equaes ou sistemas diferenciais j um pouco mais complicado.
Comecemos com um exemplo simples. Para resolver a equao
) cos( ) ( ) ( ' 2 t t y t y = + , com 10 ) 0 ( = y
e obter os valores de y de 0 a 5s, precisamos antes de tudo isolar o termo de primeira
ordem. Isto , escrever
25
( ) ) ( ) cos(
2
1
) ( ' t y t t y = .
Agora precisamos criar uma funo auxiliar no Editor de Texto ele ser
abordado com mais calma no captulo 6. V em File > New > M File e digite o
seguinte:
f unct i on r et or no = f uncao ( t empo , y )
r et or no = ( cos( t empo ) - y ) / 2 ;
Salve o arquivo como funcao.m.
Da digitamos o seguinte comando:
>> t empoI ni ci al = 0 ;
>> t empoFi nal = 5 ;
>> condi caoI ni ci al = 10 ;
>> [ vet _t empo , vet _y ] = ode45( @f uncao , [ t empoI ni ci al
t empoFi nal ] , condi caoI ni ci al ) ;
Para equaes de ordem superior, o segredo transform-la num sistema de
equaes de 1 ordem. Vejamos o exemplo.
) cos( ) ( 6 ) ( ' 5 ) ( ' ' t t y t y t y = + + , com 10 ) 0 ( = y e 0 ) 0 ( ' = y
Reescrevendo para a forma de um sistema (fazemos y(t) = x(t) e, portanto, y(t)
= x(t)) e j isolando os termos de 1 ordem, teramos o seguinte.
) ( ) ( ' t x t y = , com 10 ) 0 ( = y
) ( 6 ) ( 5 ) cos( ) ( ' t y t x t t x = , com 0 ) 0 ( ' ) 0 ( = = y x
Repetimos o que fizemos no caso anterior: criamos uma funo auxiliar no
Editor de Texto, acrescentando alguns detalhes. Veja que o segundo parmetro da
funo agora um vetor com as variveis x e y estabeleceremos que o primeiro
elemento ser relativo a x(t) e o segundo a y(t).
f unct i on vet _r et or no = f uncao ( t empo , vet _var )
vet _r et or no = zer os( 2 , 1 ) ;
vet _r et or no( 1 ) = cos( t empo ) - 5 * vet _var ( 1 ) - 6 *
vet _var ( 2 ) ;
vet _r et or no( 2 ) = vet _var ( 1 ) ;
Salve o arquivo como funcao.m.
Da digitamos o seguinte comando:
>> t empoI ni ci al = 0 ;
>> t empoFi nal = 5 ;
>> vet _condi caoI ni ci al = [ 0 10 ] ;
>> [ vet _t empo , vet _var ] = ode45( @f uncao , [ t empoI ni ci al
t empoFi nal ] , vet _condi caoI ni ci al ) ;
26
Os valores de x e y estaro respectivamente em vet_var( : , 1 ) e vet_var( : , 2 ).
O MatLab vem com uma ferramenta bem mais interessante para a resoluo de
sistemas diferenciais: o Simulink. No entanto, este guia no tratar do assunto, j que
ele abordado em outras matrias de engenharia.
Alm do clculo numrico, existe uma biblioteca de funes que trabalha com
smbolos e literais, o que permite obter derivada e integral indefinidas e resolver
equaes diferenciais. Entretanto ressalta-se novamente que, para essa finalidade, o uso
do Maple recomendado.
Operao Funo
Declarar Smbolo Literal syms nomeSimbolo
Calcular Derivada de uma Expresso
(ou derivada parcial)
(ou derivada de ordem N)
diff( expressao )
diff( expressao , variavel )
diff( expresso, N )
Calcular Integral de uma Expresso
(ou integral com respeito a uma varivel)
(ou integral definida de A a B)
int( expressao )
int( expressao , variavel )
int( expresso, A , B )
Resolver Equao Diferencial dsolve( equacao )
dsolve( equacao , condicoesIniciais )
exemplo 1: calcular derivada segunda e integral de
2
1 x
t
+
com respeito a x
>> syms x ;
>> syms t ;
>> symb_expr essao = t / ( 1 + x^2 )
symb_expr essao =
t / ( 1+x^2)
>> di f f ( symb_expr essao , x , 2 )
ans =
8*t / ( 1+x^2) ^3*x^2- 2*t / ( 1+x^2) ^2
>> i nt ( symb_expr essao , x )
ans =
t *at an( x)
exemplo 2: resolver com ) ( ) ( ' t ay t y = 1 ) 0 ( = y
>> symb_y = dsol ve( ' Dy = - a*y' , ' y( 0) = 1' )
symb_y =
exp( - a*t )
27
4.6 Sinais e Sistemas
Se voc pegou este guia apenas porque tem que fazer um trabalho de ELE 1030
Sinais e Sistemas, esta a sua chance! S espero que outras partes desse guia tenham
sido lidas tambm, porque seno no vai adiantar de muita coisa.
Conforme dito anteriormente, o MatLab no muito forte com expresses
literais, mas sim com as numricas. Ento todas as transformadas e funes de
transferncia sero aplicadas para um conjunto de pontos finitos, e no para outras
funes ou sistemas.
A tabela abaixo resume as funes mais interessantes. Exemplos com elas viro
na seqncia.
Operao Funo
Montar Funo de Transferncia
H = tf( vet_coef_num , vet_coef_denom )
< numerador e do denominador com
polinmios de s>
Resposta ao Degrau
step( H )
step( H , vet_tempo )
[vet_Y vet_tempo] = step( H )
Resposta ao Impulso
impulse( H )
impulse( H , vet_tempo )
[vet_Y vet_tempo] = impulse( H )
Resposta a Entradas Genricas
lsim( H , vet_X , vet_tempo )
vet_Y = lsim ( H , vet_X , vet_tempo )
Diagrama de Bode bode( H )
Transformada Discreta de Fourier
(Fast Fourier Transform)
vet_XF = fft( vet_X )
<a primeira metade de vet_XF
corresponde s freqncias positivas>
exemplo 1: circuito RC srie
5
5
1
1
+
=
+
= =
s
RC
s
RC
V
V
H
C
C
A partir da funo de transferncia encontrada via anlise do circuito, obteremos
a resposta da tenso no capacitor para entradas impulso, degrau e exponencial
decrescente na fonte.
>> Hc = t f ( [ 5 ] , [ 1 5 ] )
Tr ansf er f unct i on:
5
- - - - -
s + 5
28
>> i mpul se( Hc ) ;
>> st ep( Hc ) ;
>> vet _t empo = [ 0 : 0. 001 : 3. 5 ] ;
>> l si m( Hc , exp( - 1 * vet _t empo ) , vet _t empo ) ;
29
Os grficos gerados so esses acima. Confira que as curvas condizem com as
expresses tericas (fica como exerccio a demonstrao).
exemplo 2: anlise de uma funo de transferncia genrica
) 1000 ( ) 100 )( 10 (
) 10000 ( ) 1 ( 250
) (
2
2
+ + +
+ +
=
s s s
s s s
s H
Para obtermos o diagrama de Bode, temos que montar a funo de transferncia
primeiro, como no exemplo anterior. Entretanto, os polinmios do numerador e
denominador no esto desenvolvidos (temos a forma fatorada, ao invs disso). A fim
de evitar dois trabalhos de distributivas, basta usar a funo poly apresentada em 4.3,
que retorna os coeficientes do polinmio dadas as razes (cuidado: as razes duplas
devem ser passadas duas vezes!).
>> vet _r ai zesNumer ador = [ 0 1 1 10000 ] ;
>> vet _r ai zesDenomi nador = [ 10 100 100 1000 ] ;
>> vet _coef Pol i nomi oNumer ador = 250 * pol y( vet _r ai zesNumer ador ) ;
>> vet _coef Pol i nomi oDenomi nador = pol y( vet _r ai zesDenomi nador ) ;
>> H = t f ( vet _coef Pol i nomi oNumer ador , vet _coef Pol i nomi oDenomi nador )
Tr ansf er f unct i on:
250 s^4 - 2. 501e006 s^3 + 5e006 s^2 - 2. 5e006 s
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
s^4 - 1210 s^3 + 222000 s^2 - 1. 21e007 s + 1e008
>> bode( H ) ;
30
exemplo 3: mdulo da transformada de fourier de rect( t ):
>> vet _y = [ zer os( 1 , 100 ) ones( 1 , 10 ) zer os( 1 , 100 ) ] ;
>> vet _Y = f f t ( vet _y ) ;
>> vet _modul oY = abs( vet _Y ) ;
>> pl ot ( vet _modul oY( 1 : 105 ) ) ;
Completando a anlise de Sinais e Sistemas, apresentamos uma das vrias
opes de filtros existentes no MatLab.
Operao Funo
Construir Filtro de Ordem
N e Freqncia de Corte
Wc (ou passa-banda entre
W1 e W2)
[ vet_coefNum vet_coefDenom = butter( N , Wc , low)
[ vet_coefNum vet_coefDenom = butter( N , Wc , high)
[ vet_coefNum vet_coefDenom = butter( N , [W1 W2] )
Aplicar Filtro num Sinal vet_y = filter( vet_coefNum , vet_coefDenom , vet_x )
4.7 Outras Funes
31
Algumas opes para fatoraes e nmeros primos:
Operao Funo
Fatorar um Nmero vet_fatores = factor( numero )
Mnimo Mltiplo Comum MMC
(Least Common Multiple LCM)
mmc = lcm( num1, num2 )
vet_mmc = lcm( vet1 , vet2 )
matriz_mmc = lcm( matriz1 , matriz2 )
Mximo Divisor Comum MDC
(Greatest Common Divider GCD)
mdc = gcd( num1, num2 )
vet_mdc = gcd( vet1 , vet2 )
matriz_mdc = gcd( matriz1 , matriz2 )
Checar se um nmero ou os elementos de
um vetor ou matriz so primos
(retorno: 0 = no primo, 1 = primo)
condicao = isprime( numero )
vet_condicoes = isprime( vet )
mat_condicoes = isprime( matriz )
Obter Nmeros Primos Menores ou Iguais
a N
vet_primos = primes( N )
OBS: as funes de MMC e MDC fazem a operao sobre 2 nmeros de cada
vez (no caso de vetores, sobre o 1 elemento de um com o 1 elemento do outro, e assim
sucessivamente, retornando um vetor de MMC / MDC). Para fazer com 3 ou mais
nmeros juntos, chame a funo mais de uma vez (exemplo: MMC entre 4, 5 e 12
mmc = lcm( lcm( 4 , 5 ) , 12 ) ).
Agora, algumas opes para gerar nmeros aleatrios:
Operao Funo
Gerar Matriz M x N com Elementos em
Distribuio Uniforme entre 0 e 1
matriz = rand( M , N )
Gerar Matriz M x N com Elementos em
Distribuio Normal (Gaussiana) com
mdia 0 e
2
= 1
matriz = randn( M , N )
Gerar Nmeros numa Distribuio
Qualquer
numero = random( string_Distrib , ... )
< consulte help random para maiores
detalhes >
Embora no se possam declarar nmeros em outras bases numricas, o MatLab
possui funes de converso entre elas, atravs do uso de strings.
Converso de Bases Funes
Binrio Decimal
Decimal Binrio
numDecimal = bin2dec( string_numBinario )
string_numBinario = dec2bin( numDecimal )
Hexadecimal Decimal
Decimal Hexadecimal
numDecimal = hex2dec( string_numHexa )
string_numHexa = dec2hex( numDecimal )
Hexadecimal Double
Double Hexadecimal
(modo como nmeros reais so
armazenados na memria dum
computador)
numDouble = hex2num( string_numHexa )
string_numHexa = num2hex( numDouble )
< string_numHexa deve ter 16 caracteres (tendo
menos, zeros so acrescentados direita) >
32
Captulo 5 Plotando Grficos
5.1 A Famlia de Funes para Plotar
O MatLab oferece inmeras opes para criarmos e editarmos grficos.
Veja na tabela abaixo, primeiramente, algumas funes para plotarmos.
Modo de Plotar Funo
Ligando Pontos plot( vet_x , vet_y )
Barras bar( vet_x , vet_y )
Valores Discretos Isolados stem( vet_x , vet_y )
Degraus stairs( vet_x , vet_y )
Log-Log (base 10) loglog( vet_x , vet_y )
Semi-Log (base 10)
(s x ou y com eixo logartmico)
semilogx( vet_x , vet_y )
semilogy( vet_x , vet_y )
Coordenadas Polares polar( vet_theta , vet_raio )
Tomemos como exemplo os vetores vet_x e vet_y a seguir:
>> vet _x = 0 : 0. 5 : 5 ;
vet _y = si n( vet _x ) ;
Se plotssemos esses pontos com as 4 primeiras funes, teramos o seguinte:
Podemos desenhar uma espiral com as coordenadas polares
33
>> vet _r ai o = 0 : 0. 001 : 1 ;
vet _t het a = 0 : 6*pi / 1000 : 6*pi ;
>> pol ar ( vet _t het a , vet _r ai o ) ;
No acabou no. Tem mais funes para plotar.
Modo de Plotar Funo
Ligando Pontos e Preenchendo rea
Abaixo do Grfico
area( vet_x , vet_ y )
Segurar / Soltar Grfico para Plotar
Mais de uma Curva Juntas
hold
hold on
hold off
Criar Nova Janela de Grfico figure
Dividir Janela de Plotagem em M x N
Partes e Selecionar Parte P
subplot( M , N , P )
Grfico Estatstico de Fatias de Pizza
(Pie Chart)
pie( vet_valores )
pie( vet_valores , vet_fatiasSobressaidas )
Grfico de Cores (para Matrizes) imagesc( matriz )
Legenda para o Grfico de Cores colorbar
Digamos que se quer selecionar a regio de 1 a 2 abaixo do grfico exp( x ),
para dar um exemplo didtico sobre integral. Poderamos fazer do seguinte modo.
>> vet _x1 = 0 : 0. 01 : 3 ;
vet _x2 = 1 : 0. 01 : 2 ;
vet _y1 = exp( vet _x1 ) ;
vet _y2 = exp( vet _x2 ) ;
>> pl ot ( vet _x1 , vet _y1 ) ;
>> hol d ;
>> ar ea( vet _x2 , vet _y2 ) ;
34
Um exemplo para a funo subplot, que pode usada em conjunto com qualquer
uma das funes de plotagem:
>> vet _x = 0 : 0. 01 : 5 ;
vet _y1 = si n( vet _x ) ;
vet _y2 = mod( vet _x , 1 ) ;
>> subpl ot ( 2 , 1 , 1 ) ;
>> pl ot ( vet _x , vet _y1 ) ;
>> subpl ot ( 2 , 1 , 2 ) ;
>> pl ot ( vet _x , vet _y2 ) ;
Um exemplo de um diagrama pizza seria o abaixo. Ele calcula os percentuais
com base na soma total (no caso, 2 + 5 + 10 + 10 + 3 = 30) e imprime os valores ao lado
das fatias. O segundo argumento passado opcional, e serve apenas para destacar certas
fatias.
>> vet _val or es = [ 2 5 10 10 3 ] ;
>> vet _f at i asSobr essai das = [ 1 0 0 1 0 ] ;
>> pi e( vet _val or es , vet _f at i asSobr essai das ) ;
35
Para acrescentar legenda referente s fatias, veja o comando legend em 5.2.
A funo imagesc bem til quando se deseja mapear alguma superfcie.
Por exemplo, tendo os valores de temperatura de uma certa rea contidos numa matriz,
podemos plotar sua imagem trmica valores mais altos apresentaro cores mais
avermelhadas; os mais baixos, cores azuladas.
O exemplo a seguir tenta obter a imagem de uma matriz 20 x 20 com valores
aleatrios entre 0 e 1.
>> mat r i z_al eat or i a = r and( 20 , 20 ) ;
>> i magesc( mat r i z_al eat or i a ) ;
>> col or bar ;
Um exemplo mais prtico da funo imagesc foi feito com um medidor de
campo magntico em superfcies. O ensaio teste, com um arranjo de ims circulares
formando a palavra PUC, teve o seguinte resultado:
36
5.2 Alguns Detalhes: Cores, Ttulo, Legendas, Etc
Linhas pontilhadas? Linhas mais grossas? Cor vermelha? Plotar apenas os
pontos isolados, sem trao algum? Tudo isso pode ser passado como parmetros extras
para personalizar o grfico.
exemplos:
pl ot ( vet _x , vet _y , ' r ' ) linha vermelha
pl ot ( vet _x , vet _y , ' *' ) pontos (asteriscos) sem ligao
pl ot ( vet _x , vet _y , ' r *' ) asteriscos vermelhos sem ligao
pl ot ( vet _x , vet _y , ' k: ' ) linha preta pontilhada
pl ot ( vet _x , vet _y , ' Li neWi dt h' , 2 ) linha de grossura 2
Consulte help plot para descobrir mais opes.
Logo que os pontos estiverem na tela, importante identificar os eixos e o
grfico em si. Pode-se ajustar opes na prpria janela tambm. Eis algumas
ferramentas bsicas:
Detalhe Funo
Ttulo title( string )
Identificando Eixos
xlabel( string )
ylabel( string )
zlabel( string )
Grade Pontilhada grid
Ajuste Automtica dos Eixos
(fixando ou adaptando segundo as curvas)
axis manual
axis tight
Legenda
(til para quando h mais de uma curva)
legend( string_curva1 , string_curva2 , ... )
Limite dos Eixos
xlim( [ valorInicial valorFinal ] )
ylim( [ valorInicial valorFinal ] )
zlim( [ valorInicial valorFinal ] )
37
Lembrando que as strings so palavras entre aspas simples, e no duplas como
em outras linguagens.
5.3 Plotando em 3D
H dois modos de se plotar em trs dimenses: com linhas ou superfcies.
Modo de Plotar Funo
Linhas (Pontos Ligados) em 3D plot3( vet_x , vet_y , vet_z )
Superfcie em 3D surf( matriz_x , matriz_y , matriz_z )
Combinando Vetores X e Y para Gerar
Matrizes para Plotar Superfcies
[matriz_x , matriz_y ] = meshgrid( vet_x ,
vet_y )
Plotando uma espiral helicoidal:
>> vet _t = 0 : pi / 50 : 10*pi ;
>> pl ot 3( si n( vet _t ) , cos( vet _t ) , vet _t ) ;
E uma parabolide (z = x
2
+ y
2
). A funo meshgrid cria um mapa quadrado
xy de pontos entre -2 e 2 a partir de vetores, para substituirmos ento na expresso de z
e obtermos assim uma superfcie.
>> vet _x = - 2 : 0. 1 : 2 ;
>> vet _y = - 2 : 0. 1 : 2 ;
>> [ mat r i z_x , mat r i z_y ] = meshgr i d( vet _x , vet _y ) ;
>> mat r i z_z = mat r i z_x . ^2 + mat r i z_y . ^2 ;
>> sur f ( mat r i z_x , mat r i z_y , mat r i z_z ) ;
38
5.4 Manipulando a Janela do Grfico
A seguir, algumas funes que podem configurar opes da janela em que
plotamos.
Operao Comando
Ajustar Fonte dos Eixos, Ttulo e
Legenda
set( gca , 'fontsize' , numeroFonte )
Ajustar Tamanho e Posio da Janela
(em pixels, com origem no canto
superior esquerdo da tela)
set( gcf , 'Position', posicaoX , posicaoY ,
tamanhoX , tamanhoY )
Perceba, no entanto, que vrias das opes apresentadas at agora esto
disponveis no s atravs da chamada de funes. Pela prpria janela do grfico,
encontramos menus e cones de configuraes.
39
pelo menu Insert, podemos colocar manualmente legendas, ttulos, etc, alm de
setas e outros elementos
ativando o cone com o cursor do mouse e clicando duas vezes na curva, um
menu de opes aberto; pode-se configurar ali cor, espessura e tipo de linha
(ou ento deletar a curva pressionando Delete)
os cones de lupa permitem ajustar o zoom (voc pode desenhar um retngulo
com o zoom +, a fim de aumentar uma regio especfica); o de mozinha ajusta
a posio
o cone data cursor possibilita a seleo de um ponto para a visualizao de
seu valor (aps clicar em um ponto, pode-se andar pelas adjacncias com as
setas esquerda e direita do teclado)
5.5 Acessando Dados dos Grficos
Se por algum motivo neste mundo voc quiser capturar os pontos de uma tela
para process-los, existem pelo menos duas maneiras de fazer.
Operao Funo
Capturar Pontos com o Mouse
[vet_x , vet_y] = getpts
<aps o comando, clique na tela para
capturar pontos e pressione ENTER quando
terminar; aperte BACKSPACE para
descapturar ltimo ponto>
Capturar Todos os Pontos da Curva J
Plotada
vet_x = get( get( gca , 'children' ) , 'XData' )
vet_y = get( get( gca , 'children' ) , 'YData' )
Se houver mais de uma curva na tela, o comando get( get ( ) ) retornar
uma matriz coluna de cells. Para convert-la a uma matriz normal, use o comando
cell2mat.
40
Captulo 6 O Editor de Funes e
Rotinas
6.1 Vantagens do Editor
Utilizaremos o editor de texto sempre que precisarmos executar uma seqncia
grande ou mais complexa de comandos. As vantagens so:
poder salvar seu trabalho
no precisar repetir os comandos um a um quando algo der errado no meio do
processo
usar com facilidade comandos de loop e condicionais
criar funes que podero ser usadas por outras funes ou rotinas
poder usar breakpoints para DEBUGs
aspecto visual melhor
Para abrir o editor, basta digitar edit na tela de comandos ou clicar em
File>New. Os arquivos so salvos com a extenso .m.
6.2 Criando Funes e Rotinas
Convenes bsicas para o editor:
%coment r i os so i ni ci ados por " %" e f i camver des at o f i mda l i nha
%{
bl oco
de
coment r i os
%}
' st r i ngs f i cament r e ASPAS SI MPLES e so r oxas'
' uma st r i ng no f echada por descui do f i ca ver mel ha
%par a cont i nuar o comando na l i nha de bai xo, use " . . . "
f uncao( par amet r o1 , par amet r o2 , . . .
par amet r o3 ) ;
Uma rotina simplesmente uma seqncia de comandos. Basta digitar um em
cada linha, conforme se fazia at agora veja que declarar variveis sem o ponto-e-
vrgula far com que seus valores apaream na tela de comandos. Para executar tudo,
clique no cone "Run" (ou "Save and Run") ou aperte F5. necessrio salvar seu
trabalho antes de rod-lo.
J a funo recebe (ou no) parmetros, e retorna (ou no) um ou mais valores.
Algumas regras devem ser respeitadas:
41
sua declarao deve constar no incio do arquivo; os comentrios que estiverem
antes da declarao so exibidos na tela de comandos quando se digita help
funo
tudo que estiver abaixo dela, at a declarao de uma possvel outra funo, ser
executado quando ela for chamada (no h chaves ou parnteses para limitar seu
contedo)
apenas a primeira funo do arquivo pode ser chamada externamente; as funes
que estiverem abaixo da primeira serviro apenas como funes auxiliares, j
que s conseguiro ser acessadas pela primeira
o MatLab associa a funo ao arquivo .m; ou seja, deve-se obrigatoriamente
salvar o arquivo com o mesmo nome da funo antes de utiliz-la
A declarao de uma funo que recebe dois parmetros e retorna um valor seria
como est mais abaixo. No caso, a varivel resultado o retorno, e sua ltima
atribuio a que ser de fato retornada a quem chamou a funo. Podem existir outros
comandos aps essa ltima atribuio.
f unct i on r esul t ado = f uncao ( par amet r o1 , par amet r o2 )
( . . . )
r esul t ado = ( . . . )
( . . . )
J a declarao de uma funo que recebe apenas um parmetro e no retorna
nada seria assim:
f unct i on f uncao ( par amet r o1 )
( . . . )
Se quiser retornar, digamos, 2 argumentos e no receber parmetro nenhum:
f unct i on [ r esul t ado1 , r esul t ado2 ] = f uncao ( )
( . . . )
r esul t ado1 = ( . . . )
( . . . )
r esul t ado2 = ( . . . )
( . . . )
E uma nova opo: pode-se declarar o recebimento de uma quantidade
indefinida de parmetros. Isso til, por exemplo, quando sua funo recebe uma
funo do usurio como parmetro, e passa a ela os parmetros definidos por ele. Veja o
exemplo.
f unct i on f uncao ( f uno_usuar i o , var ar gi n )
( . . . )
42
f uno_usuar i o( var ar gi n{ : } ) ;
( . . . )
O parmetro "varargin", que contem os inmeros argumentos da funo do
usurio, deve vir por ltimo na declarao da funo.
6.3 Condicionais e Loops: if, switch, while e for
Este tpico j deve ser bem conhecido para os alunos de Engenharia que j
fizeram Estrutura de Dados. Mesmo assim, vale a pena apresentar a sintaxe e explicar os
conceitos.
A estrutura if executa blocos de comandos somente se a condio for
verdadeira. Veja a tabela de possibilidades abaixo
i f condi cao
bloco
end
i f condi cao1
bloco1
el sei f condi cao2
bloco2
el sei f condi cao3
bloco3
( . . . )
el sei f condi caoN
blocoN
end
i f condi cao1
bloco1
el sei f condi cao2
bloco1
el se
bloco3
end
Executa bloco de comandos
somente se a condio for
verdadeira
Executa bloco 1 somente se
a condio 1 for verdadeira.
Caso contrrio, executa
bloco 2 se a condio 2 for
verdadeira. E assim em
diante.
Executa bloco 1 somente se
a condio 1 for verdadeira.
Caso contrrio, executa
bloco 2 se a condio 2 for
verdadeira. Caso contrario,
executa bloco 3.
Uma alternativa a estrutura if a estrutura switch. Ela mais interessante
para executar comandos com base no valor de uma varivel ou expresso.
swi t ch expr essao
case val or 1
bloco1
case { val or 2 , val or 3 }
bloco2
ot her wi se
bloco3
end
No caso acima, o bloco 1 executado se o valor da expresso for valor1. Caso
contrrio, se for valor2 OU valor3, o bloco 2 executado. Caso contrrio, o bloco 3
executado. Perceba que, diferente do que ocorre na linguagem C, os blocos 2 e 3 no
so executados caso o valor 1 seja verdadeiro! No h, portanto, necessidade de breaks!
Para executar o mesmo bloco de comandos mais de uma vez, usamos as
estruturas de loop (lao). No caso da estrutura while, o bloco executado enquanto
a condio for verdadeira.
CUIDADO: se a condio for sempre verdadeira, o bloco rodar eternamente,
at que algum aborte o programa.
43
whi l e condi cao
bloco
end
Finalmente, a estrutura for usada para executar um bloco de comandos
numa quantidade definida de vezes. Atravs de um contador (ou iterador por isso a
letra i usada) declarado no incio como um vetor, estabelecemos quantas vezes o
bloco ser executado. Ao mesmo tempo, declaramos os valores do contador ao longo
dos ciclos. Observe alguns casos possveis:
f or i = 1 : N
bloco
end
f or i = 0 : 2 : N
bloco
end
f or i = [ 2 5 6 ]
bloco
end
Executa bloco de comandos
N vezes; a cada ciclo, i
assume valor 1, 2, 3, ..., N.
Executa bloco de comandos
N/2 vezes; a cada ciclo, i
assume valor 0, 2, 4, ..., N.
Executa bloco de comandos
3 vezes; a cada ciclo, i
assume valor 2, 5 e 6.
OBS: vale lembrar mais uma vez que o primeiro ndice de vetores e matrizes 1.
A tabela abaixo rene algumas das condies mais comuns em ifs e whiles.
Condio (Pergunta) Notao
X igual a Y?
X == Y
X diferente de Y?
X ~= Y
X maior do que Y?
X > Y
X menor ou igual a Y?
X <= Y
X divisvel por Y?
(ou seja, resto da diviso nulo?)
mod( X , Y ) == 0
X inteiro?
mod( X , 1 ) == 0
X par?
mod( X , 2 ) == 0
X nmero primo?
i spr i me( X )
X real (no-complexo)?
i sr eal ( X )
X um escalar (no-vetor)?
l engt h( X ) == 1
possvel juntar duas condies numa s:
Condio (Pergunta) Notao(es)
Condies A e B so ambas
verdadeiras?
A & B
and( A , B )
Condio A e/ou condio B
verdadeira?
A | B
or ( A , B )
Condio A ou condio B
verdadeira? (Exclusive OR)
xor ( A , B )
Condio A no verdadeira?
~A
not ( A )
Combinando essas condies, prudente usar parntesis para estabelecer a
ordem de prioridade das verificaes.
exemplo: testar se X 2 ou mltiplo de 8 e 10, escrevemos:
i f ( X == 2 ) | ( mod( X , 8 ) == 0 & mod( X , 10 ) == 0 )
44
Veja agora um exemplo de funo que usa alguns dos conceitos at aqui
apresentados.
f unct i on r et or no = pr i moAnt er i or ( numer o )
i f l engt h( numer o ) ~= 1 | ~i sr eal ( numer o ) | numer o < 3
% er r o: f oi passado umvet or , umcompl exo ou umnumer o menor
do que 3
r et or no = NaN ;
el se
%pega mai or i nt ei r o ant er i or ao nmer o r ecebi do
numer oAt ual = cei l ( numer o - 1 ) ;
whi l e ~i spr i me( numer oAt ual )
numer oAt ual = numer oAt ual - 1 ;
end
r et or no = numer oAt ual ;
end
Para encerrar este tpico, muito importante frisar que o uso de for e while
pode e deve ser evitado na maioria dos casos. Isso porque o MatLab possui funes
otimizadas para receber vetores e matrizes, efetuando assim o clculo em todos os
elementos de uma s vez! Usar loops e chamar a funo para cada elementos
individualmente deixa o cdigo mais extenso e complicado, e pode at retardar o
processamento.
A tabela abaixo mostra alternativas para quem est acostumado demais com
algoritmos da linguagem C:
Objetivo Estilo C Estilo MatLab
Calcular seno dos
elementos de um
vetor
f or i = 1 : l engt h( vet )
vet 2( i ) = si n( vet ( i ) ) ;
end
vet 2 = si n( vet ) ;
Obter soma de
todos os elementos
de um vetor
soma = 0
f or i = 1 : l engt h( vet )
soma = soma + vet ( i ) ;
end
soma = sum( vet ) ;
Zerar elementos de
3 em 3 de um vetor
f or i = 1 : l engt h( vet )
i f mod( i , 3 ) == 0
vet ( i ) = 0 ;
end
end
t ot al = l engt h( vet )
vet ( 3 : 3 : t ot al )
= 0
6.4 Recurso e Variveis Globais
H quem prefira evitar o uso de loops e programar funes com o uso de
recurso. OK, sem problemas, o MatLab aceita essa opo. Vejamos como ficaria o
exemplo anterior com a funo chamando ela mesma.
f unct i on r et or no = pr i moAnt er i or ( numer o )
i f l engt h( numer o ) ~= 1 | ~i sr eal ( numer o ) | numer o < 3
45
% er r o: f oi passado umvet or , umcompl exo ou umnumer o menor
do que 3
r et or no = NaN ;
el se
%pega mai or i nt ei r o ant er i or ao nmer o r ecebi do
numer oAt ual = cei l ( numer o - 1 ) ;
i f i spr i me( numer oAt ual )
r et or no = numer oAt ual ;
el se
r et or no = pr i moAnt er i or ( numer oAt ual ) ;
end
end
Rotinas, conforme foi dito, so apenas seqncias de comandos que teriam o
mesmo efeito se digitssemos e executssemos seu contedo na tela de comandos.
Portanto, quando se declara uma varivel numa rotina, ela permanece no workspace do
MatLab at que o comando "clear" seja executado (ou at que se saia do prprio
MatLab), j se tornando global e podendo ser acessada e modificada por qualquer outra
rotina.
J as variveis declaradas numa funo existem somente enquanto a funo
executada. Para que ela trabalhe com variveis globais, necessrio usar a declarao
"global variavel", tanto para declar-las quanto para acess-las ou modific-las.
exemplo: supondo os seguinte arquivos
rotina1.m:
cl ear ;
r ot i na2 ;
f uncao1( ) ;
gl obal b
a
b
c
rotina2.m:
a = 1 ;
funcao1.m:
f unct i on f uncao1 ( )
gl obal b
b = 2 ;
c = 3 ;
rodando rotina1.m, o seguinte trecho aparece na tela de comandos:
a =
1
46
b =
2
??? Undef i ned f unct i on or var i abl e " c" .
Er r or i n ==> r ot i na1 at 9
c
6.5 Debugando
Durante a execuo, quando h um erro de "gramtica da linguagem"
(parnteses no fechado, falta de vrgulas, etc) ou m digitao de nomes, uma
mensagem de erro na tela de comandos geralmente esclarece o motivo da falha, que
pode ser ento imediatamente consertada repare que sempre aparece o nmero da
linha onde ocorreu o erro (vide exemplo do item anterior, "Error in ==> rotina1 at 9").
No entanto, muito comum na vida de um programador se deparar com um erro
de causas desconhecidas no cdigo. Uma ferramenta boa para ajudar na soluo desses
problemas o debugador (debugger). Basicamente, inserem-se pontos de pausa de
execuo (set/clear breakpoint) para avaliar as condies das variveis. Executando
linha a linha (step), o mistrio mais facilmente encontrado.
Dica: podemos descobrir o valor assumido por uma varivel apontando-lhe com
o mouse no Editor de Texto, durante o Modo Debug.
47
Captulo 7 Funes de Entrada e Sada
7.1 Strings
Antes de entrarmos efetivamente no tema deste captulo, interessante falar algo
sobre strings, que nada mais so do que uma forma de trabalharmos com textos no
cdigo. Usamos strings at agora apenas para escrever legenda e ttulo de grficos, ou
em algum parmetro duma funo ou outra. Para esses e outros propsitos, j podemos
apresentar alguns detalhes extras.
E mais uma vez: as strings no MatLab so declaradas com aspas simples, e
no duplas como em outras linguagens.
Operao com Strings Funo
Concatenao (Unio) string = [ string1 string2 ...]
Criar Matriz Coluna de Strings
(Concatenao Vertical)
matString = strvcat( string1 , string2 , ...)
matString = strvcat( matString1 ,
matString2 , ...)
Comparao (Se So Iguais ou No) condicao = strcmp( string1, string2 )
Converso Nmero-String e
String-Nmero
string = num2str( numero )
numero = str2num( string )
Procurar um Trecho numa String
(ndices Iniciais de Ocorrncias)
vet_indices = strfind( string ,
string_trecho )
Substituir um Trecho numa String por
Outro
stringNova = strrep( string , string_trecho
, string_substituta )
Executar Comando Contido numa String eval( string_comando )
Para criar um conjunto de strings, usamos uma matriz coluna. Infelizmente, o
MatLab exige que nela todas as strings tenham o mesmo tamanho. A funo strvcat,
presente na tabela acima, adiciona-lhes espaos em branco no fim at que todas tenham
o mesmo comprimento. Isso se torna interessante para a funo legend, por exemplo,
que aceita tanto N argumentos para nomear as curvas quanto uma matriz com esses
nomes todos.
Alis, possvel incluir caracteres especiais nas strings de ttulos e legendas de
grficos. Veja alguns na tabela abaixo:
Caractere Especial Cdigo
\alpha
\beta
\theta
\Omega
\omega
\sigma
\pi
\lambda
\rho
\mu
\gamma
48
Prximo Caractere Sobrescrito ^
Prximo Caractere Subscrito _
Aqui temos, por fim, alguns caracteres usados na manipulao de arquivos texto.
Caractere Especial Cdigo
Quebra de Linha \n
Tabulao \t
Caractere \ \\
Caractere % %%
7.2 Capturando e Imprimindo na Tela de Comandos
Embora no sejam muito utilizadas, as funes equivalentes ao printf e
scanf existem no MatLab. Confira a tabela abaixo:
Operao Funo
Exibir Mensagem na Tela de Comandos disp( string_mensagem )
Exibir Mensagem de Erro na Tela de
Comandos e Abortar Rotina / Funo
error( string_mensagem )
Exibir Mensagem e Aguardar Usurio
Entrar com Numero ou Texto na Tela de
Comandos
numero = input( string_mensagem )
string = input( string_mensagem , s )
7.3 Arquivos de Texto, Imagem e Som
Uma tima caracterstica do MatLab poder juntar suas ferramentas
matemticas com arquivos de multimdia, o que possibilita inclusive a integrao com
outros aplicativos.
Comecemos com algumas funes de manipulao de arquivos, similares s da
linguagem C.
Operao Funo
Abrir .m de uma Funo no
Editor
open nomeFuncao
Carregar Nmeros dum Arquivo
ASCII
matriz = load( string_arquivoTexto )
Abrir / Criar Arquivo Texto
fid_arquivo = fopen( string_arquivoTexto ,
string_objetivo )
string_ objetivo:
r = ler o arquivo (read)
w = criar e escrever no arquivo (write)
a = continuar escrevendo no arquivo (append)
Imprimir Texto no Arquivo fprintf( fid_arquivo, string_texto )
fprintf( fid_arquivo, string_texto, ... )
Verificar se Arquivo Chegou ao
Fim (File: End of File)
condio = feof( fid_arquivo )
fscanf( string_formatos , variavel1 , variavel2 , ... )
49
Capturar Nmeros / Caracteres
do Arquivo para Variveis
string_ formatos:
%d =captura inteiro
%f = captura numero de casas decimais (float)
%c = captura caractere (char)
%s = captura palavra (string)
Capturar Prxima Linha (Get
Line) do Arquivo
string_linha = fgetl( fid_arquivo )
Fechar Arquivo fclose( fid_arquivo )
Confira o exemplo 5 do Captulo 9 para ver uma aplicao dessas funes.
Uma opo interessante tambm usar as ferramentas apresentadas em 4.6
Sinais e Sistemas, tais como filtros e transformada de Fourier, com arquivos de som.
Operao Funo
Carregar Arquivo .wav vet_som = wavread( string_nomeArquivo )
[ vet_som , taxaAmostragem , bitsAmostra ] =
wavread( string_nomeArquivo )
Reproduzir Arquivo .wav wavplay( vet_som , taxaAmostragem )
Gravar Arquivo .wav wavwrite( vet_som , taxaAmostragem , bitsAmostra
, string_nomeArquivo )
Abrir Arquivo de Som numa
Janela de Grfico (com opo
de reproduo)
pw( string_nomeArquivo )
As mesmas ferramentas de Sinais e Sistemas tambm podem ser usadas com
arquivos de imagem. Elas so geralmente carregadas em matrizes M x N x 3, onde cada
matriz M x N representa intensidades RGB (Red-Green-Blue vermelho, verde e azul).
Operao Funo
Carregar Arquivo de Imagem
matriz3d_imagem = imread( string_nomeArquivo,
string_extensao )
string_extensao:
jpeg
bmp
gif
(...)
Imprimir Imagem na Tela de
Grfico
image( matriz3d_imagem )
Gravar Arquivo de Imagem imwrite( matriz3d , string_nomeArquivo ,
string_extensao )
7.4 Execuo do MatLab e de Outros Aplicativos
A tabela abaixo rene dois comandos interessantes para o controle da execuo
de funes e rotinas: a opo de abort-la manulamente (caso esteja demorando muito
para processar) ou de interromp-la por alguns instantes.
50
Alm disso, possvel invocar um programa de dentro do prprio MatLab.
Exemplo: com as funes apresentadas no item anterior, pode-se escrever um arquivo
texto de instrues e chamar um aplicativo que execute certas operaes e retorne seus
resultados num arquivo de sada, o qual ser processado em seguida pelo MatLab.
Operao Funo / Comando
Abortar Execuo de Rotina / Funo /
Comando
aperte Ctrl + C na tela de comandos
Pausar Execuo
(por tempo determinado ou aguardando
usurio apertar ENTER)
pause( tempoEmSegundos )
pause
Invocando Aplicativo
(similar ao prompt do DOS)
!caminhodoPrograma
!comandoDOS
Ou seja, para abrir um arquivo *.txt no Notepad, executamos um comando
similar ao seguinte:
>> ! not epad c: / ar qui vo. t xt
OBS: o processamento do MatLab permanecer em espera enquanto o programa
invocado no for finalizado (ou enquanto no houver uma abortagem manual do
comando).
51
Captulo 8 Programando com
Qualidade
8.1 Por que Isso Vale a Pena
Eu sei que muita gente nem vai ler este captulo direito. Parece frescura, mas
acreditem: seguir os conselhos abaixo pode ajudar bastante a vida com a programao.
No basta saber todas os comandos e ser um gnio de algoritmos: para
programar direito, precisamos de mtodo e disciplina.
Alunos de computao fazem uma matria chamada INF1628 Programao em
Ponto Grande, que ensina conceitos gerais para organizao e eficincia em nossos
cdigos no computador. Embora tal curso utilize a linguagem C, muitas das idias
podem ser aproveitadas para o MatLab.
Agora que j passamos por vrias sees sobre funes, vamos analisar sobre
como se utiliza tudo isso no editor. Os questionamentos levantados so importantes
principalmente para o caso de uma rotina grande e complexa:
como escolher nome para variveis e constantes?
onde e como inserir comentrios de cdigo?
quais as verificaes a serem feitas para evitar erros na execuo?
como testar tudo?
Ao invs de simplesmente sair escrevendo no editor, pare e pense no que est
enunciado nos tpicos a seguir. Lembre-se: o seu cdigo poder ser lido e utilizado por
outras pessoas, ou por voc mesmo no futuro. Quando isso acontecer, melhor que seu
arquivo .m esteja claro e correto.
8.2 Como NO Fazer
Veja o cdigo abaixo como exemplo de como NO fazer. Veja se possvel
entender o que gerado, para que ele serve.
f unct i on [ x, y] =ci r cul o( a, r , p)
%f i gur e;
i f a==1
x=r *( 2*r and( 1, p) - 1) ;
y=sqr t ( 1- x. ^2) . *r *( 2*r and( 1, p) - 1) ;
%xl i m( [ - 1 1] ) ;
%yl i m( [ - 1 1] ) ;
%pl ot ( x, y, ' *' ) ;
el sei f a==2
r =r *r and( 1, p) ;
t =2*pi *r and( 1, p) ;
x=r . *cos( t ) ;
y=r . *si n( t ) ;
%xl i m( [ - 1 1 ] ) ;
52
%yl i m( [ - 1 1 ] ) ;
%pl ot ( x, y, ' *' ) ;
el sei f a==3
r =r *sqr t ( r and( 1, p) ) ;
t =2*pi *r and( 1, p) ;
x=r . *cos( t ) ;
y=r . *si n( t ) ;
%subpl ot ( 3, 1, 3) ;
%f i gur e;
%xl i m( [ - 1 1] ) ;
%yl i m( [ - 1 1] ) ;
%hol d on;
%pl ot ( x, y, ' *' ) ;
end
Se voc no entendeu nada, no tem problema. Explicando: essa funo
circulo retorna 2 vetores (x e y) com p elementos. Cada par de elementos {x,y}
um ponto aleatrio distribudo num crculo de raio r (ou seja, x
2
+ y
2
<= r
2
), segundo
uma modalidade a. Se a = 1, os pontos tendem a se concentrar mais nas bordas
horizontais; se a = 2, os pontos estaro mais concentrados no centro; se a = 3, os pontos
estaro uniformemente distribudos.
E esse trabalho todo com uma funo razoavelmente curta! Imagina se fosse
uma biblioteca de funes e rotinas mais pesada!
Listemos as crticas:
o nome da funo e das variveis informa pouco ou nada sobre seu significado
no h nenhuma instruo de como se utiliza a funo ou para que ela serve.
Mesmo que se descubra, perde-se muito tempo analisando o cdigo. E os
usurios geralmente no esto interessados em saber o funcionamento a fundo.
o parmetro a poderia ser solicitado ao usurio como uma string relacionada
ao modo de distribuio, ao invs de exigir valores numricos arbitrrios como
1, 2 e 3. Isso j evitaria ter que decorar o que cada nmero faz.
no h verificao com respeito da validade dos parmetros recebidos (por
exemplo: se a quantidade de pontos p for negativa, pode gerar erros estranhos)
no h comentrios explicativos em lugar nenhum
a tabulao dos comandos est bem confusa, e no h separao de trechos em
blocos de finalidade
poderia haver um espaamento entre parntesis, variveis, nmeros, sinais, etc...
existe repetio de cdigo
algumas expresses (provavelmente de DEBUG, para testar a funo) esto
comentadas. Isso no prtico, pois exige que linhas sejam comentadas e
descomentadas a cada teste.
8.2 Como Fazer
Solucionemos um a um os problemas apresentados.
Primeiramente, vamos melhorar a nomenclatura usada. O ideal que o papel de
determinada varivel ou funo dentro do programa seja evidenciado logo por seu
nome. Agilizamos, assim, a compreenso se a necessidade de muitos comentrios
explicativos.
Deste modo, a definio da funo ficaria assim:
53
f unct i on [ vet _x , vet _y ] = Ger ar Di st r i bui caoCi r cul o
( modoDi st r i bui cao , r ai o , qt dPont os )
Eu sei, os nomes ficaram grandes. Eu sei, demora para digitar nomes to
compridos. No entanto, tal declarao da funo j esclarece bastante sobre sua
utilidade.
Agora aceite esta regra: ANTES de comear o cdigo, deve-se saber para que
exatamente ele vai servir, o que ele vai produzir. E a melhor maneira de especificar tudo
isso fazendo o cabealho um trecho s de comentrios contendo informaes
bsicas iniciais. De quebra, j preparamos a explicao para os usurios sobre do que se
trata o que vir adiante.
Informaes importantes que o cabealho deve conter:
o nome da rotina/funo
o autor e a data de quando foi desenvolvida
uma descrio breve do que gerado no processo
a descrio dos parmetros a serem recebidos (no caso de funes)
bibliotecas exigidas para a execuo.
Portanto, o arquivo .m da funo circulo deveria comear assim:
%%%%%%%%%%%%%%%%%%%%%FUNO GERARDI STRI BUI CAOCI RCULO %%%%%%%%%%%%%%%%%%%%%
%
%Aut or : Kar l Mar x , 1900
%
%Descr i o da Funo:
% So r et or nados pont os al eat r i os ( x, y) cont i dos numc r cul o, cuj os
% par met r os so passados pel o usur i o. As di ver sas Funes de
% Densi dade de Pr obabi l i dade ( f dp) est o descr i t as emPar met r os
%
%Chamada da Funo:
% [ vet _x , vet _y ] = Ger ar Di st r i bui caoCi r cul o( modoDi st r i bui cao ,
% r ai o , qt dPont os )
%
%Par met r os:
% modoDi st r i bui cao:
% ' concent r adoBor dasHor i zont ai s' - - > p( x, y) = 1 / ( 4*r ai o*
% sqr t ( r ai o - x ) )
% ' concent r adoCent r o' - - > p( x, y) = 1 / ( 2*pi *r ai o*
% sqr t ( x +y ) )
% ' uni f or me' - - > p( x, y) = 1 / ( pi *r ai o )
% r ai o - - > r ai o do c r cul o
% qt dPont os - - > quant i dade de pont os ger ados
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
A questo da melhora no parmetro a (atual modoDistribuio) j est
resolvida acima (a funo solicita strings agora). Porm, apesar das especificaes,
prudente verificar se o usurio no chamou a funo com argumentos invlidos. Ento,
logo aps o cabealho e antes de comearmos os clculos, escrevemos:
i f nar gi n ~= 3
er r or ( ' *** ERRO *** Quant i dade de ar gument os passados i nvl i da! ' ) ;
end
i f l engt h( r ai o ) ~= 1 | ~i sr eal ( r ai o ) | r ai o < 0
er r or ( ' *** ERRO *** Par amet r o " r ai o" i nvl i do! ' ) ;
end
54
i f l engt h( qt dPont os ) ~= 1 | ~i sr eal ( qt dPont os ) | . . .
qt dPont os < 0 | mod( qt dPont os , 1 ) ~= 0
er r or ( ' *** ERRO *** Par amet r o " qt dPont os" i nvl i do! ' ) ;
end
Como algumas funes tm quantidade de argumentos varivel, o MatLab
permite que as chamemos passando menos parmetros do que os constados na
declarao. Eis por que se verificou se foram recebidos exatamente trs (atravs da
varivel nargin, j existente no MatLab para tal propsito).
As variveis raio e qtdPontos no podem ser complexas, vetores ou
negativas, e esta ltima deve ser inteira (no existem quantidade de pontos fracionria).
A checagem de modoDistribuio pode ser feita, por uma questo de
praticidade, aps os if/else:
i f st r cmp( modoDi st r i bui cao , ' concent r adoBor dasHor i zont ai s' )
( . . . )
el sei f st r cmp( modoDi st r i bui cao , ' concent r adoCent r o' )
( . . . )
el sei f st r cmp( modoDi st r i bui cao , ' uni f or me' )
( . . . )
el se
er r or ( ' *** ERRO *** Par amet r o " modoDi st r i bui cao" i nvl i do! ' ) ;
end
Ainda assim, as mensagens de erro poderiam ser mais explcitas quanto causa
da falha (exemplo: se recebido um raio complexo, dir-se-ia explicitamente que um valor
real obrigatrio).
O resto do cdigo pode ser melhorado esteticamente at ficar assim.
i f st r cmp( modoDi st r i bui cao , ' concent r adoBor dasHor i zont ai s' )
vet _x = r ai o * ( 2 * r and( 1 , qt dPont os ) - 1 ) ; % val or es ent r e [ - r ai o
r ai o]
vet _y = sqr t ( 1 - vet _x . ^ 2 ) . * ( 2 * r and( 1 , qt dPont os ) - 1 ) ;
el sei f st r cmp( modoDi st r i bui cao , ' concent r adoCent r o' )
vet _r = r ai o * r and( 1 , qt dPont os ) ;
vet _t het a = 2 * pi * r and( 1 , qt dPont os ) ;
vet _x = vet _r . * cos( vet _t het a ) ;
vet _y = vet _r . * si n( vet _t het a ) ;
el sei f st r cmp( modoDi st r i bui cao , ' uni f or me' )
vet _r = r ai o * sqr t ( r and( 1 , qt dPont os ) ) ;
vet _t het a = 2 * pi * r and( 1 , qt dPont os ) ;
vet _x = vet _r . * cos( vet _t het a ) ;
vet _y = vet _r . * si n( vet _t het a ) ;
el se
er r or ( ' *** ERRO *** Par amet r o " modoDi st r i bui cao" i nvl i do! ' ) ;
end
interessante colocar um prefixo nas variveis quando elas so vetores,
matrizes, etc., porque assim se toma mais cuidado com as operaes possveis de serem
feitas, alm de tornar o cdigo mais claro.
55
A parte de cdigo DEBUG comentada poderia ganhar uma parte especial. O
trecho nada mais do que uma forma de verificar, dentro da prpria funo, se os dados
gerados esto corretos (atravs de, no caso, uma plotagem).
%const ant es
DEBUG = 0 ; %modo DEBUG desat i vado
( . . . )
i f DEBUG
f i gur e ;
pl ot ( vet _x , vet _y , ' *' ) ;
xl i m( [ - r ai o r ai o ] ) ;
yl i m( [ - r ai o r ai o ] ) ;
t i t ul o = [ ' Modo ' modoDi st r i bui cao ] ;
t i t l e( t i t ul o ) ;
end
Desta maneira, o cdigo completo ficaria assim:
%%%%%%%%%%%%%%%%%%%%%FUNO GERARDI STRI BUI CAOCI RCULO %%%%%%%%%%%%%%%%%%%%%
%
%Aut or : Kar l Mar x , 1900
%
%Descr i o da Funo:
% So r et or nados pont os al eat r i os ( x, y) cont i dos numc r cul o, cuj os
% par met r os so passados pel o usur i o. As di ver sas Funes de
% Densi dade de Pr obabi l i dade ( f dp) est o descr i t as emPar met r os
%
%Chamada da Funo:
% [ vet _x , vet _y ] = Ger ar Di st r i bui caoCi r cul o( modoDi st r i bui cao ,
% r ai o , qt dPont os )
%
%Par met r os:
% modoDi st r i bui cao:
% ' concent r adoBor dasHor i zont ai s' - - > p( x, y) = 1 / ( 4*r ai o*
% sqr t ( r ai o - x ) )
% ' concent r adoCent r o' - - > p( x, y) = 1 / ( 2*pi *r ai o*
% sqr t ( x +y ) )
% ' uni f or me' - - > p( x, y) = 1 / ( pi *r ai o )
% r ai o - - > r ai o do c r cul o
% qt dPont os - - > quant i dade de pont os ger ados
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%const ant es
DEBUG = 0 ; %modo DEBUG desat i vado
%ver i f i cando par amet r os r ecebi dos
i f nar gi n ~= 3
er r or ( ' *** ERRO *** Quant i dade de ar gument os passados i nvl i da! ' ) ;
end
i f l engt h( r ai o ) ~= 1 | ~i sr eal ( r ai o ) | r ai o < 0
er r or ( ' *** ERRO *** Par amet r o " r ai o" i nvl i do! ' ) ;
end
i f l engt h( qt dPont os ) ~= 1 | ~i sr eal ( qt dPont os ) | . . .
qt dPont os < 0 | mod( qt dPont os , 1 ) ~= 0
er r or ( ' *** ERRO *** Par amet r o " qt dPont os" i nvl i do! ' ) ;
end
i f st r cmp( modoDi st r i bui cao , ' concent r adoBor dasHor i zont ai s' )
vet _x = r ai o * ( 2 * r and( 1 , qt dPont os ) - 1 ) ; % val or es ent r e [ - r ai o
r ai o]
vet _y = sqr t ( 1 - vet _x . ^ 2 ) . * ( 2 * r and( 1 , qt dPont os ) - 1 ) ;
56
el sei f st r cmp( modoDi st r i bui cao , ' concent r adoCent r o' )
vet _r = r ai o * r and( 1 , qt dPont os ) ;
vet _t het a = 2 * pi * r and( 1 , qt dPont os ) ;
vet _x = vet _r . * cos( vet _t het a ) ;
vet _y = vet _r . * si n( vet _t het a ) ;
el sei f st r cmp( modoDi st r i bui cao , ' uni f or me' )
vet _r = r ai o * sqr t ( r and( 1 , qt dPont os ) ) ;
vet _t het a = 2 * pi * r and( 1 , qt dPont os ) ;
vet _x = vet _r . * cos( vet _t het a ) ;
vet _y = vet _r . * si n( vet _t het a ) ;
el se
er r or ( ' *** ERRO *** Par amet r o " modoDi st r i bui cao" i nvl i do! ' ) ;
end
i f DEBUG
f i gur e ;
pl ot ( vet _x , vet _y , ' *' ) ;
xl i m( [ - r ai o r ai o ] ) ;
yl i m( [ - r ai o r ai o ] ) ;
t i t ul o = [ ' Modo ' modoDi st r i bui cao ] ;
t i t l e( t i t ul o ) ;
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%FI M DA FUNO %%%%%%%%%%%%%%%%%%%%%%%%%%%%
57
Captulo 9 Exemplos Prticos
9.1 Problema de Probabilidade
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%ROTI NA Regua %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% Aut or : Nobuhi r o Wat suki , 1994
%
% Descr i o da Rot i na:
% Umsamur ai r et al hador da Er a Mei j i , i nsat i sf ei t o comos r umos da
% r evol uo, deci de descont ar sua i nsat i sf ao numa i nocent e r gua
% oci dent al de t amanho uni t r i o. Pr i mei r o el e a par t e numpont o
% al eat r i o X e, no sat i sf ei t o, par t e o pedao esquer da numout r o
% pont o al eat r i o Y.
% At r avs de val or es ger ados al eat or i ament e, f ar emos di ver sos t est es
% par a ger ar os gr f i cos de Di st r i bui o de Pr obabi l i dade e de
% Densi dade de Pr obabi l i dade par a Y.
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%aument ar numer o de casas exi bi das
f or mat l ong ;
%const ant es ( al t er e par a aument ar / di mi nui r pr eci so dos t est es)
QTD_TESTES = 20000 ;
QTD_PONTOS = 2000 ;
%t est ar casos par a vr i os Y ent r e 0 e 1
%pont os onde a r gua quebr ada pel a 1a. vez ( 0 < x < 1 )
vet _x = r and( 1 , QTD_TESTES ) ;
%pont os onde a r gua quebr ada pel a 2a. vez ( 0 < y < x )
vet _y = vet _x . * r and( 1 , QTD_TESTES ) ;
%cont ando casos par a mont ar Fy( Y ) = P( y <= Y )
vet _Y = 0 : ( 1 / QTD_PONTOS ) : 1 ;
f or i = 1 : QTD_PONTOS + 1
vet _casosFavor avei s( i ) = l engt h( f i nd( vet _y <= vet _Y( i ) ) ) ;
end
vet _Fy_Y = vet _casosFavor avei s / QTD_TESTES ;
%mont ando Funo de Densi dade de Pr obabi l i dade der i vando numer i cament e Fy
vet _py_Y = di f f ( vet _Fy_Y ) / ( 1 / QTD_PONTOS ) ;
%OBS: f uno di f f ger a vet or com1 val or a menos
vet _py_Y = [ vet _py_Y 0 ] ; %acr escent ando 1 el ement o ao vet or
%pl ot ando Fy_Y
f i gur e ;
vet _pont osY = [ 0 : 1 / QTD_PONTOS : 1 ] ;
vet _pont os2Y = [ 0 : 10 / QTD_PONTOS : 1 ] ;
subpl ot ( 2 , 1 , 1 ) ;
pl ot ( vet _pont osY , vet _Fy_Y ) ;
xl abel ( ' y' , ' f ont si ze' , 13 ) ;
yl abel ( ' F_y( Y ) ' , ' f ont si ze' , 13 ) ;
t i t l e( ' Pr obl ema da Rgua: caso da segunda par t i ao esquer da' , . . .
' f ont si ze' , 13 ) ;
%pl ot ar cur va t er i ca
58
hol d ;
pl ot ( vet _pont os2Y , - vet _pont os2Y . * . . .
( l og( vet _pont os2Y ) - 1 ) , ' *r ' ) ;
l egend( ' Si mul ada' , ' Teor i ca' ) ;
hol d ;
%pl ot ando py_Y
subpl ot ( 2 , 1 , 2 ) ;
pl ot ( vet _pont osY , vet _py_Y ) ;
xl abel ( ' y' , ' f ont si ze' , 13 ) ;
yl abel ( ' p_y( Y ) ' , ' f ont si ze' , 13 ) ;
%pl ot ar cur va t er i ca
hol d ;
pl ot ( vet _pont os2Y , - l og( vet _pont os2Y ) , ' *r ' ) ;
l egend( ' Si mul ada' , ' Teor i ca' ) ;
hol d ;
%del et a var i vei s usadas aci ma
cl ear ;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%FI M DA ROTI NA %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9.2 Criando um Polinmio Graficamente
%%%%%%%%%%%%%%%%%%%%%%%%%ROTI NA Desenhar Pol i nomi o %%%%%%%%%%%%%%%%%%%%%%%%
%
%Aut or : Pabl o Pi casso, 1931
%
%Descr i o da Rot i na:
% Demonst r ao da capt ur a de pont os e do uso de pol i nmi os. O usur i o
% sel eci onar N > 1 pont os da t el a e ser desenhado umpol i nmi o que
% os cont enha. Sua equao apar ecer na l egenda.
% Essa r ot i na pode ser modi f i cada par a, por exempl o, t r aar a mel hor
% r et a combase nesses pont os.
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%t el a embr anco par a a capt ur a de pont os
handl e_gr af i co = f i gur e ;
xl i m( [ - 10 10 ] ) ;
yl i m( [ - 10 10 ] ) ;
set ( gca , ' f ont si ze' , 13 ) ;
gr i d ;
t i t l e( ' Sel eci one 2 ou mai s pont os na t el a e pr essi one ENTER' ) ;
%capt ur a dos pont os
[ vet _XSel eci onados , vet _YSel eci onados ] = get pt s ;
i f l engt h( vet _XSel eci onados ) <= 1
cl ose( handl e_gr af i co ) ;
er r or ( ' *** ERRO *** SELECI ONE 2 OU MAI S PONTOS! ' ) ;
end
%ger ando o pol i nmi o que cont mpont os sel eci onados
gr auPol i nomi o = l engt h( vet _XSel eci onados ) - 1 ;
vet _coef i ci ent es = pol yf i t ( vet _XSel eci onados , vet _YSel eci onados , . . .
gr auPol i nomi o ) ;
%ger ando pont os do pol i nmi o a par t i r dos coef i ci ent es encont r ados
vet _XPol i nomi o = [ - 10 : 0. 05 : 10 ] ;
vet _YPol i nomi o = pol yval ( vet _coef i ci ent es , vet _XPol i nomi o ) ;
%st r i ng cont endo o pol i nmi o
st r i ng_pol i nomi o = ' ' ;
59
f or i = 1 : gr auPol i nomi o
i f vet _coef i ci ent es( i + 1 ) > 0
st r i ng_si nal = ' + ' ;
el sei f vet _coef i ci ent es( i + 1 ) < 0
st r i ng_si nal = ' ' ;
end
i f i < gr auPol i nomi o
st r i ng_expoent e = [ ' ^' num2st r ( gr auPol i nomi o + 1 - i ) ] ;
el se
st r i ng_expoent e = ' ' ;
end
i f vet _coef i ci ent es( i ) ~= 0
st r i ng_pol i nomi o = [ st r i ng_pol i nomi o . . .
num2st r ( vet _coef i ci ent es( i ) ) . . .
' x' st r i ng_expoent e st r i ng_si nal ] ;
end
end
%f i nal da st r i ng: t er mo i ndependent e no t em' x^0 + '
i f vet _coef i ci ent es( gr auPol i nomi o + 1 ) ~= 0
st r i ng_pol i nomi o = [ st r i ng_pol i nomi o . . .
num2st r ( vet _coef i ci ent es( gr auPol i nomi o + 1 ) ) ] ;
end
%pl ot ando nova f i gur a compont os sel eci onados e o pol i nmi o ger ado
pl ot ( vet _XSel eci onados , vet _YSel eci onados , ' r o' , . . .
' Li neWi dt h' , 1. 5 ) ;
hol d ;
pl ot ( vet _XPol i nomi o , vet _YPol i nomi o , ' b' , ' Li neWi dt h' , 2 ) ;
xl abel ( ' x' ) ;
yl abel ( ' y' ) ;
t i t l e( ' Pol i nmi o ger ado coma capt ur a dos pont os' ) ;
l egend( ' Pont os Sel eci onados' , st r i ng_pol i nomi o ) ;
hol d ;
%l i mpa var i vei s da memr i a
cl ear ;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%FI M DA ROTI NA %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9.3 Animao Grfica
Lembrando que as equaes do crculo e da elipse so, respectivamente:
x x
0
( )
2
+ y y
0
( )
2
r
2
x x
0
( )
2
a
2
+
y y
0
( )
2
b
2
=1
ou
x = rcos() + x
0
y = rsin() + y
0
, com
r 0 raio
[ ]
0 2 [ ]
y = b 1
x
2
a
2
+ y
0
%%%%%%%%%%%%%%%%%%%%%%%%%%ROTI NA Ol hosDeRessaca %%%%%%%%%%%%%%%%%%%%%%%%%%
%
%Aut or : Machado de Assi s , 1900
%
60
%Descr i o da Rot i na:
% Demonst r ao l i t er r i a da ger ao de nmer os al eat r i os e da pl ot agem
% no Mat Lab.
% Ger am- se, par a a esquer da e par a a di r ei t a, umc r cul o e uma el i pse
% i ncompl et a nas ext r emi dades hor i zont ai s, compont os al eat r i os.
% Enquant o a el i pse t emseus pont os uni f or mement e di st r i bu dos, o
% c r cul o os t emmai s densament e no cent r o.
% Se voc cur sa ou j cur sou " Pr obabi l i dade e Est at st i ca" ou " Model os
% Pr obabi l st i cos par a Engenhar i a El t r i ca" , t ent e demonst r ar o
% r esul t ado at r avs da anl i se t er i ca das equaes ut i l i zadas.
% A pl ot agem f ei t a aos poucos. Pegue uma pi poca e assi st a ani mao.
%
%Ci t ao:
% Ret r i ca dos namor ados, d- me uma compar ao exat a e pot i ca par a o que
% f or amaquel es ol hos de Capi t u. No me acode i magemcapaz de di zer ,
% semquebr a da di gni dade do est i l o, o que f or ame me f i zer am. Ol hos
% de r essaca? V, de r essaca. o que me d i di a daquel a f ei o nova.
% Tr azi amno sei que f l ui do mi st er i oso e enr gi co, uma f or a que
% ar r ast ava pr a dent r o, como a vaga que se r et i r a da pr ai a, nos di as
% de r essaca. Par a no ser ar r ast ado, agar r ei - me s out r as par t es
% vi zi nhas, s or el has, aos br aos, aos cabel os espal hados pel os
% ombr os, mas t o depr essa buscava as pupi l as, a onda que sa a del as
% vi nha cr escendo, cava e escur a, ameaando envol ver - me, puxar - me e
% t r agar - me.
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%const ant es
QTD_PONTOS = 400 ;
TEMPO_ENTRE_PONTOS = 0. 001 ;
X0_OLHO = 2 ;
X0_SOMBR = 0. 5 ;
%conf i gur ando ol ho esquer do
% r i s ( c r cul o de r ai o uni t r i o desl ocado par a esquer da)
vet _r = r and( 1 , QTD_PONTOS ) ; %ger a de 0 a 1
vet _t het a = 2 * pi * r and( 1 , QTD_PONTOS ) ; %ger a de 0 a 2*Pi
vet _i r i sEsqX = vet _r . * cos( vet _t het a ) - X0_OLHO ;
vet _i r i sEsqY = vet _r . * si n( vet _t het a ) ;
%pl pebr as ( el i pse i ncompl et a desl ocada par a di r ei t a)
vet _mai sOuMenos = 2 * ( r and( 1 , QTD_PONTOS ) > 0. 5 ) - 1 ;
vet _pal pebr aEsqX = 1. 6 * ( 2 * r and( 1 , QTD_PONTOS ) - 1 ) ;
vet _pal pebr aEsqY = vet _mai sOuMenos . * ( 1. 6 * sqr t ( 1 - . . .
vet _pal pebr aEsqX . ^ 2 / ( 2 ^ 2 ) ) ) ;
vet _pal pebr aEsqX = vet _pal pebr aEsqX - X0_OLHO ;
%sobr ancel ha
vet _sombr ancel haEsqX = ( - 3. 5 ) * r and( 1 , QTD_PONTOS ) - X0_SOMBR ;
vet _sombr ancel haEsqY = 1. 6 * sqr t ( 1 - vet _sombr ancel haEsqX . ^ 2 . . .
/ ( 6 ^ 2 ) ) + 2 ;
%conf i gur ando ol ho di r ei t o
% r i s ( c r cul o de r ai o uni t r i o desl ocado par a di r ei t a)
vet _r = r and( 1 , QTD_PONTOS ) ; %ger a de 0 a 1
vet _t het a = 2 * pi * r and( 1 , QTD_PONTOS ) ; %ger a de 0 a 2*Pi
vet _i r i sDi r X = vet _r . * cos( vet _t het a ) + X0_OLHO ;
vet _i r i sDi r Y = vet _r . * si n( vet _t het a ) ;
%pl pebr as ( el i pse i ncompl et a desl ocada par a di r ei t a)
vet _mai sOuMenos = 2 * ( r and( 1 , QTD_PONTOS ) > 0. 5 ) - 1 ;
vet _pal pebr aDi r X = 1. 6 * ( 2 * r and( 1 , QTD_PONTOS ) - 1 ) ;
vet _pal pebr aDi r Y = vet _mai sOuMenos . * ( 1. 6 * sqr t ( 1 - . . .
vet _pal pebr aDi r X . ^ 2 / ( 2 ^ 2 ) ) ) ;
61
vet _pal pebr aDi r X = vet _pal pebr aDi r X + X0_OLHO ;
%sobr ancel ha
vet _sombr ancel haDi r X = 3. 5 * r and( 1 , QTD_PONTOS ) + X0_SOMBR ;
vet _sombr ancel haDi r Y = 1. 6 * sqr t ( 1 - vet _sombr ancel haDi r X . ^ 2 . . .
/ ( 6 ^ 2 ) ) + 2 ;
%pl ot ando pont o a pont o compausas par a vi sual i zao
f i gur e ;
hol d ;
xl i m( [ - ( X0_OLHO + 2 ) ( X0_OLHO + 2 ) ] ) ;
yl i m( [ - 3 5 ] ) ;
t i t l e( ' Ol hos de Ressaca' , ' Font Si ze' , 13 ) ;
xl abel ( ' ( por f avor , aguar de o t r mi no da ani mao) ' ) ;
f or i = 1 : QTD_PONTOS
pl ot ( vet _i r i sEsqX( i ) , vet _i r i sEsqY( i ) , ' . ' ) ;
pl ot ( vet _i r i sDi r X( i ) , vet _i r i sDi r Y( i ) , ' . ' ) ;
i f r em( i , 2 ) == 0
pl ot ( vet _pal pebr aEsqX( i ) , vet _pal pebr aEsqY( i ) , ' . ' ) ;
pl ot ( vet _sombr ancel haEsqX( i ) , vet _sombr ancel haEsqY( i ) , . . .
' . ' ) ;
pl ot ( vet _pal pebr aDi r X( i ) , vet _pal pebr aDi r Y( i ) , ' . ' ) ;
pl ot ( vet _sombr ancel haDi r X( i ) , vet _sombr ancel haDi r Y( i ) , . . .
' . ' ) ;
end
pause( TEMPO_ENTRE_PONTOS ) ;
end
xl abel ( ' Ani mao concl u da! ' ) ;
%l i mpando var i vei s ut i l i zadas
cl ear ;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%FI M DA ROTI NA %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9.4 Biot-Savart Numrico
%%%%%%%%%%%%%%%%%%%%%%%FUNO Cal cul ar CampoDi pol o %%%%%%%%%%%%%%%%%%%%%%%%
%
% Aut or : Bi ot - Savar t , scul o XI X
%
% Descr i o da Funo:
% Cal cul a o campo magnt i co H dumdi pl o, numpont o qual quer dado em
% coor denadas ci l ndr i cas.
%
% Chamada da Funo:
% Hz = Cal cul ar CampoDi pol o( i , a , r ho , z ) ;
%
% Par met r os Recebi dos:
% i - cor r ent e que ci r cul a no di pol o
% ( sent i do ant i - hor r i o) - > emAmpr es
% a - r ai o da espi r a ( di pol o) - > emmet r os
% r ho - coor denada RHO do pont o ( di st nci a ao ei xo Z) - > emmet r os
% z - coor denada Z do pont o - > emmet r os
%
% Val or r et or nado:
% Hz - val or do component e Z do campo - > emAmpr e * met r o
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
62
f unct i on Hz = Cal cul ar CampoDi pol o ( i , a , r ho , z )
i f nar gi n ~= 4
er r or ( ' *** ERRO *** Devemser passados exat os 4 ar gument os! ' ) ;
end
i f ( l engt h( i ) ~= l engt h( a ) | l engt h( i ) ~= l engt h( r ho ) | . . .
l engt h( i ) ~= l engt h( z ) . . .
) & . . .
( ~( l engt h( i ) == 1 & l engt h( a ) == 1 & l engt h( r ho ) == 1 ) & . . .
~( l engt h( i ) == 1 & l engt h( z ) == 1 & l engt h( r ho ) == 1 ) & . . .
~( l engt h( a ) == 1 & l engt h( z ) == 1 & l engt h( r ho ) == 1 ) & . . .
~( l engt h( i ) == 1 & l engt h( a ) == 1 & l engt h( z ) == 1 ) . . .
)
er r or ( [ ' *** ERRO *** Os 4 par met r os devemt er a mesma ' . . .
' di menso, ou apenas 1 deve ser no- escal ar ! ' ] ) ;
end
i f ~i sr eal ( i )
er r or ( ' *** ERRO *** Par amet r o 1 ( " i " ) i nvl i do! ' ) ;
end
i f ~i sr eal ( a ) | a < 0
er r or ( ' *** ERRO *** Par amet r o 2 ( " a" ) i nvl i do! ' ) ;
end
i f ~i sr eal ( r ho ) | r ho < 0
er r or ( ' *** ERRO *** Par amet r o 3 ( " r ho" ) i nvl i do! ' ) ;
end
i f ~i sr eal ( z )
er r or ( ' *** ERRO *** Par amet r o 4 ( " z" ) i nvl i do! ' ) ;
end
k = 4 * a . * r ho . / ( ( a + r ho ) . ^ 2 + z . ^ 2 ) ;
[ K , E ] = el l i pke( k ) ;
t er mo1 = i . / ( 2 * pi * sqr t ( ( a + r ho ) . ^ 2 + z . ^ 2 ) ) ;
t er mo2 = K + ( a . ^ 2 - r ho . ^ 2 - z . ^ 2 ) . * E . / . . .
( ( a - r ho ) . ^ 2 + z . ^ 2 ) ;
Hz = t er mo1 . * t er mo2 ;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%FI M DA FUNO %%%%%%%%%%%%%%%%%%%%%%%%%%%%
9.5 Documentador de *.ms
%%%%%%%%%%%%%%%%%%%%%%%%%%%ROTI NA Document ador %%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%Aut or : PPG- Man, o dono do " cal abouo" , 1970
%
%Descr i o da Rot i na:
% Demonst r ao da mani pul ao de ar qui vos t ext os, coma ut i l i dade de
% engl obar num" . doc" os cabeal hos de t odos os ar qui vos " . m" de um
% di r et r i o.
%
%Ci t ao:
% Nunca se t emt empo par a f azer di r ei t o, mas sempr e se t emt empo par a
% f azer de novo.
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%const ant es
NOME_ARQUI VO = ' document acao. t xt ' ;
DI RETORI O = ' . / ' ; %di r et r i o at ual
63
%buscando ar qui vos " . m" no di r et r i o
vet _st r uct _ar qui vosM = di r ( [ DI RETORI O ' *. m' ] ) ;
i f i sempt y( vet _st r uct _ar qui vosM )
er r or ( ' *** ERRO *** Nao ha ar qui vo M no di r et or i o! ' ) ;
end
%cr i ando ar qui vo de document ao
f i d_ar qui voDocument acao = f open( [ DI RETORI O NOME_ARQUI VO ] , ' w' ) ;
f pr i nt f ( f i d_ar qui voDocument acao , ' Document os do di r et or i o ' ) ;
f pr i nt f ( f i d_ar qui voDocument acao , DI RETORI O ) ;
f pr i nt f ( f i d_ar qui voDocument acao , ' : \ n\ n' ) ;
%l endo cada ar qui vo " . m"
f or i = 1 : l engt h( vet _st r uct _ar qui vosM )
st r i ng_nomeAr qui vo = [ DI RETORI O vet _st r uct _ar qui vosM( i ) . name ] ;
f i d_ar qui voM = f open( st r i ng_nomeAr qui vo , ' r ' ) ;
%OBS: t odo o cabeal ho do ar qui vo pode ser obt i do mai s f aci l ment e
%com" st r i ng_cabecal ho = hel p( st r i ng_ar qui voM ) " , mas o cami nho
%mai s compl i cado f oi f ei t o por r azes di dt i cas
i f f i d_ar qui voM == - 1
er r or ( ' *** ERRO *** Ar qui vo " . m" no pde ser aber t o! ' ) ;
end
%pul ando poss vei s l i nhas semcoment r i os
st r i ng_l i nhaAr qui voM = ' ' ;
whi l e ~f eof ( f i d_ar qui voM ) & . . .
( i sempt y( st r i ng_l i nhaAr qui voM ) | . . .
st r i ng_l i nhaAr qui voM( 1 ) ~= ' %' )
st r i ng_l i nhaAr qui voM = f get l ( f i d_ar qui voM ) ;
end
%copi ando l i nhas de coment r i os i ni ci ai s
whi l e ~f eof ( f i d_ar qui voM ) & . . .
~i sempt y( st r i ng_l i nhaAr qui voM ) & . . .
st r i ng_l i nhaAr qui voM( 1 ) == ' %'
st r i ng_l i nhaAr qui voM = st r r ep( st r i ng_l i nhaAr qui voM , . . .
' %' , ' %%' ) ;
st r i ng_l i nhaAr qui voM = st r r ep( st r i ng_l i nhaAr qui voM , . . .
' \ ' , ' / / ' ) ;
f pr i nt f ( f i d_ar qui voDocument acao , st r i ng_l i nhaAr qui voM ) ;
f pr i nt f ( f i d_ar qui voDocument acao , ' \ n' ) ;
st r i ng_l i nhaAr qui voM = f get l ( f i d_ar qui voM ) ;
end
f pr i nt f ( f i d_ar qui voDocument acao , ' \ n\ n' ) ;
f cl ose( f i d_ar qui voM ) ;
end
%f echando ( sal vando) ar qui vo da document ao
f cl ose( f i d_ar qui voDocument acao ) ;
%chamando Not ePad par a abr i r document ao
st r i ng_comando = [ ' ! not epad ' DI RETORI O NOME_ARQUI VO ]
eval ( st r i ng_comando ) ;
%l i mpando var i avei s usadas
cl ear ;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%FI M DA ROTI NA %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
64