Você está na página 1de 64

Guia MatLab

para alunos de Engenharia Eltrica,


Computao e Automao

por Jan Krueger Siqueira

Editora Wally Salami

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

Captulo 4 Funes Matemticas


4.1 Aritmtica e lgebra Bsicas ...............................................................................
4.2 Trigonomtricas ....................................................................................................
4.3 Equaes e Polinmios ........................................................................................
4.4 lgebra Linear ......................................................................................................
4.5 Clculo Diferencial e Integral ...............................................................................
4.6 Sinais e Sistemas ...................................................................................................
4.7 Outras Funes ......................................................................................................

22
22
23
23
24
28
31

Captulo 5 Plotando Grficos


5.1 A Famala de Funes para Plotar ........................................................................
5.2 Alguns Detalhes: Ttulo, Legendas, Etc ...............................................................
5.3 Plotando em 3D .....................................................................................................
5.4 Manipulando a Janela do Grfico .........................................................................
5.5 Acessando Dados do Grfico ................................................................................

33
37
38
39
40

Captulo 6 O Editor de Funes e Rotinas


6.1 Vantagens do Editor ..............................................................................................
6.2 Criando Funes e Rotinas ....................................................................................
6.3 Condicionais e Loops: if, switch, while e for ...........................................
6.4 Recurso e Variveis Globais ...............................................................................
6.5 Debugando .............................................................................................................

41
41
43
45
47

Captulo 7 Funes de Entrada e Sada (I/O)


7.1 Strings ....................................................................................................................
7.2 Capturando e Imprimindo na Tela de Comandos ..................................................
7.3 Arquivos de Texto, Som e Imagem .......................................................................
7.4 Execuo do MatLab e de Outros Aplicativos ......................................................

48
48
49
50

Captulo 8 Programando com Qualidade


8.1 Por que Isso Vale a Pena? ....................................................................................... 52
8.2 Como NO Fazer ................................................................................................. 52
8.3 Como Fazer ........................................................................................................... 53
Captulo 9 Exemplos Prticos

9.1 Problema de Probabilidade ...................................................................................


9.2 Criando um Polinmio ..........................................................................................
9.3 Animao Grfica ................................................................................................
9.4 Biot-Savart Numrico ............................................................................................
9.5 Documentador de *.ms .......................................................................................

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.

1.2 MatLab x Maple


Talvez muitos alunos prefiram usar o programa Maple para efetuar seus clculos
de engenharia, por terem tido com ele um contato mais prematuro. H quem faa at
discusses calorosas sobre qual dos dois o melhor software.
Pessoalmente, creio que cada um tem sua utilidade. Vejamos as vantagens do
Maple:

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

>> int( 1/sqrt(2*pi)*exp(-0.5*x^2),


-inf, inf )
ans =

7186705221432913/18014398509481984
*2^(1/2)*pi^(1/2)

> ( a^2 + 5*log(x/y) )


/ ( sqrt(11) + Pi ) ;

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

> for i from 0 to 4 do


v[i] := sin( Pi*i/2 );
end do;

> funcao := x-> if x>=0 then


sin(x) else 1/x end if;

if x >=0
retorno = sin( x );
else
retorno = 1 / x ;
end

> funcao(-2);

Funes

function retorno = funcao


( x )

> 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 =

> plot((sin(x))^2, x=0..10,


title=Seno,labels=["x",
"sen(x)"],labeldirections=[h
orizontal,vertical]);

-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.

Captulo 2 Comandos Bsicos


2.1 Declaraes e Operaes Bsicas
H dois modos de se trabalhar no MatLab: usando a tela de comandos e usando
o editor de texto. Para incio de conversa, usaremos a tela de comandos mas tudo o
que feito aqui pode ser usado no editor.

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

>> x = -5.6 + 3*i


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 =
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

Algumas contas agora. As quatro operaes bsicas adio, subtrao,


multiplicao e diviso possuem os smbolos universais de todas (ou boa parte) das
linguagens > +, -, * e /, respectivamente. Lembre-se que a prioridade vai para a
multiplicao e diviso, de forma que usamos parntesis nas expresses mais
complexas.
Ah, sim, voc pode executar mais de um comando de uma s vez. Basta escrever
um deles e apertar Shift + Enter, e ento ocorre a quebra de linha.

>> 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

A potenciao usada com o operador ^. J vale a pena citar aqui que o


nmero imaginrio 1 representado por i ou por j, a menos que haja variveis
com esses nomes.
>> c = a ^ 2 + b ^ 2
c =
9.3200
>> i ^ 2
ans =
-1
>> j ^ 3
ans =
0 - 1.0000i
>> i = 2
i =
2
>> i ^ 2

10

ans =
4

As outras operaes so obtidas atravs de chamadas de funo, como na


maioria das linguagens. Basicamente, seu formato bsico nome_da_funo(
argumento_1 , argumento_2 , ... ). o caso da raiz quadrada: sqrt( numero ).
>> sqrt( 4.04 )
ans =
2.0100
>> sqrt( -4.04 )
ans =
0 + 2.0100i

As demais operaes matemticas sero apresentadas no Captulo 4.


Algumas outras abstraes matemticos e computacionais, como o infinito e o
Not a Number (NaN), tambm esto presentes na linguagem.
>> 1 / 0
Warning: Divide by zero.
ans =
Inf
>> 0 / 0
Warning: Divide by zero.
ans =
NaN

2.2 Comandos de Ajuda


