Escolar Documentos
Profissional Documentos
Cultura Documentos
Guia Mat Lab
Guia Mat Lab
Este guia foi desenvolvido para aplicaes em MatLab 7.0, embora vrios
dos recursos tambm estejam disponveis em verses anteriores.
Por outro lado, pode haver funes que no funcionem na verso 7.0, pois
isso depender talvez de quais bibliotecas foram selecionadas durante a
instalao.
ndice
Captulo 1 Prlogo
1.1 Uso do MatLab ..................................................................................................... 05
1.2 MatLab x Maple ................................................................................................... 05
Captulo 2 Comandos Bsicos
2.1 Declaraes e Operaes Bsicas ......................................................................... 08
2.2 Comandos de Ajuda .............................................................................................. 11
2.3 Comandos para a Tela de Comandos .................................................................... 12
Captulo 3 Vetores e Matrizes
3.1 Notao e Declarao de Vetores no MatLab ......................................................
3.2 Operaes e Funes com Vetores .......................................................................
3.3 Matrizes: o Foco do MatLab ................................................................................
3.4 Matrizes Multidimensionais .................................................................................
14
16
18
21
22
22
23
23
24
28
31
33
37
38
39
40
41
41
43
45
47
48
48
49
50
58
59
60
62
63
Captulo 1 Prlogo
1.1 Uso do MatLab
Diversos professores falam: MatLab uma ferramenta muito boa, Faam isso
no MatLab ou Fiz uma coisa no MatLab para mostrar para vocs. Mas o que faz
desse programa uma ferramenta interessante?
Basicamente, trata-se de um software excelente para clculos numricos em
massa, otimizado para uso de vetores e matrizes (da o nome MatLab). Alm disso,
ele conta com timos recursos para plotagem, para simulao de sistemas diferenciais
(Simulink) e outros muitos que jamais iremos conhecer. Se instalarmos todos as
ferramentas disponveis da verso 7.0, o espao ocupado no HD pode ser bem maior do
que o esperado (e do que o necessrio).
Alm do mais, seu editor de funes e rotinas oferece um espao bem amigvel
aos programadores, contando inclusive com cores de identificao de cdigo e com um
debugger.
Aspect
os
Maple
> sin(a)^2+cos(a)^2 ;
> simplify(%) ;
> int(sec(x),x);
>
int(1/sqrt(2*Pi)*exp(0.5*x^2), x=-infinity
.. infinity);
Expresses
Literais
MatLab
>> sin(a)^2+cos(a)^2
??? Undefined function or variable
'a'.
>> syms x ;
>> a = sin(x)^2 + cos(x)^2
a =
sin(x)^2+cos(x)^2
>> simplify( a )
ans =
1
7186705221432913/18014398509481984
*2^(1/2)*pi^(1/2)
Exibio
dos Dados
>> syms a x y
>> ( a^2 + 5*log(x/y) ) / (
sqrt(11) + pi )
ans =
562949953421312/3635653209253651*a^
2+2814749767106560/3635653209253651
*log(x/y)
Pois , o Maple trabalha bem com expresses literais e numa exibio melhor.
Agora vejamos as vantagens do MatLab:
Aspectos
Maple
MatLab
> A:=matrix(2,2,[3,3,3,3]);
>> A = [ [3 3] ; [3 3] ]
B = [ [2 2] ; [2 2] ]
A =
> B:=matrix(2,2,[2,2,2,2]);
3
3
3
3
2
2
2
2
B =
> evalm(A.B);
Uso de vetores e
matrizes
>> A*B
ans =
12
12
12
12
>> A.*B
ans =
>
A:=[0,Pi/2,Pi,3*Pi/2,2*Pi];
6
6
6
6
>> x = 0 : pi/2 : 2*pi
x =
Clculo em
Massa
> sin(A);
Error, invalid input: sin
expects its 1st argument, x,
to be of type algebraic, but
received [0, 1/2*Pi, Pi,
3/2*Pi, 2*Pi]
3.1416
1.5708
6.2832
>> sin( x )
ans =
0.0000
0
4.7124
0
-1.0000
1.0000
-0.0000
if x >=0
retorno = sin( x );
else
retorno = 1 / x ;
end
> funcao(-2);
Funes
> funcao(2*Pi);
Error, (in funcao) cannot
determine if this expression
is true or false: -2*Pi <= 0
> funcao(evalf(2*Pi,1000));
>> funcao( -2 )
ans =
-0.5000
>> funcao( 2 * pi )
ans =
-2.4493e-016
>> plot( 0 : 0.1 : 10 ,
sin( 0 : 0.1 : 10 ) .^ 2 )
>> title( 'Seno' )
>> xlabel( 'x' )
>> ylabel( 'sen( x )' )
Grficos
De fato, o MatLab trabalha muito bem com matrizes e clculos em massa, alm
de possuir um aspecto de programao melhor. A manipulao dos grficos pode ser
mais interessante tambm, dependendo da aplicao.
Moral da histria: se quisermos uma anlise mais matemtica, mais literal,
usamos o Maple; se quisermos trabalhar com muito dados numricos e grficos, e
programar com vrios funes/mdulos, usamos o MatLab.
tela de comandos
editor de texto
OBS: no lado direito da tela de comandos, existe um quadro onde se podem
visualizar os arquivos do diretrio atual (Current Directory) e as variveis declaradas at
o momento (Workspace). Logo abaixo, temos o histrico dos comandos digitados.
Comecemos do princpio ento. Digitamos o comando sempre em frente do
>>, e a resposta aparece embaixo, como num prompt.
Para declarar variveis, fazemos o mais bvio dos comandos.
>> x = 2
x =
2
>> x = x + 2.5
x =
4.5
Repare que no se trata de uma linguagem tipada (ou seja, uma varivel pode ser
ora um nmero inteiro, ora uma string, etc, sem precisarmos declarar seu tipo).
Repare tambm que o uso do ponto e vrgula no obrigatrio. Quando posto,
ele apenas omite a resposta na tela de comandos (mas armazena o valor). E digitando
apenas o nome da varivel, seu valor aparece (caso j tenha sido declarado).
>> a
??? Undefined function or variable 'a'.
>> a = 3 ;
>> a
a =
3
A notao cientfica pode ser usada tambm. Para os que no sabem, 1.43e-3
(escreva tudo junto, sempre) significa 1.43 vezes 10 elevado a -3 = 0.00143.
>> a = 12.67e3
a =
12670
>> a = 2.6
a =
2.6000
>> b = 1.6
b =
1.6000
>> a + b
ans =
4.2000
>> ( a + b ) * ( a - b ) - a / b
a * b
ans =
2.5750
ans =
4.1600
10
ans =
4
11
Veja que, colocando a(s) inicial(is), pode-se retomar comandos de modo mais
rpido.
12
E, depois de digitar tantas declaraes e operaes, a tela j deve estar uma zona,
e a memria cheia de variveis inteis. Isso sem falar que poderamos estar plotando
vrios grficos tambm. Para limpar tudo isso sem sair do programa, usamos os
comandos:
Operao
Limpar Comandos da Tela
Limpar Variveis da Memria
(ou apenas uma em especfico)
Fechar Janela de Grfico
(ou fechar todas as janelas)
Funo
clc
clear
clear variavel
close
close all
13
>> vet = [ 0 1 2 3 4 ]
vet =
0
>> vet( 0 )
??? Subscript indices must either be real positive integers or
logicals.
>> vet( 1 )
ans =
0
>> vet( 4 )
ans =
3
>> vet = 0 : 2 : 9
14
vet =
0
>> vet( [1 3 7] )
ans =
0
>> vet( 2 : 4 )
ans =
1
>> vet( 1 : 3 : 9 )
ans =
0
>> vet1( 1 ) = [ ]
15
vet1 =
2
>> vet1( 2 : 4 ) = [ ]
vet1 =
2
>> 2 * vetA
ans =
2
15
16
0.6000
243
>> vetB ^ 2
??? Error using ==> ^
Matrix must be square.
>> vetB .^ 2
ans =
16
25
Funo
modulo = norm( vet )
prodEscalar = dot( vet1 , vet2 )
vet_result = cross( vet1 , vet2 )
totalElementos = length( vet )
soma = sum( vet )
produto = prod( vet )
media = mean( vet )
elem = max( vet )
[elem , indice] = max( vet )
elem = min( vet )
[elem , indice] = min( vet )
vet_indices = find( condio )
<exemplo: vet_indices = find( vet > 0 )
retorna ndices dos elementos positivos >
Existem muitas mais. Use o comando lookfor para buscar uma outra.
Por fim, importante citar que muitas funes aceitam vetores e matrizes
como argumento, aplicando suas operaes em todos os elementos. Isso feito de
maneira otimizada, para agilizar clculos em massa. o grande diferencial do MatLab.
>> vet = [ 0 3 6 9 ]
vet =
0
17
1.7321
2.4495
3.0000
0.1411
-0.2794
0.4121
2
5
3
6
>> matriz = [ 1 2 ; 3 4 ; 5 6 ]
matriz =
1
3
5
2
4
6
2
5
8
3
6
9
>> matriz( 1 , 2 )
ans =
2
>> matriz( 3 , 1 )
ans =
7
Para acessar uma linha / coluna inteira, usamos a notao matriz( linha , : )
/ matriz( : , coluna ).
>> matriz( 2 , : )
ans =
18
>> matriz( : , 3 )
ans =
3
6
9
4
5
6
7
8
9
>> matriz_linha = [ 1 2 3 4 ]
matriz_linha =
1
0
5
8
3
6
9
>> matriz( 1 , : ) = 10
matriz =
10
4
7
10
5
8
10
6
9
>> matriz( [ 1 1 ] , [ 1 3 ] ) = -2
matriz =
-2
10
-2
19
4
7
5
8
6
9
5.5000
5.0000
5.5000
5.5000
6.0000
5.5000
=
=
=
=
+
+
[ [ 1 1 ]
[ [ 0 1 ]
[ [ 1 2 3
[ [ 1 1 1
matriz_B
matriz_D
;
;
]
]
[
[
;
;
1
1
[
[
2
1
4
4
]
]
5
4
]
]
6
4
ans =
1
2
2
3
ans =
2
8
3
9
4
10
2
3
1
2
ans =
20
;
;
] ] ;
] ] ;
1.0000
1.0000
2.0000
1.2500
3.0000
1.5000
1
1
Funo
matriz = eye( N )
matriz = zeros( M , N )
matriz = ones( M , N )
matriz2 = reshape( matriz1 , M , N )
matriz2 = rot90( matriz1 , k )
matriz2 = fliplr( matriz1 )
matriz2 = flipud( matriz1 )
Veja que zeros e ones podem ser usadas para vetores tambm; basta passar o
parmetro M = 1. A funo fliplr espelha o vetor, e a flipud no o modifica em
nada.
Confira outras funes para matrizes em 4.4 lgebra Linear.
2
4
>> matriz3D( : , : , 2 ) = [ 5 6 ; 7 8 ]
matriz3D(:,:,1) =
1
3
2
4
matriz3D(:,:,2) =
5
7
6
8
21
Funo
x^n
sqrt( x )
exp( x )
log( x )
log10( x )
log2( x )
abs( x )
factorial( n )
nchoosek( N , K )
mod( A , B )
ceil( x )
floor( x )
round( x )
4.2 Trigonomtricas
As funes a seguir trabalham com ngulos em RADIANOS.
(em radianos)
Seno
Co-Seno
Tangente
Direta
sin( x )
cos( x )
tan( x )
Inversa (Arco-)
asin( x )
acos( x )
atan( x )
Direta
sind( x )
cosd( x )
tand( x )
22
Inversa (Arco-)
asind( x )
acosd( x )
atand( x )
Direta
sinh( x )
cosh( x )
tanh( x )
Inversa (Arco-)
asinh( x )
acosh( x )
atanh( x )
Funo
vet_raizes = roots( vet_coef )
< coeficientes do polinmio em ordem
decrescente de grau no vetor vet_coef >
vet_coef = poly( vet_raizes )
vet_coef = polyfit( vet_x , vet_y , N )
< cria polinmio de grau N que melhor
se aproxima dos pontos (x,y) >
y = polyval( vet_coef , x )
A dupla polyfit e polyval seriam bem teis nos laboratrios de fsica, onde
plotamos os pontos experimentais e buscamos no "olhmetro" a melhor reta formada
por eles. Bastaria usar "vet_coef = polyfit( pontos_x , pontos_y , 1 )" para obter os dois
coeficientes da reta. Da usaramos a polyval para obter os pontos dessa reta e plot-los
(exemplo: "plot( [-10 : 10] , polyval( vet_coef , [-10 : 10 ] ) )" ).
CUIDADO: polinmios do tipo x 4 + 4 x 2 5 x devem ser escritos na forma
desenvolvida (no caso, x 4 + 0 x 3 + 4 x 2 5 x + 0 ) e ento se passam os coeficientes (no
caso, [ 1 0 4 -5 0 ])! O vetor [ 1 4 -5 ] representaria o polinmio x 2 + 4 x 5 !
Confira o exemplo 2 do captulo 9 para ver uma aplicao dessas funes.
Por fim, vale lembrar novamente que o MatLab trabalha com nmeros
complexos, de forma que toda a equao polinomial ter soluo (mesmo que
aproximada).
Funo
determinante = det( matriz )
matriz_inversa = inv( matriz )
matriz_x = linsolve( A , B )
< A matriz quadrada e B matriz coluna >
23
3a b = 1
3 1
1
>> A = [ 5 2 ; 3 -1 ]
B = [ 9 ; 1 ]
A =
5
3
2
-1
B =
9
1
>> matriz_x = linsolve( A , B )
matriz_x =
1
2
Funo
matriz2 = sqrtm( matriz1 )
matriz2 = expm( matriz1 )
matriz2 = logm( matriz1 )
matriz2 = funm( matriz1 , @SIN )
matriz2 = funm( matriz1 , @COS )
matriz2 = funm( matriz1 , @SINH )
matriz2 = funm( matriz1 , @COSH )
Trigonomtricas de Matriz
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
Derivada Numrica
Funo
vet_derivada = diff( vet_funcao ) /
valor_passo
valorIntegral = quad( funcao , tempoIni ,
tempoFim )
[vet_tempo vet_y] = ode45( funcao , [
tempoIni tempoFim ] , vet_condIni )
<onde y = funo>
dt = 0.001 ;
vet_t = 0 : dt : 5 ;
vet_y = cos( vet_t ) .* vet_t ;
vet_derivada = diff( vet_y ) / dt ;
25
y ' (t ) =
1
(cos(t ) y (t ) ) .
2
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:
function retorno = funcao ( tempo , y )
retorno = ( cos( tempo ) - y ) / 2 ;
26
Funo
syms nomeSimbolo
diff( expressao )
diff( expressao , variavel )
diff( expresso, N )
int( expressao )
int( expressao , variavel )
int( expresso, A , B )
dsolve( equacao )
dsolve( equacao , condicoesIniciais )
t
com respeito a x
1+ x2
>> syms x ;
>> syms t ;
>> symb_expressao = t / ( 1 + x^2 )
symb_expressao =
t/(1+x^2)
27
Funo
H = tf( vet_coef_num , vet_coef_denom )
< numerador e do denominador com
polinmios de s>
step( H )
step( H , vet_tempo )
[vet_Y vet_tempo] = step( H )
impulse( H )
impulse( H , vet_tempo )
[vet_Y vet_tempo] = impulse( H )
lsim( H , vet_X , vet_tempo )
vet_Y = lsim ( H , vet_X , vet_tempo )
bode( H )
vet_XF = fft( vet_X )
28
>>
>>
>>
>>
impulse( Hc ) ;
step( Hc ) ;
vet_tempo = [ 0 : 0.001 : 3.5 ] ;
lsim( Hc , exp( -1 * vet_tempo ) , vet_tempo ) ;
29
250s ( s + 1) 2 ( s + 10000)
( s + 10)( s + 100) 2 ( s + 1000)
vet_raizesNumerador = [ 0 1 1 10000 ] ;
vet_raizesDenominador = [ 10 100 100 1000 ] ;
vet_coefPolinomioNumerador = 250 * poly( vet_raizesNumerador ) ;
vet_coefPolinomioDenominador = poly( vet_raizesDenominador ) ;
H = tf( vet_coefPolinomioNumerador , vet_coefPolinomioDenominador )
Transfer function:
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
Funo
[ vet_coefNum vet_coefDenom = butter( N , Wc , low)
[ vet_coefNum vet_coefDenom = butter( N , Wc , high)
[ vet_coefNum vet_coefDenom = butter( N , [W1 W2] )
31
Funo
vet_fatores = factor( numero )
mmc = lcm( num1, num2 )
vet_mmc = lcm( vet1 , vet2 )
matriz_mmc = lcm( matriz1 , matriz2 )
mdc = gcd( num1, num2 )
vet_mdc = gcd( vet1 , vet2 )
matriz_mdc = gcd( matriz1 , matriz2 )
condicao = isprime( numero )
vet_condicoes = isprime( vet )
mat_condicoes = isprime( matriz )
vet_primos = primes( N )
Funo
matriz = rand( M , N )
matriz = randn( M , N )
numero = random( string_Distrib , ... )
< consulte help random para maiores
detalhes >
Funes
numDecimal = bin2dec( string_numBinario )
string_numBinario = dec2bin( numDecimal )
numDecimal = hex2dec( string_numHexa )
string_numHexa = dec2hex( numDecimal )
numDouble = hex2num( string_numHexa )
string_numHexa = num2hex( numDouble )
32
Funo
plot( vet_x , vet_y )
bar( vet_x , vet_y )
stem( vet_x , vet_y )
stairs( vet_x , vet_y )
loglog( vet_x , vet_y )
semilogx( vet_x , vet_y )
semilogy( vet_x , vet_y )
polar( vet_theta , vet_raio )
Funo
area( vet_x , vet_ y )
hold
hold on
hold off
figure
subplot( M , N , P )
pie( vet_valores )
pie( vet_valores , vet_fatiasSobressaidas )
imagesc( matriz )
colorbar
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 = sin( vet_x ) ;
vet_y2 = mod( vet_x , 1 ) ;
>> subplot( 2 , 1 , 1 ) ;
>> plot( vet_x , vet_y1 ) ;
>> subplot( 2 , 1 , 2 ) ;
>> plot( vet_x , vet_y2 ) ;
35
36
vet_x
vet_x
vet_x
vet_x
vet_x
,
,
,
,
,
vet_y
vet_y
vet_y
vet_y
vet_y
,
,
,
,
,
Identificando Eixos
Grade Pontilhada
Ajuste Automtica dos Eixos
(fixando ou adaptando segundo as curvas)
Legenda
(til para quando h mais de uma curva)
Funo
title( string )
xlabel( string )
ylabel( string )
zlabel( string )
grid
axis manual
axis tight
legend( string_curva1 , string_curva2 , ... )
37
5.3 Plotando em 3D
H dois modos de se plotar em trs dimenses: com linhas ou superfcies.
Modo de Plotar
Linhas (Pontos Ligados) em 3D
Superfcie em 3D
Combinando Vetores X e Y para Gerar
Matrizes para Plotar Superfcies
Funo
plot3( vet_x , vet_y , vet_z )
surf( matriz_x , matriz_y , matriz_z )
[matriz_x , matriz_y ] = meshgrid( vet_x ,
vet_y )
vet_x = -2 : 0.1 : 2 ;
vet_y = -2 : 0.1 : 2 ;
[ matriz_x , matriz_y ] = meshgrid( vet_x , vet_y ) ;
matriz_z = matriz_x .^2 + matriz_y .^2 ;
surf( matriz_x , matriz_y , matriz_z ) ;
38
Comando
set( gca , 'fontsize' , numeroFonte )
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)
Funo
[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>
vet_x = get( get( gca , 'children' ) , 'XData' )
vet_y = get( get( gca , 'children' ) , 'YData' )
40
41
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.
function resultado = funcao ( parametro1 , parametro2 )
(...)
resultado = ( ... )
(...)
42
funo_usuario( varargin{ : } ) ;
(...)
if condicao
bloco
end
if condicao1
bloco1
elseif condicao2
bloco2
elseif condicao3
bloco3
(...)
elseif condicaoN
blocoN
end
if condicao1
bloco1
elseif condicao2
bloco1
else
bloco3
end
43
while condicao
bloco
end
for i = [ 2 5 6 ]
bloco
end
for i = 0 : 2 : N
bloco
end
Notao
X == Y
X ~= Y
X > Y
X <= Y
mod( X , Y ) == 0
mod( X , 1 ) == 0
mod( X , 2 ) == 0
isprime( X )
isreal( X )
length( X ) == 1
Notao(es)
A & B
and( A , B )
A | B
or( A , B )
xor( A , B )
~A
not( A )
44
Veja agora um exemplo de funo que usa alguns dos conceitos at aqui
apresentados.
function retorno = primoAnterior ( numero )
if length( numero ) ~= 1 | ~isreal( numero ) | numero < 3
% erro: foi passado um vetor, um complexo ou um numero menor
do que 3
retorno = NaN ;
else
% pega maior inteiro anterior ao nmero recebido
numeroAtual = ceil( numero - 1 ) ;
while ~isprime( numeroAtual )
numeroAtual = numeroAtual - 1 ;
end
retorno = numeroAtual ;
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
Calcular seno dos
elementos de um
vetor
Obter soma de
todos os elementos
de um vetor
Zerar elementos de
3 em 3 de um vetor
Estilo C
for i = 1 : length( vet )
vet2(i) = sin( vet(i) ) ;
end
soma = 0
for i = 1 : length( vet )
soma = soma + vet( i ) ;
end
for i = 1 : length( vet )
if mod( i , 3 ) == 0
vet( i ) = 0 ;
end
end
Estilo MatLab
vet2 = sin( vet ) ;
45
rotina2.m:
a = 1 ;
funcao1.m:
function funcao1 ( )
global b
b = 2 ;
c = 3 ;
46
b =
2
??? Undefined function or variable "c".
Error in ==> rotina1 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
Funo
string = [ string1 string2 ...]
matString = strvcat( string1 , string2 , ...)
matString = strvcat( matString1 ,
matString2 , ...)
condicao = strcmp( string1, string2 )
string = num2str( numero )
numero = str2num( string )
vet_indices = strfind( string ,
string_trecho )
stringNova = strrep( string , string_trecho
, string_substituta )
eval( string_comando )
Cdigo
\alpha
\beta
\theta
\Omega
\omega
\sigma
\pi
\lambda
\rho
\mu
\gamma
48
^
_
Aqui temos, por fim, alguns caracteres usados na manipulao de arquivos texto.
Caractere Especial
Quebra de Linha
Tabulao
Caractere \
Caractere %
Cdigo
\n
\t
\\
%%
Funo
disp( string_mensagem )
error( string_mensagem )
Funo
open nomeFuncao
string_ objetivo:
r = ler o arquivo (read)
w = criar e escrever no arquivo (write)
a = continuar escrevendo no arquivo (append)
fprintf( fid_arquivo, string_texto )
fprintf( fid_arquivo, string_texto, ... )
condio = feof( fid_arquivo )
fscanf( string_formatos , variavel1 , variavel2 , ... )
49
string_ formatos:
%d =captura inteiro
%f = captura numero de casas decimais (float)
%c = captura caractere (char)
%s = captura palavra (string)
string_linha = fgetl( fid_arquivo )
fclose( fid_arquivo )
Funo
vet_som = wavread( string_nomeArquivo )
pw( string_nomeArquivo )
Funo
matriz3d_imagem = imread( string_nomeArquivo,
string_extensao )
string_extensao:
jpeg
bmp
gif
(...)
image( matriz3d_imagem )
50
Funo / Comando
aperte Ctrl + C na tela de comandos
pause( tempoEmSegundos )
pause
!caminhodoPrograma
!comandoDOS
51
Captulo 8
Qualidade
Programando
com
52
%ylim([ -1 1 ]) ;
%plot(x,y,'*') ;
elseif a==3
r=r*sqrt(rand(1,p));
t=2*pi*rand(1,p);
x=r.*cos(t);
y=r.*sin(t);
%subplot(3,1,3);
%figure;
%xlim([-1 1]);
%ylim([-1 1]);
%hold on;
%plot(x,y,'*');
end
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.
53
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:
54
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.
if strcmp( modoDistribuicao , 'concentradoBordasHorizontais' )
vet_x = raio * ( 2 * rand( 1 , qtdPontos ) - 1 ) ; % valores entre [-raio
raio]
vet_y = sqrt( 1 - vet_x .^ 2 ) .* ( 2 * rand( 1 , qtdPontos ) - 1 ) ;
elseif strcmp( modoDistribuicao , 'concentradoCentro' )
vet_r = raio * rand( 1 , qtdPontos ) ;
vet_theta = 2 * pi * rand( 1 , qtdPontos ) ;
vet_x = vet_r .* cos( vet_theta ) ;
vet_y = vet_r .* sin( vet_theta ) ;
elseif strcmp( modoDistribuicao , 'uniforme' )
vet_r = raio * sqrt( rand( 1 , qtdPontos ) ) ;
vet_theta = 2 * pi * rand( 1 , qtdPontos ) ;
vet_x = vet_r .* cos( vet_theta ) ;
vet_y = vet_r .* sin( vet_theta ) ;
else
error( '*** ERRO *** Parametro "modoDistribuicao" invlido!' ) ;
end
55
56
57
58
hold ;
plot( vet_pontos2Y , - vet_pontos2Y .* ...
( log( vet_pontos2Y ) - 1 ) , '*r' ) ;
legend( 'Simulada' , 'Teorica' ) ;
hold ;
% plotando py_Y
subplot( 2 , 1 , 2 ) ;
plot( vet_pontosY , vet_py_Y ) ;
xlabel( 'y' , 'fontsize' , 13 ) ;
ylabel( 'p_y( Y )' , 'fontsize' , 13 ) ;
% plotar curva terica
hold ;
plot( vet_pontos2Y , - log( vet_pontos2Y ) , '*r' ) ;
legend( 'Simulada' , 'Teorica' ) ;
hold ;
% deleta variveis usadas acima
clear ;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% FIM DA ROTINA %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
59
for i = 1 : grauPolinomio
if vet_coeficientes( i +
string_sinal
elseif vet_coeficientes(
string_sinal
end
1
=
i
=
)
'
+
'
>
+
1
'
0
' ;
) < 0
;
if i < grauPolinomio
string_expoente = [ '^' num2str( grauPolinomio + 1 - i ) ] ;
else
string_expoente = '' ;
end
if vet_coeficientes( i ) ~= 0
string_polinomio = [ string_polinomio ...
num2str( vet_coeficientes( i ) ) ...
'x' string_expoente string_sinal ] ;
end
end
% final da string: termo independente no tem 'x^0 + '
if vet_coeficientes( grauPolinomio + 1 ) ~= 0
string_polinomio = [ string_polinomio ...
num2str( vet_coeficientes( grauPolinomio + 1 ) ) ] ;
end
% plotando nova figura com pontos selecionados e o polinmio gerado
plot( vet_XSelecionados , vet_YSelecionados , 'ro' , ...
'LineWidth' , 1.5 ) ;
hold ;
plot( vet_XPolinomio , vet_YPolinomio , 'b' , 'LineWidth' , 2 ) ;
xlabel( 'x' ) ;
ylabel( 'y' ) ;
title( 'Polinmio gerado com a captura dos pontos' ) ;
legend( 'Pontos Selecionados' , string_polinomio ) ;
hold ;
% limpa variveis da memria
clear ;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% FIM DA ROTINA %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
(x x 0 )
(x x 0 ) + (y y 0 ) r 2
2
ou
x = r cos( ) + x 0
y = r sin( ) + y 0
, com
r [0 raio]
a2
(y y 0 )
b2
y = b 1
[0 2 ]
=1
x2
+ y0
a2
60
% Descrio da Rotina:
%
Demonstrao literria da gerao de nmeros aleatrios e da plotagem
%
no MatLab.
%
Geram-se, para a esquerda e para a direita, um crculo e uma elipse
%
incompleta nas extremidades horizontais, com pontos aleatrios.
%
Enquanto a elipse tem seus pontos uniformemente distribudos, o
%
crculo os tem mais densamente no centro.
%
Se voc cursa ou j cursou "Probabilidade e Estatstica" ou "Modelos
%
Probabilsticos para Engenharia Eltrica", tente demonstrar o
%
resultado atravs da anlise terica das equaes utilizadas.
%
A plotagem feita aos poucos. Pegue uma pipoca e assista animao.
%
% Citao:
%
Retrica dos namorados, d-me uma comparao exata e potica para o que
%
foram aqueles olhos de Capitu. No me acode imagem capaz de dizer,
%
sem quebra da dignidade do estilo, o que foram e me fizeram. Olhos
%
de ressaca? V, de ressaca. o que me d idia daquela feio nova.
%
Traziam no sei que fluido misterioso e enrgico, uma fora que
%
arrastava pra dentro, como a vaga que se retira da praia, nos dias
%
de ressaca. Para no ser arrastado, agarrei-me s outras partes
%
vizinhas, s orelhas, aos braos, aos cabelos espalhados pelos
%
ombros, mas to depressa buscava as pupilas, a onda que saa delas
%
vinha crescendo, cava e escura, ameaando envolver-me, puxar-me e
%
tragar-me.
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% constantes
QTD_PONTOS = 400 ;
TEMPO_ENTRE_PONTOS = 0.001 ;
X0_OLHO = 2 ;
X0_SOMBR = 0.5 ;
% configurando olho esquerdo
% ris (crculo de raio unitrio deslocado para esquerda)
vet_r = rand( 1 , QTD_PONTOS ) ;
% gera de 0 a 1
vet_theta = 2 * pi * rand( 1 , QTD_PONTOS ) ;
% gera de 0 a 2*Pi
vet_irisEsqX = vet_r .* cos( vet_theta ) - X0_OLHO ;
vet_irisEsqY = vet_r .* sin( vet_theta ) ;
% plpebras (elipse incompleta deslocada para direita)
vet_maisOuMenos = 2 * ( rand( 1 , QTD_PONTOS ) > 0.5 ) - 1 ;
vet_palpebraEsqX = 1.6 * ( 2 * rand( 1 , QTD_PONTOS ) - 1 ) ;
vet_palpebraEsqY = vet_maisOuMenos .* ( 1.6 * sqrt( 1 - ...
vet_palpebraEsqX .^ 2 / ( 2 ^ 2 ) ) ) ;
vet_palpebraEsqX = vet_palpebraEsqX - X0_OLHO ;
% sobrancelha
vet_sombrancelhaEsqX = ( -3.5 ) * rand( 1 , QTD_PONTOS ) - X0_SOMBR ;
vet_sombrancelhaEsqY = 1.6 * sqrt( 1 - vet_sombrancelhaEsqX .^ 2 ...
/ ( 6 ^ 2 ) ) + 2 ;
% configurando olho direito
% ris (crculo de raio unitrio deslocado para direita)
vet_r = rand( 1 , QTD_PONTOS ) ;
% gera de 0 a 1
vet_theta = 2 * pi * rand( 1 , QTD_PONTOS ) ;
% gera de 0 a 2*Pi
vet_irisDirX = vet_r .* cos( vet_theta ) + X0_OLHO ;
vet_irisDirY = vet_r .* sin( vet_theta ) ;
% plpebras (elipse incompleta deslocada para direita)
vet_maisOuMenos = 2 * ( rand( 1 , QTD_PONTOS ) > 0.5 ) - 1 ;
vet_palpebraDirX = 1.6 * ( 2 * rand( 1 , QTD_PONTOS ) - 1 ) ;
vet_palpebraDirY = vet_maisOuMenos .* ( 1.6 * sqrt( 1 - ...
vet_palpebraDirX .^ 2 / ( 2 ^ 2 ) ) ) ;
61
62
...
) & ...
) & ...
) & ...
...
' ...
;
if ~isreal( i )
error( '*** ERRO *** Parametro 1 ("i") invlido!' ) ;
end
if ~isreal( a ) | a < 0
error( '*** ERRO *** Parametro 2 ("a") invlido!' ) ;
end
if ~isreal( rho ) | rho < 0
error( '*** ERRO *** Parametro 3 ("rho") invlido!' ) ;
end
if ~isreal( z )
error( '*** ERRO *** Parametro 4 ("z") invlido!' ) ;
end
k = 4 * a .* rho ./ ( ( a + rho ) .^ 2 + z .^ 2 ) ;
[ K , E ] = ellipke( k ) ;
termo1 = i ./ ( 2 * pi * sqrt( ( a + rho ) .^ 2 + z .^ 2 ) ) ;
termo2 = K + ( a .^ 2 - rho .^ 2 - z .^ 2 ) .* E ./ ...
( ( a - rho ) .^ 2 + z .^ 2 ) ;
Hz = termo1 .* termo2 ;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% FIM DA FUNO %%%%%%%%%%%%%%%%%%%%%%%%%%%%
63
64