Escolar Documentos
Profissional Documentos
Cultura Documentos
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.
2
ndice
Captulo 1 Prlogo
3
9.1 Problema de Probabilidade ................................................................................... 58
9.2 Criando um Polinmio .......................................................................................... 59
9.3 Animao Grfica ................................................................................................ 60
9.4 Biot-Savart Numrico ............................................................................................ 62
9.5 Documentador de *.ms ....................................................................................... 63
4
Captulo 1 Prlogo
> a =
int(1/sqrt(2*Pi)*exp(-
0.5*x^2), x=-infinity sin(x)^2+cos(x)^2
.. infinity);
Expresses
Literais >> simplify( a )
ans =
ans =
5
7186705221432913/18014398509481984
*2^(1/2)*pi^(1/2)
Exibio ans =
dos Dados
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:
A =
> B:=matrix(2,2,[2,2,2,2]); 3 3
3 3
> evalm(A.B); B =
2 2
Uso de vetores e 2 2
matrizes
>> A*B
ans =
12 12
12 12
>> A.*B
ans =
6 6
6 6
> >> x = 0 : pi/2 : 2*pi
A:=[0,Pi/2,Pi,3*Pi/2,2*Pi];
x =
0 1.5708
> sin(A); 3.1416 4.7124 6.2832
Error, invalid input: sin
expects its 1st argument, x, >> sin( x )
to be of type algebraic, but
received [0, 1/2*Pi, Pi, ans =
Clculo em 3/2*Pi, 2*Pi]
Massa 0 1.0000
0.0000 -1.0000 -0.0000
6
> for i from 0 to 4 do
v[i] := sin( Pi*i/2 );
end do;
if x >=0
> funcao(-2); retorno = sin( x );
else
retorno = 1 / x ;
end
Funes > funcao(2*Pi);
Error, (in funcao) cannot >> funcao( -2 )
determine if this expression
is true or false: -2*Pi <= 0 ans =
>> funcao( 2 * pi )
ans =
-2.4493e-016
> plot((sin(x))^2, x=0..10, >> plot( 0 : 0.1 : 10 ,
title=Seno,labels=["x", sin( 0 : 0.1 : 10 ) .^ 2 )
"sen(x)"],labeldirections=[h >> title( 'Seno' )
orizontal,vertical]); >> 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.
7
Captulo 2 Comandos Bsicos
tela de comandos
editor de texto
8
>> x = 2
x =
>> x = x + 2.5
x =
4.5
x =
-5.6000 + 3.0000i
>> x = 'string'
x =
string
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 =
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
9
>> 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
>> c = a ^ 2 + b ^ 2
c =
9.3200
>> i ^ 2
ans =
-1
>> j ^ 3
ans =
0 - 1.0000i
>> i = 2
i =
>> i ^ 2
10
ans =
ans =
2.0100
ans =
0 + 2.0100i
>> 1 / 0
Warning: Divide by zero.
ans =
Inf
>> 0 / 0
Warning: Divide by zero.
ans =
NaN
11
Ok, mas e se eu no souber o nome da funo de que preciso? No se aflija, pois
para isso existe o comando lookfor palavra. Com a lista de funes encontradas com
palavra em sua descrio, usa-se em seguida o comando help para investigar melhor seu
funcionamento. E para pesquisar uma expresso com mais de uma palavra, coloque
aspas simples nela (lookfor 'palavra1 palavra2 ...')
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 Funo
Limpar Comandos da Tela clc
Limpar Variveis da Memria clear
(ou apenas uma em especfico) clear variavel
Fechar Janela de Grfico close
(ou fechar todas as janelas) close all
13
Captulo 3 Vetores e Matrizes
>> vet = [ 0 , 1 , 2 , 3 ]
vet =
0 1 2 3
>> vet = [ 0 1 2 3 4 ]
vet =
0 1 2 3 4
>> vet( 0 )
??? Subscript indices must either be real positive integers or
logicals.
>> vet( 1 )
ans =
>> vet( 4 )
ans =
>> vet = 0 : 9
vet =
0 1 2 3 4 5 6 7 8 9
>> vet = 0 : 2 : 9
14
vet =
0 2 4 6 8
>> vet = 0 : 9
vet =
0 1 2 3 4 5 6 7 8 9
>> vet( [1 3 7] )
ans =
0 2 6
>> vet( 2 : 4 )
ans =
1 2 3
>> vet( 1 : 3 : 9 )
ans =
0 3 6
>> vet1 = [ 1 2 3 4 5 6 ] ;
vet2 = [ 7 8 9 ] ;
>> [ vet1 vet2 ]
ans =
1 2 3 4 5 6 7 8 9
ans =
1 2 3 6 7
vet1 =
0 2 3 4 5 6
>> vet1( 1 ) = [ ]
15
vet1 =
2 3 4 5 6
>> vet1( 2 : 4 ) = [ ]
vet1 =
2 6
>> vetA = [ 1 2 3 ] ;
vetB = [ 1 1 1 ] ;
>> vetA + vetB
ans =
2 3 4
>> 2 * vetA
ans =
2 4 6
ans =
-1 0 1
>> vetA = [ 2 3 ] ;
vetB = [ 4 5 ] ;
>> vetA * vetB
??? Error using ==> *
Inner matrix dimensions must agree.
ans =
8 15
16
>> vetA ./ vetB
ans =
0.5000 0.6000
ans =
16 243
>> vetB ^ 2
??? Error using ==> ^
Matrix must be square.
>> vetB .^ 2
ans =
16 25
Operao Funo
Mdulo (Norma) do Vetor modulo = norm( vet )
Produto Escalar de Dois Vetores prodEscalar = dot( vet1 , vet2 )
Produto Vetorial de Dois Vetores (R3) vet_result = cross( vet1 , vet2 )
Total de Elementos (Comprimento) totalElementos = length( vet )
Soma dos Elementos soma = sum( vet )
Produto dos Elementos produto = prod( vet )
Mdia dos Elementos media = mean( vet )
Maior dos Elementos elem = max( vet )
(ou o maior elemento e seu ndice) [elem , indice] = max( vet )
Menor dos Elementos elem = min( vet )
(ou o menor elemento e seu ndice) [elem , indice] = min( vet )
Encontrar ndices dos Elementos que vet_indices = find( condio )
Satisfaam Certa 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 3 6 9
ans =
17
0 1.7321 2.4495 3.0000
ans =
>> matriz = [ [1 2 3 ] ; [4 5 6 ] ]
matriz =
1 2 3
4 5 6
>> matriz = [ 1 2 ; 3 4 ; 5 6 ]
matriz =
1 2
3 4
5 6
>> matriz = [ [1 2 3 ] ; [4 5 6 ] ; [7 8 9 ] ]
matriz =
1 2 3
4 5 6
7 8 9
>> matriz( 1 , 2 )
ans =
>> matriz( 3 , 1 )
ans =
Para acessar uma linha / coluna inteira, usamos a notao matriz( linha , : )
/ matriz( : , coluna ).
>> matriz( 2 , : )
ans =
18
4 5 6
>> matriz( : , 3 )
ans =
3
6
9
>> matriz'
ans =
1 4 7
2 5 8
3 6 9
>> matriz_linha = [ 1 2 3 4 ]
matriz_linha =
1 2 3 4
matriz_coluna =
1
2
3
4
>> matriz = [ [1 2 3] ; [4 5 6] ; [7 8 9] ] ;
>> matriz( 1 , 2 ) = 0
matriz =
1 0 3
4 5 6
7 8 9
>> matriz( 1 , : ) = 10
matriz =
10 10 10
4 5 6
7 8 9
>> matriz( [ 1 1 ] , [ 1 3 ] ) = -2
matriz =
-2 10 -2
19
4 5 6
7 8 9
matriz =
>> matriz_A = [ [ 1 1 ] ; [ 1 2 ] ] ;
matriz_B = [ [ 0 1 ] ; [ 1 1 ] ] ;
matriz_C = [ [ 1 2 3 ] ; [ 4 5 6 ] ] ;
matriz_D = [ [ 1 1 1 ] ; [ 4 4 4 ] ] ;
>> matriz_A + matriz_B
matriz_C + matriz_D
ans =
1 2
2 3
ans =
2 3 4
8 9 10
ans =
1 2
2 3
ans =
0 1
1 2
ans =
20
1.0000 2.0000 3.0000
1.0000 1.2500 1.5000
ans =
0 1
1 1
Operao Funo
Criar Matriz N x N Identidade matriz = eye( N )
Criar Matriz M x N de Zeros matriz = zeros( M , N )
Criar Matriz M x N de 1s matriz = ones( M , N )
Redimensionar Matriz para M x N matriz2 = reshape( matriz1 , M , N )
Rodar Matriz em k*90 matriz2 = rot90( matriz1 , k )
Espelhar Matriz da Esquerda para Direita matriz2 = fliplr( matriz1 )
Espelhar Matriz de Cima para Baixo 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.
>> matriz3D = [ 1 2 ; 3 4 ]
matriz3D =
1 2
3 4
>> matriz3D( : , : , 2 ) = [ 5 6 ; 7 8 ]
matriz3D(:,:,1) =
1 2
3 4
matriz3D(:,:,2) =
5 6
7 8
21
Captulo 4 Funes Matemticas
Operao Funo
Potenciao x^n
Radiciao (Raiz Quadrada) sqrt( x )
Exponenciao exp( x )
(potncia do nmero neperiano)
Logaritmo Neperiano ( ln ) log( x )
Logaritmo Decimal log10( x )
Logaritmo na Base 2 log2( x )
Mdulo abs( x )
(para nmeros complexos tambm)
Fatorial (n!) factorial( n )
Combinao de N, K a K nchoosek( N , K )
Mdulo do Resto da Diviso de A por B mod( A , B )
Arredondamento(para Cima, para Baixo ceil( x )
ou para o Mais Prximo) floor( x )
round( x )
4.2 Trigonomtricas
As funes a seguir trabalham com ngulos em RADIANOS.
22
Lembrando que as funes inversas retornam valores de ngulo entre /2 e /2
radianos / -90 e + 90. Muito cuidado quando for us-las para no errar o quadrante
desejado!
Por fim, as funes hiperblicas.
Operao Funo
Resolver Equao Polinomial vet_raizes = roots( vet_coef )
(Encontrar as Razes) < coeficientes do polinmio em ordem
decrescente de grau no vetor vet_coef >
Montar Polinmio a Partir das Razes vet_coef = poly( vet_raizes )
Encontrar Melhor Polinmio vet_coef = polyfit( vet_x , vet_y , N )
(Mnimos Quadrados) < cria polinmio de grau N que melhor
se aproxima dos pontos (x,y) >
Aplicar "x" num Polinmio 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).
Operao Funo
Determinante determinante = det( matriz )
Inversa matriz_inversa = inv( matriz )
Resolver Sistema Linear matriz_x = linsolve( A , B )
(A*X = B) < A matriz quadrada e B matriz coluna >
23
< x matriz coluna com as solues >
matriz_autoval = eig( matriz )
< retorna autovalores numa matriz coluna >
AutoValores / Auto Vetores
(eigenvalues / eigenvectors) [ mat_autoval , mat_autovet ] = eig( matriz )
< retorna autovalores numa matriz diagonal e
autovetores em colunas numa outra matriz >
Decomposio LU [ L , U ] = lu( matriz )
Decomposio QR [ Q , R ] = qr( matriz )
5a + 2b = 9 5 2 9
A * X = B X =
3a b = 1 3 1 1
>> A = [ 5 2 ; 3 -1 ]
B = [ 9 ; 1 ]
A =
5 2
3 -1
B =
9
1
matriz_x =
1
2
Operao Funo
Raiz Quadrada de Matriz matriz2 = sqrtm( matriz1 )
Exponencial de Matriz matriz2 = expm( matriz1 )
Logaritmo de Matriz matriz2 = logm( matriz1 )
matriz2 = funm( matriz1 , @SIN )
Trigonomtricas de Matriz matriz2 = funm( matriz1 , @COS )
matriz2 = funm( matriz1 , @SINH )
matriz2 = funm( matriz1 , @COSH )
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 valorIntegral = quad( funcao , tempoIni ,
(quadrature) tempoFim )
Resoluo Numrica de Equao ou [vet_tempo vet_y] = ode45( funcao , [
Sistema Diferencial de 1. Ordem tempoIni tempoFim ] , vet_condIni )
<onde y = funo>
dy y (t 0 + t ) y (t 0 )
(t 0 ) = lim t 0 ,
dt t
podemos calcul-la com o resultado da funo diff dividido pelo intervalo dum
infinitesimal um valor suficientemente pequeno.
>> dt = 0.001 ;
>> vet_t = 0 : dt : 5 ;
>> vet_y = cos( vet_t ) .* vet_t ;
>> vet_derivada = diff( vet_y ) / dt ;
ans =
-5.5110
25
1
y ' (t ) = (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:
>> tempoInicial = 0 ;
>> tempoFinal = 5 ;
>> condicaoInicial = 10 ;
>> [ vet_tempo , vet_y ] = ode45( @funcao , [ tempoInicial
tempoFinal ] , condicaoInicial ) ;
vet_retorno = zeros( 2 , 1 ) ;
vet_retorno( 2 ) = vet_var( 1 ) ;
>> tempoInicial = 0 ;
>> tempoFinal = 5 ;
>> vet_condicaoInicial = [ 0 10 ] ;
>> [ vet_tempo , vet_var ] = ode45( @funcao , [ tempoInicial
tempoFinal ] , vet_condicaoInicial ) ;
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 diff( expressao )
(ou derivada parcial) diff( expressao , variavel )
(ou derivada de ordem N) diff( expresso, N )
Calcular Integral de uma Expresso int( expressao )
(ou integral com respeito a uma varivel) int( expressao , variavel )
(ou integral definida de A a B) int( expresso, A , B )
Resolver Equao Diferencial dsolve( equacao )
dsolve( equacao , condicoesIniciais )
t
exemplo 1: calcular derivada segunda e integral de com respeito a x
1+ x2
>> syms x ;
>> syms t ;
>> symb_expressao = t / ( 1 + x^2 )
symb_expressao =
t/(1+x^2)
ans =
8*t/(1+x^2)^3*x^2-2*t/(1+x^2)^2
ans =
t*atan(x)
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
H = tf( vet_coef_num , vet_coef_denom )
Montar Funo de Transferncia < numerador e do denominador com
polinmios de s>
step( H )
Resposta ao Degrau step( H , vet_tempo )
[vet_Y vet_tempo] = step( H )
impulse( H )
Resposta ao Impulso impulse( H , vet_tempo )
[vet_Y vet_tempo] = impulse( H )
lsim( H , vet_X , vet_tempo )
Resposta a Entradas Genricas vet_Y = lsim ( H , vet_X , vet_tempo )
Diagrama de Bode bode( H )
vet_XF = fft( vet_X )
Transformada Discreta de Fourier
(Fast Fourier Transform) <a primeira metade de vet_XF
corresponde s freqncias positivas>
1
HC =
VC
= RC = 5
V s+ 1 s+5
RC
>> Hc = tf( [ 5 ] , [ 1 5 ] )
Transfer function:
5
-----
s + 5
28
>> impulse( Hc ) ;
>> step( Hc ) ;
>> vet_tempo = [ 0 : 0.001 : 3.5 ] ;
>> lsim( Hc , exp( -1 * vet_tempo ) , vet_tempo ) ;
29
Os grficos gerados so esses acima. Confira que as curvas condizem com as
expresses tericas (fica como exerccio a demonstrao).
250s ( s + 1) 2 ( s + 10000)
H (s) =
( s + 10)( s + 100) 2 ( s + 1000)
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
exemplo 3: mdulo da transformada de fourier de rect( t ):
Operao Funo
Construir Filtro de Ordem [ vet_coefNum vet_coefDenom = butter( N , Wc , low)
N e Freqncia de Corte [ vet_coefNum vet_coefDenom = butter( N , Wc , high)
Wc (ou passa-banda entre [ vet_coefNum vet_coefDenom = butter( N , [W1 W2] )
W1 e W2)
Aplicar Filtro num Sinal vet_y = filter( vet_coefNum , vet_coefDenom , vet_x )
31
Algumas opes para fatoraes e nmeros primos:
Operao Funo
Fatorar um Nmero vet_fatores = factor( numero )
Mnimo Mltiplo Comum MMC mmc = lcm( num1, num2 )
(Least Common Multiple LCM) vet_mmc = lcm( vet1 , vet2 )
matriz_mmc = lcm( matriz1 , matriz2 )
Mximo Divisor Comum MDC mdc = gcd( num1, num2 )
(Greatest Common Divider GCD) vet_mdc = gcd( vet1 , vet2 )
matriz_mdc = gcd( matriz1 , matriz2 )
Checar se um nmero ou os elementos de condicao = isprime( numero )
um vetor ou matriz so primos vet_condicoes = isprime( vet )
(retorno: 0 = no primo, 1 = primo) mat_condicoes = isprime( matriz )
Obter Nmeros Primos Menores ou Iguais vet_primos = primes( N )
aN
Operao Funo
Gerar Matriz M x N com Elementos em matriz = rand( M , N )
Distribuio Uniforme entre 0 e 1
Gerar Matriz M x N com Elementos em
Distribuio Normal (Gaussiana) com matriz = randn( M , N )
mdia 0 e 2 = 1
Gerar Nmeros numa Distribuio numero = random( string_Distrib , ... )
Qualquer < consulte help random para maiores
detalhes >
32
Captulo 5 Plotando Grficos
33
>> vet_raio = 0 : 0.001 : 1 ;
vet_theta = 0 : 6*pi/1000 : 6*pi ;
>> polar( vet_theta , vet_raio ) ;
34
Um exemplo para a funo subplot, que pode usada em conjunto com qualquer
uma das funes de plotagem:
>> vet_valores = [ 2 5 10 10 3 ] ;
>> vet_fatiasSobressaidas = [ 1 0 0 1 0 ] ;
>> pie( vet_valores , vet_fatiasSobressaidas ) ;
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.
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:
Detalhe Funo
Ttulo title( string )
xlabel( string )
Identificando Eixos ylabel( string )
zlabel( string )
Grade Pontilhada grid
Ajuste Automtica dos Eixos axis manual
(fixando ou adaptando segundo as curvas) axis tight
Legenda legend( string_curva1 , string_curva2 , ... )
(til para quando h mais de uma curva)
xlim( [ valorInicial valorFinal ] )
Limite dos Eixos 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.
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 set( gca , 'fontsize' , numeroFonte )
Legenda
Ajustar Tamanho e Posio da Janela set( gcf , 'Position', posicaoX , posicaoY ,
(em pixels, com origem no canto tamanhoX , tamanhoY )
superior esquerdo da tela)
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)
Operao Funo
[vet_x , vet_y] = getpts
<aps o comando, clique na tela para
Capturar Pontos com o Mouse capturar pontos e pressione ENTER quando
terminar; aperte BACKSPACE para
descapturar ltimo ponto>
Capturar Todos os Pontos da Curva J vet_x = get( get( gca , 'children' ) , 'XData' )
Plotada vet_y = get( get( gca , 'children' ) , 'YData' )
40
Captulo 6 O Editor de Funes e
Rotinas
%{
bloco
de
comentrios
%}
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.
(...)
resultado = ( ... )
(...)
(...)
(...)
resultado1 = ( ... )
(...)
resultado2 = ( ... )
(...)
(...)
42
funo_usuario( varargin{ : } ) ;
(...)
if condicao1
bloco1
elseif condicao2 if condicao1
bloco2 bloco1
if condicao elseif condicao3 elseif condicao2
bloco bloco3 bloco1
end (...) else
elseif condicaoN bloco3
blocoN end
end
Executa bloco 1 somente se Executa bloco 1 somente se
Executa bloco de comandos a condio 1 for verdadeira. a condio 1 for verdadeira.
somente se a condio for Caso contrrio, executa Caso contrrio, executa
verdadeira bloco 2 se a condio 2 for bloco 2 se a condio 2 for
verdadeira. E assim em verdadeira. Caso contrario,
diante. executa bloco 3.
switch expressao
case valor1
bloco1
case { valor2 , valor3 }
bloco2
otherwise
bloco3
end
43
while condicao
bloco
end
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.
44
Veja agora um exemplo de funo que usa alguns dos conceitos at aqui
apresentados.
else
% pega maior inteiro anterior ao nmero recebido
numeroAtual = ceil( numero - 1 ) ;
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:
45
% 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 ) ;
if isprime( numeroAtual )
retorno = numeroAtual ;
else
retorno = primoAnterior( numeroAtual ) ;
end
end
rotina1.m:
clear ;
rotina2 ;
funcao1( ) ;
global b
a
b
c
rotina2.m:
a = 1 ;
funcao1.m:
function funcao1 ( )
global b
b = 2 ;
c = 3 ;
46
b =
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.
48
Prximo Caractere Sobrescrito ^
Prximo Caractere Subscrito _
Aqui temos, por fim, alguns caracteres usados na manipulao de arquivos texto.
Operao Funo
Exibir Mensagem na Tela de Comandos disp( string_mensagem )
Exibir Mensagem de Erro na Tela de error( string_mensagem )
Comandos e Abortar Rotina / Funo
Exibir Mensagem e Aguardar Usurio numero = input( string_mensagem )
Entrar com Numero ou Texto na Tela de string = input( string_mensagem , s )
Comandos
Operao Funo
Abrir .m de uma Funo no open nomeFuncao
Editor
Carregar Nmeros dum Arquivo matriz = load( string_arquivoTexto )
ASCII
fid_arquivo = fopen( string_arquivoTexto ,
string_objetivo )
49
Capturar Nmeros / Caracteres string_ formatos:
do Arquivo para Variveis %d =captura inteiro
%f = captura numero de casas decimais (float)
%c = captura caractere (char)
%s = captura palavra (string)
Capturar Prxima Linha (Get string_linha = fgetl( fid_arquivo )
Line) do Arquivo
Fechar Arquivo fclose( fid_arquivo )
Operao Funo
Carregar Arquivo .wav vet_som = wavread( string_nomeArquivo )
Operao Funo
matriz3d_imagem = imread( string_nomeArquivo,
string_extensao )
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.
51
Captulo 8 Programando com
Qualidade
function [x,y]=circulo(a,r,p)
%figure;
if a==1
x=r*(2*rand(1,p)-1);
y=sqrt(1-x.^2).*r*(2*rand(1,p)-1) ;
%xlim([-1 1]);
%ylim([-1 1]);
%plot(x,y,'*');
elseif a==2
r=r*rand(1,p);
t=2*pi*rand(1,p);
x=r.*cos(t);
y=r.*sin(t);
%xlim([ -1 1 ]) ;
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
function [ vet_x , vet_y ] = GerarDistribuicaoCirculo
( modoDistribuicao , raio , qtdPontos )
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.
if nargin ~= 3
error( ' *** ERRO *** Quantidade de argumentos passados invlida!' ) ;
end
54
if length( qtdPontos ) ~= 1 | ~isreal( qtdPontos ) | ...
qtdPontos < 0 | mod( qtdPontos , 1 ) ~= 0
error( '*** ERRO *** Parametro "qtdPontos" invlido!' ) ;
end
else
error( '*** ERRO *** Parametro "modoDistribuicao" invlido!' ) ;
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.
else
error( '*** ERRO *** Parametro "modoDistribuicao" invlido!' ) ;
end
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).
% constantes
DEBUG = 0 ; % modo DEBUG desativado
(...)
if DEBUG
figure ;
plot( vet_x , vet_y , '*' ) ;
xlim( [ -raio raio ] ) ;
ylim( [ -raio raio ] ) ;
titulo = [ 'Modo ' modoDistribuicao ] ;
title( titulo ) ;
end
% constantes
DEBUG = 0 ; % modo DEBUG desativado
56
elseif strcmp( modoDistribuicao , 'concentradoCentro' )
vet_r = raio * rand( 1 , qtdPontos ) ;
vet_theta = 2 * pi * rand( 1 , qtdPontos ) ;
else
error( '*** ERRO *** Parametro "modoDistribuicao" invlido!' ) ;
end
if DEBUG
figure ;
plot( vet_x , vet_y , '*' ) ;
xlim( [ -raio raio ] ) ;
ylim( [ -raio raio ] ) ;
titulo = [ 'Modo ' modoDistribuicao ] ;
title( titulo ) ;
end
57
Captulo 9 Exemplos Prticos
for i = 1 : QTD_PONTOS + 1
vet_casosFavoraveis( i ) = length( find( vet_y <= vet_Y( i ) ) ) ;
end
% plotando Fy_Y
figure ;
vet_pontosY = [ 0 : 1 / QTD_PONTOS : 1 ] ;
vet_pontos2Y = [ 0 : 10 / QTD_PONTOS : 1 ] ;
subplot( 2 , 1 , 1 ) ;
plot( vet_pontosY , vet_Fy_Y ) ;
xlabel( 'y' , 'fontsize' , 13 ) ;
ylabel( 'F_y( Y )' , 'fontsize' , 13 ) ;
title( 'Problema da Rgua: caso da segunda partiao esquerda' , ...
'fontsize' , 13 ) ;
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 ) ;
xlim( [ -10 10 ] ) ;
ylim( [ -10 10 ] ) ;
59
for i = 1 : grauPolinomio
if vet_coeficientes( i + 1 ) > 0
string_sinal = ' + ' ;
elseif vet_coeficientes( i + 1 ) < 0
string_sinal = ' ' ;
end
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
xlabel( 'x' ) ;
ylabel( 'y' ) ;
title( 'Polinmio gerado com a captura dos pontos' ) ;
legend( 'Pontos Selecionados' , string_polinomio ) ;
hold ;
(x x 0 ) (y y 0 )
2 2
(x x 0 ) + (y y 0 ) r 2
2 2
+ =1
a2 b2
ou
x = r cos( ) + x 0 r [0 raio] x2
, com y = b 1 + y0
y = r sin( ) + y 0 [0 2 ] 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 ;
% 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
61
vet_palpebraDirX = vet_palpebraDirX + X0_OLHO ;
% sobrancelha
vet_sombrancelhaDirX = 3.5 * rand( 1 , QTD_PONTOS ) + X0_SOMBR ;
vet_sombrancelhaDirY = 1.6 * sqrt( 1 - vet_sombrancelhaDirX .^ 2 ...
/ ( 6 ^ 2 ) ) + 2 ;
for i = 1 : QTD_PONTOS
plot( vet_irisEsqX( i ) , vet_irisEsqY( i ) , '.' ) ;
plot( vet_irisDirX( i ) , vet_irisDirY( i ) , '.' ) ;
if rem( i , 2 ) == 0
plot( vet_palpebraEsqX( i ) , vet_palpebraEsqY( i ) , '.' ) ;
plot( vet_sombrancelhaEsqX( i ) , vet_sombrancelhaEsqY( i ) , ...
'.' ) ;
pause( TEMPO_ENTRE_PONTOS ) ;
end
62
function Hz = CalcularCampoDipolo ( i , a , rho , z )
if nargin ~= 4
error( '*** ERRO *** Devem ser passados exatos 4 argumentos!' ) ;
end
if ~isreal( i )
error( '*** ERRO *** Parametro 1 ("i") invlido!' ) ;
end
if ~isreal( a ) | a < 0
error( '*** ERRO *** Parametro 2 ("a") 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 ) ;
Hz = termo1 .* termo2 ;
% constantes
NOME_ARQUIVO = 'documentacao.txt' ;
DIRETORIO = './' ; % diretrio atual
63
% buscando arquivos ".m" no diretrio
vet_struct_arquivosM = dir( [ DIRETORIO '*.m' ] ) ;
if isempty( vet_struct_arquivosM )
error( '*** ERRO *** Nao ha arquivo M no diretorio!' ) ;
end
if fid_arquivoM == -1
error( '*** ERRO *** Arquivo ".m" no pde ser aberto!' ) ;
end
fclose( fid_arquivoM ) ;
end
64