Antes de continuarmos com a apresentao de funcionalidades, interessante j
mostrar o caminho para aqueles que gostam de aprender sozinhos, por explorao. A
maioria das verses do MatLab no possui um guia de ajuda em janela decente. No
entanto, atravs da prpria tela de comandos, podemos encontrar o que queremos com
certa facilidade.
Qual seria o comando para ajuda ento? Elementar, meu caro Watson: digitamos
help nome_da_funo para sabermos mais sobre essa funo! No genial?
>> help sqrt
SQRT
Square root.
SQRT(X) is the square root of the elements of X. Complex
results are produced if X is not positive.
See also SQRTM.

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 ...')
>> lookfor fourier
FFT Discrete Fourier transform.
FFT2 Two-dimensional discrete Fourier Transform.
FFTN N-dimensional discrete Fourier Transform.
IFFT Inverse discrete Fourier transform.
IFFT2 Two-dimensional inverse discrete Fourier transform.
IFFTN N-dimensional inverse discrete Fourier transform.
XFOURIER Graphics demo of Fourier series expansion.
DFTMTX Discrete Fourier transform matrix.
INSTDFFT Inverse non-standard 1-D fast Fourier transform.
NSTDFFT Non-standard 1-D fast Fourier transform.
>> lookfor 'square root'
REALSQRT Real square root.
SQRT
Square root.
SQRTM
Matrix square root.

No a oitava maravilha do mundo, mas j quebra um galho.

2.3 Comandos para a Tela de Comandos


Diferente do que ocorre no Maple, no possvel modificar ou reexecutar um
comando da linha de onde ele foi criado. Porm possvel reobt-lo na linha corrente
com as setas cima e baixo do teclado, tal qual no prompt do DOS, por exemplo. Isso
poupa o intil trabalho de redigitao ou de Ctrl+C e Ctrl+V.

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

Captulo 3 Vetores e Matrizes


Vetores e matrizes so o grande diferencial do MatLab. Este captulo muito
importante se quisermos rapidez e eficincia nos clculos.

3.1 Notao e Declarao de Vetores no MatLab


Como se sabe, um vetor nada mais do que uma fila de nmeros com algum
significado (ou no). A vantagem que ele traz aqui no MatLab poder operar com
muitos valores de uma s vez.
Primeiramente, alguns pontos importantes: declara-se o vetor com os elementos
entre colchetes (com ou sem vrgulas), o primeiro index do vetor 1 e os elementos
so acessados com o index entre parntesis.
>> vet = [ 0 , 1 , 2 , 3 ]
vet =
0

>> 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

Mas e se quisermos um vetor de 0 a 9? No precisa digitar tudo, basta usar a


notao compacta val_inicial : val_final. E para ir de 0 a 9 de dois em dois? Usamos a
notao val_inicial : val_passo : val_final
>> vet = 0 : 9
vet =
0

>> vet = 0 : 2 : 9

14

vet =
0

E da as brincadeiras comeam. Por exemplo, pegando apenas um certo trecho


do vetor.
>> vet = 0 : 9
vet =
0

>> vet( [1 3 7] )
ans =
0

>> vet( 2 : 4 )
ans =
1

>> vet( 1 : 3 : 9 )
ans =
0

Concatenando (unindo) vetores.


>> vet1 = [ 1 2 3 4 5 6 ] ;
vet2 = [ 7 8 9 ] ;
>> [ vet1 vet2 ]
ans =
1

>> [ vet1( 1 : 3 ) vet1( 6 ) vet2( 1 ) ]


ans =
1

Podem-se alterar elementos de um vetor tambm, ou elimin-los.


>> vet1 = [ 1 2 3 4 5 6 ] ;
>> vet1( 1 ) = 0
vet1 =
0

>> vet1( 1 ) = [ ]

15

vet1 =
2

>> vet1( 2 : 4 ) = [ ]
vet1 =
2

No necessrio decorar todas essas manhas agora. Consulte o guia conforme


necessrio, e aprenda conforme o uso.

3.2 Operaes e Funes com Vetores


Um ponto fundamental fazer aritmticas bsicas com vetores. Vale lembrar
que, para isso, os vetores precisam ter a mesma dimenso. Adio, subtrao e
multiplicao por um escalar so bem simples.
>> vetA = [ 1 2 3 ] ;
vetB = [ 1 1 1 ] ;
>> vetA + vetB
ans =
2

>> 2 * vetA
ans =
2

>> vetA - 2 * vetB


ans =
-1

Multiplicao, diviso e potenciao j so diferentes. Tais operaes so


definidas tambm num contexto de matrizes, o que faz necessrio criar uma
diferenciao entre operao de vetores / matrizes e operao de elementos de vetores /
matrizes.
Portanto, para multiplicar, dividir ou elevar os elementos dum vetor,
colocamos um ponto na frente do operador.
>> vetA = [ 2 3 ] ;
vetB = [ 4 5 ] ;
>> vetA * vetB
??? Error using ==> *
Inner matrix dimensions must agree.
>> vetA .* vetB
ans =
8

15

16

>> vetA ./ vetB


ans =
0.5000

0.6000

>> vetA .^ vetB


ans =
16

243

>> vetB ^ 2
??? Error using ==> ^
Matrix must be square.
>> vetB .^ 2
ans =
16

25

A seguir, uma tabela de funes teis para vetores.


Operao
Mdulo (Norma) do Vetor
Produto Escalar de Dois Vetores
Produto Vetorial de Dois Vetores (R3)
Total de Elementos (Comprimento)
Soma dos Elementos
Produto dos Elementos
Mdia dos Elementos
Maior dos Elementos
(ou o maior elemento e seu ndice)
Menor dos Elementos
(ou o menor elemento e seu ndice)
Encontrar ndices dos Elementos que
Satisfaam Certa Condio

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

>> sqrt( vet )


ans =

17

1.7321

2.4495

3.0000

0.1411

-0.2794

0.4121

>> sin( vet )


ans =
0

3.3 Matrizes: o Foco do MatLab


A declarao e a notao de matriz so similares s de vetor. Cada linha
composta por elementos entre colchetes (opcionais, porm recomendados para facilitar
visualizao), e todas elas so postas, por sua vez, num outro par de colchetes, com
ponto-e-vrgulas separando-as.
>> matriz = [ [1 2 3 ] ; [4 5 6 ] ]
matriz =
1
4

2
5

3
6

>> matriz = [ 1 2 ; 3 4 ; 5 6 ]
matriz =
1
3
5

2
4
6

Para acessar um elemento, usamos a notao matriz( linha , coluna )


>> matriz = [ [1 2 3 ] ; [4 5 6 ] ; [7 8 9 ] ]
matriz =
1
4
7

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

Para calcularmos a matriz transposta, usamos o operador aspas simples ( ' ).


>> matriz'
ans =
1
2
3

4
5
6

7
8
9

>> matriz_linha = [ 1 2 3 4 ]
matriz_linha =
1

>> matriz_coluna = matriz_linha'


matriz_coluna =
1
2
3
4

Pode-se modificar elementos da matriz, ou ento linhas e colunas inteiras:


>> matriz = [ [1 2 3] ; [4 5 6] ; [7 8 9] ] ;
>> matriz( 1 , 2 ) = 0
matriz =
1
4
7

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

>> matriz( [ 1 3 ] , : ) = 5.5


matriz =
5.5000
4.0000
5.5000

5.5000
5.0000
5.5000

5.5000
6.0000
5.5000

As operaes bsicas funcionam como foi dito na seo de vetores: adio e


subtrao com + e -, sempre; multiplicao e diviso entre elementos com o
ponto na frente (.* e ./); multiplicao de matrizes com *; diviso de matrizes
(uma matriz vezes a inversa da outra) com /.
>> matriz_A
matriz_B
matriz_C
matriz_D
>> matriz_A
matriz_C

=
=
=
=
+
+

[ [ 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

>> matriz_A + matriz_C


??? Error using ==> +
Matrix dimensions must agree.
>> matriz_A * matriz_B
ans =
1
2

2
3

>> matriz_C * matriz_D


??? Error using ==> *
Inner matrix dimensions must agree.
>> matriz_A .* matriz_B
matriz_C ./ matriz_D
ans =
0
1

1
2

ans =

20

;
;
] ] ;
] ] ;

1.0000
1.0000

2.0000
1.2500

3.0000
1.5000

>> matriz_A / matriz_B


ans =
0
1

1
1

As funes aritmticas e algbricas (raiz, seno, logaritmo, ...) com matrizes


atuam em cada um dos seus elementos. J certas funes apresentadas na seo de
vetores (soma, produto, mdia, ...) atuam geralmente nas colunas e retornam um vetor
de respostas. Consulte a ajuda das funes para descobrir essas diferenas.
A seguir, uma tabela de funes teis para matrizes.
Operao
Criar Matriz N x N Identidade
Criar Matriz M x N de Zeros
Criar Matriz M x N de 1s
Redimensionar Matriz para M x N
Rodar Matriz em k*90
Espelhar Matriz da Esquerda para Direita
Espelhar Matriz de Cima para Baixo

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.

3.4 Matrizes Multidimensionais


Em algumas aplicaes, interessante trabalhar com matrizes de dimenso 3 ou
superior. Para tal, fazemos uma declarao em etapas. Veja o exemplo da declarao de
uma matriz tridimensional 2 x 2 x 2:
>> matriz3D = [ 1 2 ; 3 4 ]
matriz3D =
1
3

2
4

>> matriz3D( : , : , 2 ) = [ 5 6 ; 7 8 ]
matriz3D(:,:,1) =
1
3

2
4

matriz3D(:,:,2) =
5
7

6
8

21

Captulo 4 Funes Matemticas


4.1 Aritmtica e lgebra Bsicas
No preciso explicar muito aqui. Olhe a tabela e use as funes:
Operao
Potenciao
Radiciao (Raiz Quadrada)
Exponenciao
(potncia do nmero neperiano)
Logaritmo Neperiano ( ln )
Logaritmo Decimal
Logaritmo na Base 2
Mdulo
(para nmeros complexos tambm)
Fatorial (n!)
Combinao de N, K a K
Mdulo do Resto da Diviso de A por B
Arredondamento(para Cima, para Baixo
ou para o Mais Prximo)

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 )

No encontrou exatamente a funo que queria? Algumas manhas ento:

para calcular a raiz n de x, faa x ^ ( 1 / n )


para calcular o logaritmo de x na base n, faa log( x ) / log( n )

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 )

As funes a seguir trabalham com ngulos em GRAUS (degrees).


(em graus)
Seno
Co-Seno
Tangente

Direta
sind( x )
cosd( x )
tand( x )

22

Inversa (Arco-)
asind( x )
acosd( x )
atand( x )

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.
Seno Hiperblico
Co-Seno Hiperblico
Tangente Hiperblica

Direta
sinh( x )
cosh( x )
tanh( x )

Inversa (Arco-)
asinh( x )
acosh( x )
atanh( x )

4.3 Equaes e Polinmios


Embora o MatLab no trabalhe com literais, ele pode sim ser til em equaes e
polinmios. Repare que no usamos expresses como "x^2 3*x + 4", mas sim os
coeficientes dessa equao: [ 1 3 4 ]. Confira a tabela abaixo:
Operao
Resolver Equao Polinomial
(Encontrar as Razes)

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 )

Montar Polinmio a Partir das Razes


Encontrar Melhor Polinmio
(Mnimos Quadrados)
Aplicar "x" num Polinmio

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).

4.4 lgebra Linear


E, como no poderia deixar de ser, temos uma coletnea de funes de lgebra
Linear para matrizes. Confira algumas na tabela abaixo.
Operao
Determinante
Inversa
Resolver Sistema Linear
(A*X = B)

Funo
determinante = det( matriz )
matriz_inversa = inv( matriz )
matriz_x = linsolve( A , 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)
Decomposio LU
Decomposio QR

[ mat_autoval , mat_autovet ] = eig( matriz )


< retorna autovalores numa matriz diagonal e
autovetores em colunas numa outra matriz >
[ L , U ] = lu( matriz )
[ Q , R ] = qr( matriz )

exemplo: resolvendo sistemas de equaes


5a + 2b = 9
5 2
9
X =
A * X = B

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

Temos tambm um pouco de Clculo Funcional (operaes sobre matrizes N x


N, usadas geralmente para resolver sistemas diferenciais).
Operao
Raiz Quadrada de Matriz
Exponencial de Matriz
Logaritmo de Matriz

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

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
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>

Integral Definida Numrica


(quadrature)
Resoluo Numrica de Equao ou
Sistema Diferencial de 1. Ordem

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
y (t 0 + t ) y (t 0 )
dy
,
(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.
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_derivada = diff( 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
2 y ' (t ) + y (t ) = cos(t ) , com y (0) = 10
e obter os valores de y de 0 a 5s, precisamos antes de tudo isolar o termo de primeira
ordem. Isto , escrever

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 ;

Salve o arquivo como funcao.m.


Da digitamos o seguinte comando:
>> tempoInicial = 0 ;
>> tempoFinal = 5 ;
>> condicaoInicial = 10 ;
>> [ vet_tempo , vet_y ] = ode45( @funcao , [ tempoInicial
tempoFinal ] , condicaoInicial ) ;

Para equaes de ordem superior, o segredo transform-la num sistema de


equaes de 1 ordem. Vejamos o exemplo.

y ' ' (t ) + 5 y ' (t ) + 6 y (t ) = cos(t ) , com y (0) = 10 e y ' (0) = 0


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.

y ' (t ) = x(t ) , com y (0) = 10


x' (t ) = cos(t ) 5 x(t ) 6 y (t ) , com x(0) = y ' (0) = 0
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).
function vet_retorno = funcao ( tempo , vet_var )
vet_retorno = zeros( 2 , 1 ) ;
vet_retorno( 1 ) = cos( tempo ) - 5 * vet_var( 1 ) - 6 *
vet_var( 2 ) ;
vet_retorno( 2 ) = vet_var( 1 ) ;

Salve o arquivo como funcao.m.


Da digitamos o seguinte comando:
>> 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
Declarar Smbolo Literal
Calcular Derivada de uma Expresso
(ou derivada parcial)
(ou derivada de ordem N)
Calcular Integral de uma Expresso
(ou integral com respeito a uma varivel)
(ou integral definida de A a B)
Resolver Equao Diferencial

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 )

exemplo 1: calcular derivada segunda e integral de

t
com respeito a x
1+ x2

>> syms x ;
>> syms t ;
>> symb_expressao = t / ( 1 + x^2 )
symb_expressao =
t/(1+x^2)

>> diff( symb_expressao , x , 2 )


ans =
8*t/(1+x^2)^3*x^2-2*t/(1+x^2)^2

>> int( symb_expressao , x )


ans =
t*atan(x)

exemplo 2: resolver y ' (t ) = ay (t ) com y (0) = 1


>> symb_y = dsolve( '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
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 )

Montar Funo de Transferncia


Resposta ao Degrau
Resposta ao Impulso
Resposta a Entradas Genricas
Diagrama de Bode
Transformada Discreta de Fourier
(Fast Fourier Transform)

<a primeira metade de vet_XF


corresponde s freqncias positivas>

exemplo 1: circuito RC srie


1
VC
RC = 5
HC =
=
V
s+5
s+ 1
RC

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 = 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).
exemplo 2: anlise de uma funo de transferncia genrica
H (s) =

250s ( s + 1) 2 ( s + 10000)
( s + 10)( s + 100) 2 ( s + 1000)

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_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

exemplo 3: mdulo da transformada de fourier de rect( t ):


>>
>>
>>
>>

vet_y = [zeros( 1 , 100 ) ones( 1 , 10 ) zeros( 1 , 100 )] ;


vet_Y = fft( vet_y ) ;
vet_moduloY = abs( vet_Y ) ;
plot( vet_moduloY( 1 : 105 ) ) ;

Completando a anlise de Sinais e Sistemas, apresentamos uma das vrias


opes de filtros existentes no MatLab.
Operao
Construir Filtro de Ordem
N e Freqncia de Corte
Wc (ou passa-banda entre
W1 e W2)
Aplicar Filtro num Sinal

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] )

vet_y = filter( vet_coefNum , vet_coefDenom , vet_x )

4.7 Outras Funes

31

Algumas opes para fatoraes e nmeros primos:


Operao
Fatorar um Nmero
Mnimo Mltiplo Comum MMC
(Least Common Multiple LCM)

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 )

Mximo Divisor Comum MDC


(Greatest Common Divider GCD)
Checar se um nmero ou os elementos de
um vetor ou matriz so primos
(retorno: 0 = no primo, 1 = primo)
Obter Nmeros Primos Menores ou Iguais
aN

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
Gerar Matriz M x N com Elementos em
Distribuio Uniforme entre 0 e 1
Gerar Matriz M x N com Elementos em
Distribuio Normal (Gaussiana) com
mdia 0 e 2 = 1
Gerar Nmeros numa Distribuio
Qualquer

Funo
matriz = rand( M , N )

matriz = randn( M , N )
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
Binrio Decimal
Decimal Binrio
Hexadecimal Decimal
Decimal Hexadecimal
Hexadecimal Double
Double Hexadecimal
(modo como nmeros reais so
armazenados na memria dum
computador)

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 )

< 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
Ligando Pontos
Barras
Valores Discretos Isolados
Degraus
Log-Log (base 10)
Semi-Log (base 10)
(s x ou y com eixo logartmico)
Coordenadas Polares

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 )

Tomemos como exemplo os vetores vet_x e vet_y a seguir:


>> vet_x = 0 : 0.5 : 5 ;
vet_y = sin( vet_x ) ;

Se plotssemos esses pontos com as 4 primeiras funes, teramos o seguinte:

Podemos desenhar uma espiral com as coordenadas polares


33

>> vet_raio = 0 : 0.001 : 1 ;


vet_theta = 0 : 6*pi/1000 : 6*pi ;
>> polar( vet_theta , vet_raio ) ;

No acabou no. Tem mais funes para plotar.


Modo de Plotar
Ligando Pontos e Preenchendo rea
Abaixo do Grfico
Segurar / Soltar Grfico para Plotar
Mais de uma Curva Juntas

Criar Nova Janela de Grfico


Dividir Janela de Plotagem em M x N
Partes e Selecionar Parte P
Grfico Estatstico de Fatias de Pizza
(Pie Chart)
Grfico de Cores (para Matrizes)
Legenda para o Grfico de Cores

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

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 ) ;
>> plot( vet_x1 , vet_y1 ) ;
>> hold ;
>> area( 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 = 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 ) ;

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_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.
>> matriz_aleatoria = rand( 20 , 20 ) ;
>> imagesc( matriz_aleatoria ) ;
>> colorbar ;

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:
plot(
plot(
plot(
plot(
plot(

vet_x
vet_x
vet_x
vet_x
vet_x

,
,
,
,
,

vet_y
vet_y
vet_y
vet_y
vet_y

,
,
,
,
,

'r' ) linha vermelha


'*' ) pontos (asteriscos) sem ligao
'r*' ) asteriscos vermelhos sem ligao
'k:' ) linha preta pontilhada
'LineWidth' , 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
Ttulo

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 , ... )

xlim( [ valorInicial valorFinal ] )


ylim( [ valorInicial valorFinal ] )
zlim( [ valorInicial valorFinal ] )

Limite dos Eixos

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
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 )

Plotando uma espiral helicoidal:


>> vet_t = 0 : pi/50 : 10*pi ;
>> plot3( sin( vet_t ) , cos( vet_t ) , vet_t ) ;

E uma parabolide (z = x2 + y2). 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 ;
[ 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

5.4 Manipulando a Janela do Grfico


A seguir, algumas funes que podem configurar opes da janela em que
plotamos.
Operao
Ajustar Fonte dos Eixos, Ttulo e
Legenda
Ajustar Tamanho e Posio da Janela
(em pixels, com origem no canto
superior esquerdo da tela)

Comando
set( gca , 'fontsize' , numeroFonte )

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

Capturar Pontos com o Mouse


Capturar Todos os Pontos da Curva J
Plotada

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' )

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:
% comentrios so iniciados por "%" e ficam verdes at o fim da linha
%{
bloco
de
comentrios
%}
'strings ficam entre ASPAS SIMPLES e so roxas'
'uma string no fechada por descuido fica vermelha
% para continuar o comando na linha de baixo, use "..."
funcao( parametro1 , parametro2 , ...
parametro3 ) ;

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-evrgula 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.
function resultado = funcao ( parametro1 , parametro2 )
(...)
resultado = ( ... )
(...)

J a declarao de uma funo que recebe apenas um parmetro e no retorna


nada seria assim:
function funcao ( parametro1 )
(...)

Se quiser retornar, digamos, 2 argumentos e no receber parmetro nenhum:


function [ resultado1 , resultado2 ] = funcao ( )
(...)
resultado1 = ( ... )
(...)
resultado2 = ( ... )
(...)

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.
function funcao ( funo_usuario , varargin )
(...)

42

funo_usuario( varargin{ : } ) ;
(...)

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

if condicao
bloco
end

if condicao1
bloco1
elseif condicao2
bloco2
elseif condicao3
bloco3
(...)
elseif condicaoN
blocoN
end

Executa bloco 1 somente se


Executa bloco de comandos a condio 1 for verdadeira.
somente se a condio for Caso contrrio, executa
verdadeira
bloco 2 se a condio 2 for
verdadeira. E assim em
diante.

if condicao1
bloco1
elseif condicao2
bloco1
else
bloco3
end

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.
switch expressao
case valor1
bloco1
case { valor2 , valor3 }
bloco2
otherwise
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

while condicao
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:
for i = 1 : N
bloco
end

for i = [ 2 5 6 ]
bloco
end

for i = 0 : 2 : N
bloco
end

Executa bloco de comandos Executa bloco de comandos Executa bloco de comandos


N vezes; a cada ciclo, i N/2 vezes; a cada ciclo, i 3 vezes; a cada ciclo, i
assume valor 1, 2, 3, ..., N. assume valor 0, 2, 4, ..., N. 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)
X igual a Y?
X diferente de Y?
X maior do que Y?
X menor ou igual a Y?
X divisvel por Y?
(ou seja, resto da diviso nulo?)
X inteiro?
X par?
X nmero primo?
X real (no-complexo)?
X um escalar (no-vetor)?

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

possvel juntar duas condies numa s:


Condio (Pergunta)
Condies A e B so ambas
verdadeiras?
Condio A e/ou condio B
verdadeira?
Condio A ou condio B
verdadeira? (Exclusive OR)
Condio A no verdadeira?

Notao(es)
A & B
and( A , B )
A | B
or( A , B )
xor( A , B )
~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:
if ( 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.
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 ) ;

soma = sum( vet ) ;

total = length( vet )


vet( 3 : 3 : total )
= 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.
function retorno = primoAnterior ( numero )
if length( numero ) ~= 1 | ~isreal( numero ) | numero < 3

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

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:
clear ;
rotina2 ;
funcao1( ) ;
global b
a
b
c

rotina2.m:
a = 1 ;

funcao1.m:
function funcao1 ( )
global b
b = 2 ;
c = 3 ;

rodando rotina1.m, o seguinte trecho aparece na tela de comandos:


a =
1

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

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
Concatenao (Unio)
Criar Matriz Coluna de Strings
(Concatenao Vertical)

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 )

Comparao (Se So Iguais ou No)


Converso Nmero-String e
String-Nmero
Procurar um Trecho numa String
(ndices Iniciais de Ocorrncias)
Substituir um Trecho numa String por
Outro
Executar Comando Contido numa String

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
Quebra de Linha
Tabulao
Caractere \
Caractere %

Cdigo
\n
\t
\\
%%

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
Exibir Mensagem na Tela de Comandos
Exibir Mensagem de Erro na Tela de
Comandos e Abortar Rotina / Funo
Exibir Mensagem e Aguardar Usurio
Entrar com Numero ou Texto na Tela de
Comandos

Funo
disp( string_mensagem )
error( string_mensagem )

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
Abrir .m de uma Funo no
Editor
Carregar Nmeros dum Arquivo
ASCII

Funo
open nomeFuncao

matriz = load( string_arquivoTexto )


fid_arquivo = fopen( string_arquivoTexto ,
string_objetivo )

Abrir / Criar Arquivo Texto

Imprimir Texto no Arquivo


Verificar se Arquivo Chegou ao
Fim (File: End of File)

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

Capturar Nmeros / Caracteres


do Arquivo para Variveis

Capturar Prxima Linha (Get


Line) do Arquivo
Fechar Arquivo

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 )

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
Carregar Arquivo .wav

Reproduzir Arquivo .wav


Gravar Arquivo .wav

Funo
vet_som = wavread( string_nomeArquivo )

[ vet_som , taxaAmostragem , bitsAmostra ] =


wavread( string_nomeArquivo )
wavplay( vet_som , taxaAmostragem )
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
matriz3d_imagem = imread( string_nomeArquivo,
string_extensao )

Carregar Arquivo de Imagem

string_extensao:
jpeg
bmp
gif
(...)
image( matriz3d_imagem )

Imprimir Imagem na Tela de


Grfico
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
Abortar Execuo de Rotina / Funo /
Comando
Pausar Execuo
(por tempo determinado ou aguardando
usurio apertar ENTER)
Invocando Aplicativo
(similar ao prompt do DOS)

Funo / Comando
aperte Ctrl + C na tela de comandos

pause( tempoEmSegundos )
pause
!caminhodoPrograma
!comandoDOS

Ou seja, para abrir um arquivo *.txt no Notepad, executamos um comando


similar ao seguinte:
>> !notepad c:/arquivo.txt

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
Qualidade

Programando

com

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.
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

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, x2 + y2 <= r2), 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

function [ vet_x , vet_y ] = GerarDistribuicaoCirculo


( modoDistribuicao , raio , qtdPontos )

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 GERARDISTRIBUICAOCIRCULO %%%%%%%%%%%%%%%%%%%%%


%
% Autor: Karl Marx , 1900
%
% Descrio da Funo:
%
So retornados pontos aleatrios (x,y) contidos num crculo, cujos
%
parmetros so passados pelo usurio. As diversas Funes de
%
Densidade de Probabilidade (fdp) esto descritas em Parmetros
%
% Chamada da Funo:
%
[ vet_x , vet_y ] = GerarDistribuicaoCirculo( modoDistribuicao ,
%
raio , qtdPontos )
%
% Parmetros:
%
modoDistribuicao:
%
'concentradoBordasHorizontais' --> p(x,y) = 1 / (4*raio*
%
sqrt(raio-x))
%
'concentradoCentro'
--> p(x,y) = 1 / (2*pi*raio*
%
sqrt(x+y))
%
'uniforme'
--> p(x,y) = 1 / (pi*raio)
%
raio
--> raio do crculo
%
qtdPontos
--> quantidade de pontos gerados
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

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:
if nargin ~= 3
error( ' *** ERRO *** Quantidade de argumentos passados invlida!' ) ;
end
if length( raio ) ~= 1 | ~isreal( raio ) | raio < 0
error( '*** ERRO *** Parametro "raio" invlido!' ) ;
end

54

if length( qtdPontos ) ~= 1 | ~isreal( qtdPontos ) | ...


qtdPontos < 0 | mod( qtdPontos , 1 ) ~= 0
error( '*** ERRO *** Parametro "qtdPontos" invlido!' ) ;
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:
if strcmp( modoDistribuicao , 'concentradoBordasHorizontais' )
(...)
elseif strcmp( modoDistribuicao , 'concentradoCentro' )
(...)
elseif strcmp( modoDistribuicao , 'uniforme' )
(...)
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.
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

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).
% 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

Desta maneira, o cdigo completo ficaria assim:


%%%%%%%%%%%%%%%%%%%%% FUNO GERARDISTRIBUICAOCIRCULO %%%%%%%%%%%%%%%%%%%%%
%
% Autor: Karl Marx , 1900
%
% Descrio da Funo:
%
So retornados pontos aleatrios (x,y) contidos num crculo, cujos
%
parmetros so passados pelo usurio. As diversas Funes de
%
Densidade de Probabilidade (fdp) esto descritas em Parmetros
%
% Chamada da Funo:
%
[ vet_x , vet_y ] = GerarDistribuicaoCirculo( modoDistribuicao ,
%
raio , qtdPontos )
%
% Parmetros:
%
modoDistribuicao:
%
'concentradoBordasHorizontais' --> p(x,y) = 1 / (4*raio*
%
sqrt(raio-x))
%
'concentradoCentro'
--> p(x,y) = 1 / (2*pi*raio*
%
sqrt(x+y))
%
'uniforme'
--> p(x,y) = 1 / (pi*raio)
%
raio
--> raio do crculo
%
qtdPontos
--> quantidade de pontos gerados
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% constantes
DEBUG = 0 ; % modo DEBUG desativado
% verificando parametros recebidos
if nargin ~= 3
error( ' *** ERRO *** Quantidade de argumentos passados invlida!' ) ;
end
if length( raio ) ~= 1 | ~isreal( raio ) | raio < 0
error( '*** ERRO *** Parametro "raio" invlido!' ) ;
end
if length( qtdPontos ) ~= 1 | ~isreal( qtdPontos ) | ...
qtdPontos < 0 | mod( qtdPontos , 1 ) ~= 0
error( '*** ERRO *** Parametro "qtdPontos" invlido!' ) ;
end
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 ) ;

56

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
if DEBUG
figure ;
plot( vet_x , vet_y , '*' ) ;
xlim( [ -raio raio ] ) ;
ylim( [ -raio raio ] ) ;
titulo = [ 'Modo ' modoDistribuicao ] ;
title( titulo ) ;
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% FIM DA FUNO %%%%%%%%%%%%%%%%%%%%%%%%%%%%

57

Captulo 9 Exemplos Prticos


9.1 Problema de Probabilidade
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ROTINA Regua %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% Autor: Nobuhiro Watsuki , 1994
%
% Descrio da Rotina:
%
Um samurai retalhador da Era Meiji, insatisfeito com os rumos da
%
revoluo, decide descontar sua insatisfao numa inocente rgua
%
ocidental de tamanho unitrio. Primeiro ele a parte num ponto
%
aleatrio X e, no satisfeito, parte o pedao esquerda num outro
%
ponto aleatrio Y.
%
Atravs de valores gerados aleatoriamente, faremos diversos testes
%
para gerar os grficos de Distribuio de Probabilidade e de
%
Densidade de Probabilidade para Y.
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% aumentar numero de casas exibidas
format long ;
% constantes (altere para aumentar/diminuir preciso dos testes)
QTD_TESTES = 20000 ;
QTD_PONTOS = 2000 ;
% testar casos para vrios Y entre 0 e 1
% pontos onde a rgua quebrada pela 1a. vez ( 0 < x < 1 )
vet_x = rand( 1 , QTD_TESTES ) ;
% pontos onde a rgua quebrada pela 2a. vez ( 0 < y < x )
vet_y = vet_x .* rand( 1 , QTD_TESTES ) ;
% contando casos para montar Fy( Y ) = P( y <= Y )
vet_Y = 0 : ( 1 / QTD_PONTOS ) : 1 ;
for i = 1 : QTD_PONTOS + 1
vet_casosFavoraveis( i ) = length( find( vet_y <= vet_Y( i ) ) ) ;
end
vet_Fy_Y = vet_casosFavoraveis / QTD_TESTES ;
% montando Funo de Densidade de Probabilidade derivando numericamente Fy
vet_py_Y = diff ( vet_Fy_Y ) / ( 1 / QTD_PONTOS ) ;
% OBS: funo diff gera vetor com 1 valor a menos
vet_py_Y = [ vet_py_Y 0 ] ; % acrescentando 1 elemento ao vetor
% 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 ) ;
% plotar curva terica

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 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

9.2 Criando um Polinmio Graficamente


%%%%%%%%%%%%%%%%%%%%%%%%% ROTINA DesenharPolinomio %%%%%%%%%%%%%%%%%%%%%%%%
%
% Autor: Pablo Picasso, 1931
%
% Descrio da Rotina:
%
Demonstrao da captura de pontos e do uso de polinmios. O usurio
%
selecionar N > 1 pontos da tela e ser desenhado um polinmio que
%
os contenha. Sua equao aparecer na legenda.
%
Essa rotina pode ser modificada para, por exemplo, traar a melhor
%
reta com base nesses pontos.
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% tela em branco para a captura de pontos
handle_grafico = figure ;
xlim( [ -10 10 ] ) ;
ylim( [ -10 10 ] ) ;
set( gca , 'fontsize' , 13 ) ;
grid ;
title( 'Selecione 2 ou mais pontos na tela e pressione ENTER' ) ;
% captura dos pontos
[ vet_XSelecionados , vet_YSelecionados ] = getpts ;
if length( vet_XSelecionados ) <= 1
close( handle_grafico ) ;
error( '*** ERRO *** SELECIONE 2 OU MAIS PONTOS!' ) ;
end
% gerando o polinmio que contm pontos selecionados
grauPolinomio = length( vet_XSelecionados ) - 1 ;
vet_coeficientes = polyfit( vet_XSelecionados , vet_YSelecionados , ...
grauPolinomio ) ;
% gerando pontos do polinmio a partir dos coeficientes encontrados
vet_XPolinomio = [ -10 : 0.05 : 10 ] ;
vet_YPolinomio = polyval( vet_coeficientes , vet_XPolinomio ) ;
% string contendo o polinmio
string_polinomio = '' ;

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 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

9.3 Animao Grfica


Lembrando que as equaes do crculo e da elipse so, respectivamente:

(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

%%%%%%%%%%%%%%%%%%%%%%%%%% ROTINA OlhosDeRessaca %%%%%%%%%%%%%%%%%%%%%%%%%%


%
% Autor: Machado de Assis , 1900
%

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

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 ;
% plotando ponto a ponto com pausas para visualizao
figure ;
hold ;
xlim( [ -( X0_OLHO + 2 ) ( X0_OLHO + 2 ) ] ) ;
ylim( [ -3 5 ] ) ;
title( 'Olhos de Ressaca' , 'FontSize' , 13 ) ;
xlabel( '(por favor, aguarde o trmino da animao)' ) ;
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 ) , ...
'.' ) ;
plot( vet_palpebraDirX( i ) , vet_palpebraDirY( i ) , '.' ) ;
plot( vet_sombrancelhaDirX( i ) , vet_sombrancelhaDirY( i ) , ...
'.' ) ;
end
pause( TEMPO_ENTRE_PONTOS ) ;
end
xlabel( 'Animao concluda!' ) ;
% limpando variveis utilizadas
clear ;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% FIM DA ROTINA %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

9.4 Biot-Savart Numrico


%%%%%%%%%%%%%%%%%%%%%%% FUNO CalcularCampoDipolo %%%%%%%%%%%%%%%%%%%%%%%%
%
% Autor: Biot-Savart , sculo XIX
%
% Descrio da Funo:
%
Calcula o campo magntico H dum diplo, num ponto qualquer dado em
%
coordenadas cilndricas.
%
% Chamada da Funo:
%
Hz = CalcularCampoDipolo( i , a , rho , z ) ;
%
% Parmetros Recebidos:
%
i
- corrente que circula no dipolo
%
(sentido anti-horrio)
-> em Ampres
%
a
- raio da espira (dipolo)
-> em metros
%
rho - coordenada RHO do ponto (distncia ao eixo Z) -> em metros
%
z
- coordenada Z do ponto
-> em metros
%
% Valor retornado:
%
Hz
- valor do componente Z do campo
-> em Ampre * metro
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

62

function Hz = CalcularCampoDipolo ( i , a , rho , z )


if nargin ~= 4
error( '*** ERRO *** Devem ser passados exatos 4 argumentos!' ) ;
end
if ( length( i ) ~= length( a ) | length( i ) ~= length( rho ) |
length( i ) ~= length( z ) ...
) & ...
( ~( length( i ) == 1 & length( a ) == 1 & length( rho ) == 1
~( length( i ) == 1 & length( z ) == 1 & length( rho ) == 1
~( length( a ) == 1 & length( z ) == 1 & length( rho ) == 1
~( length( i ) == 1 & length( a ) == 1 & length( z ) == 1 )
)
error( [ '*** ERRO *** Os 4 parmetros devem ter a mesma
'dimenso, ou apenas 1 deve ser no-escalar!' ] )
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( 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 %%%%%%%%%%%%%%%%%%%%%%%%%%%%

9.5 Documentador de *.ms


%%%%%%%%%%%%%%%%%%%%%%%%%%% ROTINA Documentador %%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% Autor: PPG-Man, o dono do "calabouo", 1970
%
% Descrio da Rotina:
%
Demonstrao da manipulao de arquivos textos, com a utilidade de
%
englobar num ".doc" os cabealhos de todos os arquivos ".m" de um
%
diretrio.
%
% Citao:
%
Nunca se tem tempo para fazer direito, mas sempre se tem tempo para
%
fazer de novo.
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 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
% criando arquivo de documentao
fid_arquivoDocumentacao = fopen( [ DIRETORIO NOME_ARQUIVO ] , 'w' ) ;
fprintf( fid_arquivoDocumentacao , 'Documentos do diretorio ' ) ;
fprintf( fid_arquivoDocumentacao , DIRETORIO ) ;
fprintf( fid_arquivoDocumentacao , ':\n\n' ) ;
% lendo cada arquivo ".m"
for i = 1 : length( vet_struct_arquivosM )
string_nomeArquivo = [ DIRETORIO vet_struct_arquivosM( i ).name ] ;
fid_arquivoM = fopen( string_nomeArquivo , 'r' ) ;
% OBS: todo o cabealho do arquivo pode ser obtido mais facilmente
% com "string_cabecalho = help( string_arquivoM )", mas o caminho
% mais complicado foi feito por razes didticas
if fid_arquivoM == -1
error( '*** ERRO *** Arquivo ".m" no pde ser aberto!' ) ;
end
% pulando possveis linhas sem comentrios
string_linhaArquivoM = '' ;
while ~feof( fid_arquivoM ) & ...
( isempty( string_linhaArquivoM ) | ...
string_linhaArquivoM( 1 ) ~= '%')
string_linhaArquivoM = fgetl( fid_arquivoM ) ;
end
% copiando linhas de comentrios iniciais
while ~feof( fid_arquivoM ) & ...
~isempty( string_linhaArquivoM ) & ...
string_linhaArquivoM( 1 ) == '%'
string_linhaArquivoM = strrep( string_linhaArquivoM , ...
'%' , '%%' ) ;
string_linhaArquivoM = strrep( string_linhaArquivoM , ...
'\' , '//' ) ;
fprintf( fid_arquivoDocumentacao , string_linhaArquivoM ) ;
fprintf( fid_arquivoDocumentacao , '\n' ) ;
string_linhaArquivoM = fgetl( fid_arquivoM ) ;
end
fprintf( fid_arquivoDocumentacao , '\n\n' ) ;
fclose( fid_arquivoM ) ;
end
% fechando (salvando) arquivo da documentao
fclose( fid_arquivoDocumentacao ) ;
% chamando NotePad para abrir documentao
string_comando = [ '!notepad ' DIRETORIO NOME_ARQUIVO ]
eval( string_comando ) ;
% limpando variaveis usadas
clear ;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% FIM DA ROTINA %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

64

Você também pode gostar