Professional Documents
Culture Documents
Cientca
com Python
Computao
Cientca
com Python
Uma introduo programao
para cientistas
Flvio Codeo Coelho
Petrpolis RJ
Edio do Autor
2007
c 2007 Flvio Codeo Coelho
Todos os direitos reservados.
ISBN: 978-85-907346-0-4
Sumrio i
Lista de Figuras vii
Lista de Tabelas x
Listagens xi
Prefcio: Computao Cientca xvii
Da Computao Cientca e sua denio pragmtica.
Do porqu esta se diferencia, em metas e ferramentas, da
Cincia da Computao.
I Python 1
1 Fundamentos da Linguagem 3
Breve introduo a conceitos bsicos de programao
e linguagem Python. A maioria dos elementos bsicos
da linguagem so abordados neste captulo, com exceo
de classes, que so discutidas em detalhe no captulo 2.
Pr-requisitos: Conhecimentos bsicos de programao
em qualquer linguagem.
i
ii SUMRIO
1.1 Primeiras impresses . . . . . . . . . . . . . . . . . . 3
1.2 Uso Interativo vs. Execuo a Partir de Scripts . . . 5
Operaes com Nmeros . . . . . . . . . . . . . . . . 8
1.3 Nomes, Objetos e Espaos de Nomes . . . . . . . . . 11
1.4 Estruturas de Dados . . . . . . . . . . . . . . . . . . 13
Listas . . . . . . . . . . . . . . . . . . . . . . . . . . 13
Tuplas . . . . . . . . . . . . . . . . . . . . . . . . . . 20
Strings . . . . . . . . . . . . . . . . . . . . . . . . . . 22
Dicionrios . . . . . . . . . . . . . . . . . . . . . . . 24
Conjuntos . . . . . . . . . . . . . . . . . . . . . . . . 27
1.5 Controle de uxo . . . . . . . . . . . . . . . . . . . . 28
Condies . . . . . . . . . . . . . . . . . . . . . . . . 28
Iterao . . . . . . . . . . . . . . . . . . . . . . . . . 29
Lidando com erros: Excees . . . . . . . . . . . . . 32
1.6 Funes . . . . . . . . . . . . . . . . . . . . . . . . . 34
Funes lambda . . . . . . . . . . . . . . . . . . . . . 37
Geradores . . . . . . . . . . . . . . . . . . . . . . . . 38
Decoradores . . . . . . . . . . . . . . . . . . . . . . . 39
Strings de Documentao . . . . . . . . . . . . . . . 41
1.7 Mdulos e Pacotes . . . . . . . . . . . . . . . . . . . 42
Pacotes teis para Computao Cientca . . . . . . 45
1.8 Documentando Programas . . . . . . . . . . . . . . . 47
Pydoc . . . . . . . . . . . . . . . . . . . . . . . . . . 48
Epydoc . . . . . . . . . . . . . . . . . . . . . . . . . 49
1.9 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . 50
2 Orientao a Objeto 51
Introduo programao orientada a objetos e sua
implementao na linguagem Python. Pr-requisitos:
Ter lido o captulo 1.
2.1 Objetos . . . . . . . . . . . . . . . . . . . . . . . . . 52
Denindo Objetos e seus Atributos em Python . . . 53
Adicionando Funcionalidade a Objetos . . . . . . . . 55
Herana . . . . . . . . . . . . . . . . . . . . . . . . . 56
iii
4 Ferramentas de Desenvolvimento 73
Exposio de ferramentas voltadas para o aumento da
produtividade em um ambiente de trabalho em computa-
o cientca. Pr-requisitos: Captulos 1 e 2
4.1 Ipython . . . . . . . . . . . . . . . . . . . . . . . . . 73
Primeiros Passos . . . . . . . . . . . . . . . . . . . . 74
Comandos Mgicos . . . . . . . . . . . . . . . . . . . 75
4.2 Editores de Cdigo . . . . . . . . . . . . . . . . . . . 80
Editores Genricos . . . . . . . . . . . . . . . . . . . 80
Editores Especializados . . . . . . . . . . . . . . . . 83
4.3 Controle de Verses em Software . . . . . . . . . . . 86
Entendendo o Mercurial . . . . . . . . . . . . . . . . 88
II Aplicaes 133
vii
viii LISTA DE FIGURAS
4.11 Modicaes de Bruno. . . . . . . . . . . . . . . . . . . 92
4.12 Modicaes de Ana. . . . . . . . . . . . . . . . . . . . . 92
4.13 Repositrio atualizado de Bruno. . . . . . . . . . . . . . 93
4.14 Repositrio de Bruno aps a fuso. . . . . . . . . . . . . 94
x
Listagens
xi
xii LISTAGENS
1.23 Operaes com listas . . . . . . . . . . . . . . . . . . 18
1.24 Criando listas numricas sequenciais. . . . . . . . . . 19
1.25 Denindo uma Tupla. . . . . . . . . . . . . . . . . . 20
1.26 Outras formas de denir tuplas. . . . . . . . . . . . . 20
1.27 Strings. . . . . . . . . . . . . . . . . . . . . . . . . . 22
1.28 Formatando strings. . . . . . . . . . . . . . . . . . . 23
1.29 Problemas com a concatenao de strings. . . . . . . 24
1.30 Criando e manipulando dicionrios. . . . . . . . . . . 24
1.31 Iterando dicionrios. . . . . . . . . . . . . . . . . . . 25
1.32 Exemplo do emprego de ramicaes. . . . . . . . . 28
1.33 Implementando a funcionalidade de if e elif por
meio de um dicionrio. . . . . . . . . . . . . . . . . . 29
1.34 Comandos de lao no Python. . . . . . . . . . . . . . 30
1.35 A funo enumerate. . . . . . . . . . . . . . . . . . . 30
1.36 Iterando sobre mais de uma sequncia. . . . . . . . . 31
1.37 Iterando sobre uma sequncia ordenada. . . . . . . . 31
1.38 Exemplo de uma exceo . . . . . . . . . . . . . . . 32
1.39 Contornando uma diviso por zero . . . . . . . . . . 33
1.40 Lidando com diferentes tipos de erros. . . . . . . . . 34
1.41 Denindo uma funo com um argumento obrigat-
rio e outro opcional (com valor default"). . . . . . . 35
1.42 lista de argumentos varivel . . . . . . . . . . . . . . 36
1.43 Desempacotando argumentos. . . . . . . . . . . . . . 36
1.44 Passando todos os argumentos por meio de um dici-
onrio. . . . . . . . . . . . . . . . . . . . . . . . . . . 37
1.45 Retornando valores a partir de uma funo. . . . . . 37
1.46 Funes lambda . . . . . . . . . . . . . . . . . . . . . 38
1.47 Geradores . . . . . . . . . . . . . . . . . . . . . . . . 38
1.48 Decorador bsico. . . . . . . . . . . . . . . . . . . . . 39
1.49 Utilizando um decorador . . . . . . . . . . . . . . . . 39
1.50 Limpando a gerao de decoradores . . . . . . . . . . 40
1.51 Usando Docstrings . . . . . . . . . . . . . . . . . . . 41
1.52 Mdulo exemplo . . . . . . . . . . . . . . . . . . . . 43
1.53 Executing a module from the console. . . . . . . . . 44
xiii
xvii
xviii PREFCIO: COMPUTAO CIENTFICA
madores prossionais para o desenvolvimento de produtos voltados
para uma determinada aplicao cientca, e o desenvolvimento
feito por cientistas (fsicos, matemticos, bilogos, etc., que no
so programadores prossionais), geralmente de forma colabora-
tiva atravs do compartilhamento de cdigos fonte.
Algumas disciplinas cientcas, como a estatstica por exemplo,
representam um grande mercado para o desenvolvimento de softwa-
res comerciais genricos voltados para as suas principais aplicaes,
enquanto que outras disciplinas cientcas carecem de massa crtica
(em termos de nmero de prossionais) para estimular o desenvol-
vimento de softwares comerciais para a soluo dos seus problemas
computacionais especcos. Como agravante, o desenvolvimento
lento e centralizado de softwares comerciais, tem se mostrado inca-
paz de acompanhar a demanda da comunidade cientca, que pre-
cisa ter acesso a mtodos que evoluem a passo rpido. Alm disso,
esto se multiplicando as disciplinas cientcas que tm como sua
ferramenta principal de trabalho os mtodos computacionais, como
por exemplo a bio-informtica, a modelagem de sistemas comple-
xos, dinmica molecular e etc.
Cientistas que se vem na situao de terem de desenvolver
softwares para poder viabilizar seus projetos de pesquisa, geral-
mente tm de buscar uma formao improvisada em programao
e produzem programas que tem como caracterstica bsica serem
minimalistas, ou seja, os programas contm o mnimo nmero de
linhas de cdigo possvel para resolver o problema em questo. Isto
se deve conjugao de dois fatos: 1) O cientista raramente possui
habilidades como programador para construir programas mais so-
sticados e 2) Frequentemente o cientista dispe de pouco tempo
entre suas tarefas cientcas para dedicar-se programao.
Para complicar ainda mais a vida do cientista-programador, as
linguagens de programao tradicionais foram projetadas e desen-
volvidas por programadores para programadores e voltadas ao de-
senvolvimento de softwares prossionais com dezenas de milhares
de linhas de cdigo. Devido a isso, o nmero de linhas de cdigo
xix
Apresentando o Python
O Python uma linguagem de programao dinmica e orientada
a objetos, que pode ser utilizada no desenvolvimento de qualquer
tipo de aplicao, cientca ou no. O Python oferece suporte
integrao com outras linguagens e ferramentas, e distribuido com
uma vasta biblioteca padro. Alm disso, a linguagem possui uma
sintaxe simples e clara, podendo ser aprendida em poucos dias.
O uso do Python frequentemente associado com grandes ganhos
de produtividade e ainda, com a produo de programas de alta
qualidade e de fcil manuteno.
A linguagem de programao Python
1 comeou a ser desen-
volvida ao nal dos anos 80, na Holanda, por Guido van Rossum.
Guido foi o principal autor da linguagem e continua at hoje desem-
penhando um papel central no direcionamento da evoluo. Guido
reconhecido pela comunidade de usurios do Python como Bene-
volent Dictator For Life (BDFL), ou ditador benevolente vitalcio
da linguagem.
A primeira verso pblica da linguagem (0.9.0) foi disponibi-
lizada. Guido continou avanando o desenvolvimento da lingua-
gem, que alcanou a verso 1.0 em 1994. Em 1995, Guido emigrou
para os EUA levando a responsabilidade pelo desenvolvimento do
Python, j na verso 1.2, consigo. Durante o perodo em que Guido
2
trabalhou para o CNRI , o Python atingiu a verso 1.6, que foi rpi-
damente seguida pela verso 2.0. A partir desta verso, o Python
1 www.python.org
2 Corporation for National Research Initiatives
xxi
etc...
Entretanto, para melhor compreender todas estas vantagens
apresentadas, nada melhor do que comear a explorar exemplos
xxiii
Windows
TM , instalem o Linux em uma mquina virtual8 ! A dis-
tribuio que recomendo para iniciantes o Ubuntu (www.ubuntu.
com).
Enm, este livro foi concebido para ser uma leitura prazeirosa
para indivduos curiosos como eu, que esto sempre interessados
em aprender coisas novas!
Bom Proveito! Flvio Codeo Coelho
Petrpolis, 2007
Introduo ao Python e
Ferramentas de
Desenvolvimento
1
Captulo 1
Fundamentos da Linguagem
Breve introduo a conceitos bsicos de programao e
linguagem Python. A maioria dos elementos bsicos
da linguagem so abordados neste captulo, com exceo
de classes, que so discutidas em detalhe no captulo 2.
Pr-requisitos: Conhecimentos bsicos de programa-
o em qualquer linguagem.
1 $ python
3
4 CAPTULO 1. FUNDAMENTOS DA LINGUAGEM
2 Python 2.5.1 ( r251 :54863 , May 2 2007 ,
16:56:35)
3 [GCC 4 . 1 . 2 ( Ubuntu 4 . 1 . 2 0 u bu n tu 4 ) ] on
linux2
4 Type " h e l p " , " copyright " , " credits " or "
license" for more information .
5 >>>
1 >>> for =1
2 File "<s t d i n >" , line 1
3 for =1
4 ^
5 SyntaxError : invalid syntax
1 >>> 1+1
2 2
3 >>>
1 $ python s c r i p t . py
1 #! / u s r / b i n / env python
1 $ chmod +x s c r i p t . py
1.2. USO INTERATIVO EXECUO A PARTIR DE
SCRIPTS
VS.
7
1 #! / u s r / b i n / env python
2
3 print " A l Mundo ! "
2 $ . / s c r i p t . py
3 sys : 1 : DeprecationWarning : NonASCII
character ' \ xf4 ' in file ./ teste on line
3, but no encoding declared ; see http
: / /www . p y t h o n . o r g / p e p s / pep 0 2 6 3 . h t m l for
details
4 A l Mundo !
1 >>> 2+2
2 4
3 >>> # C o m e n t r i o
4 ... 22
5 4
6 >>> 2 2 # Comentrio na mesma linha
7 4
8 >>> ( 5 0 5 6 ) / 4
9 5
10 >>> # D i v i s o de inteiros retorna " floor ":
11 ... 7/3
12 2
13 >>> 7/ 3
14 3
15 >>> 7 / 3 .
16 2.3333333333333335
1 >>> l a r g u r a = 2 0
2 >>> a l t u r a = 5 9
3 >>> l a r g u r a altura
4 900
1 >>> x = y = z = 0 # Zero x, y e z
2 >>> x
3 0
4 >>> y
5 0
6 >>> z
7 0
8 >>> a , b , c = 1 , 2 , 3
9 >>> a
10 1
11 >>> b
12 2
13 >>> c
14 3
1 >>> 1 j 1J
2 (1+0 j )
3 >>> 1 j complex ( 0 , 1 )
4 (1+0 j )
5 >>> 3+1 j 3
6 (3+3 j )
7 >>> (3+1 j ) 3
8 (9+3 j )
9 >>> (1+2 j ) /(1+1 j )
10 (1.5+0.5 j )
1 >>> a = 3 . 0 + 3 . 0 j
2 >>> a . r e a l
3 3.0
4 >>> a . imag
5 3.0
6 >>> a b s ( a ) # sqrt (a . real 2 + a . imag 2 )
7 4.2426406871192848
1 >>> a =3 2 7
2 >>> a , b = ( ' l a r a n j a ' , ' banana ' )
1 >>> m a r i a
2 Traceback ( most recent call last ) :
3 File "<s t d i n >" , line 1, in ?
4 NameError : name ' maria ' i s not defined
1 >>> a=1
2 >>> l e n ( g l o b a l s ( ) . i t e m s ( ) )
3 4
4 >>> l e n ( l o c a l s ( ) . i t e m s ( ) )
5 4
6 >>> def fun ( ) :
7 ... a= ' novo valor '
8 ... print len ( l o c a l s () . items () )
9 ... print a
10 ...
11 >>> f u n ( )
12 1
13 novo valor
14 >>> print a
15 1
16 >>> l e n ( l o c a l s ( ) . i t e m s ( ) )
17 5
18 >>> l o c a l s ( )
19 { ' __builtins__ ' : <module ' __builtin__ ' (
built in ) >, '__name__ ' : '__main__ ' , ' fun
' : <f u n c t i o n fun at 0 xb7c18ed4 >, '
__doc__ ' : None , 'a ' : 1}
Listas
4 >>> l i s t a [ 1 ]
5 1
6 >>> l i s t a [ 3 ]
7 1
8 >>>
1 >>> l i s t a [ 2 : ]
2 [ ' que ' , 1]
3 >>>
1 >>> l i s t a [ : ]
2 [ 'a ' , ' pe ' , ' que ' , 1]
3 >>>
1 >>> l i s t a [ : ]
2 [ 'a ' , ' pe ' , ' que ' , 1]
3 >>> l i s t a . append ( 2 ) #a d i c i o n a 2 ao final
4 [ 'a ' , ' pe ' , ' que ' , 1, 2]
5 >>> l i s t a . i n s e r t ( 2 , [ ' a ' , ' b ' ] )
6 >>> l i s t a
7 [ 'a ' , ' pe ' , [ 'a ' , 'b ' ] , ' que ' , 1, 2]
8 >>>
Mtodo Efeito
L.append(objeto) Adiciona um elemento ao nal da lista.
L.count(elemento) Retorna o nmero de ocorrncias do elemento.
L.extend( list ) Concatena listas.
L.index(value) Retorna ndice da primeira ocorrncia do valor.
L. insert ( i , o) Insere objeto (o) antes de ndice (i).
L.pop([indice ]) Remove e retorna objeto no ndice.
ou o ltimo elemento.
L.remove(value) remove primeira ocorrncia do valor.
L.reverse () Inverte lista. In situ
L.sort () Ordena lista. In locus
1 >>> r a n g e ( 1 0 )
2 [0 , 1, 2, 3, 4, 5, 6, 7, 8, 9]
3 >>> r a n g e ( 2 , 2 0 , 2 )#nmeros pares
4 [2 , 4, 6, 8, 10 , 12 , 14 , 16 , 18]
5 >>> r a n g e ( 1 , 2 0 , 2 )#nmeros mpares
6 [1 , 3, 5, 7, 9, 11 , 13 , 15 , 17 , 19]
9 >>> l i s t a
10 [ 'a ' , ' pe ' , 1, 2, 'a ' , 'b ' , 'd ' , 'o ' , ' i ' , '
s ' , ' dois ' ]
11 >>> l i =[1 ,2]
12 >>> li 3
13 [1 , 2, 1, 2, 1, 2]
14 >>>
1 >>> t u = ( ' G e n e r o ' , ' especie ' , ' peso ' , '
estagio ' )
2 >>> t u [ 0 ]
3 ' Genero '
4 >>> t u [ 1 : 3 ]
5 ( ' especie ' , ' peso ' )
6 >>>
1 >>> t u =()
2 >>> t u
3 ()
4 >>> t u= ' c a s a ' , #<R e p a r e na vrgula ao
final !
5 >>> t u
1.4. ESTRUTURAS DE DADOS 21
Strings
12 primeira linha
13 segunda linha
14 terceira linha
Dicionrios
1 >>> Z={ 'C ' : 1 2 , 'O ' : 1 6 , 'N ' : 1 2 , ' Na ' : 4 0 }
2 >>> Z [ 'O ' ]
3 16
4 >>> Z [ 'H ' ]=1
5 >>> Z
6 { ' Na ' : 40 , 'C ' : 12 , 'H ' : 1, 'O ' : 16 , 'N ' :
12}
1.4. ESTRUTURAS DE DADOS 25
7 >>> Z . k e y s ( )
8 [ ' Na ' , 'C ' , 'H ' , 'O ' , 'N ' ]
9 >>> Z . has_key ( 'N ' )
10 1
1 >>> Z . i t e m s ( )
2 [ ( ' Na ' , 40) , ( 'C ' , 12) , ( 'H ' , 1) , ( 'O ' , 16) ,
( 'N ' , 12) ]
3 >>> i =Z . i t e r i t e m s ( )
4 >>> i
5 <d i c t i o n a r y i t e r a t o r object at 0 x 8 9 8 5 d 0 0>
6 >>> i . n e x t ( )
7 ( ' Na ' , 40)
8 >>> i . n e x t ( )
26 CAPTULO 1. FUNDAMENTOS DA LINGUAGEM
Tabela 1.2: Mtodos de Dicionrios.
Mtodo Efeito
D.clear() Remove todos os itens do dicionrio.
D.copy() Cria uma cpia de um dicionrio.
D.get(k[,d]) Retorna D[k], se a chave k existir. Seno, d.
D.has_key(k) Retorna 1 se D possuir a chave k.
D.items() Retorna lista de tuplas (chave:valor).
D.iteritems() Retorna objeto iterador para D.
D.iterkeys() Idem para chaves.
D.itervalues () Idem para valores.
D.keys() Retorna lista com todas as chaves.
D.popitem() Remove e retorna um tem (chave:valor).
D.update(E) Copia itens de E para D.
D.values() Retorna lista com todas os valores.
Conjuntos
a - b: A B8
a | b: AB
8 Por conveno representa-se conjuntos por letras maisculas.
28 CAPTULO 1. FUNDAMENTOS DA LINGUAGEM
a & b: A B
a b: (A B) (A B)
Condies
1 if a == 1 :
2 #e s t e bloco executado se a for 1
3 pass
4 elif a == 2 :
5 #e s t e bloco executado se a for 2
6 pass
7 else :
8 #e s t e bloco executado se
9 #s e se nenhum dos blocos
10 #a n t e r i o r e s tiver sido executado
11 pass
1.5. CONTROLE DE FLUXO 29
1 d e s f e c h o s = { 1 : fun1 , 2 : fun2 }
2 desfechos [ a ]
Iterao
O lao for: O lao for nos permite iterar sobre uma sequn-
cia atribuindo os elementos da mesma a uma varivel, sequencial-
mente, medida que prossegue. Este lao se interrompe automa-
ticamente ao nal da sequncia.
1 >>> for n,e in enumerate ( [ ' a ' , ' b ' , ' c ' , ' d ' , ' e
' ]) :
2 print "%s : %s "%(n , e )
3
4 0: a
5 1: b
6 2: c
7 3: d
8 4: e
1.5. CONTROLE DE FLUXO 31
1 >>> for i in r e v e r s e d ( r a n g e ( 5 ) ) :
2 print i
3 4
4 3
5 2
6 1
7 0
1 >>> 1 / 0
1 >>> try :
2 f = open ( ' a r q . t x t ' )
3 s = f . readline ()
4 i = int ( s . strip () )
5 except I O E r r o r , ( errno , strerror ) :
6 print " E r r o de I /O (% s ) : %s " % (
errno , strerror )
7 except V a l u e E r r o r :
8 print "No f o i possvel converter o
dado em Inteiro . "
9 except :
10 print " Erro desconhecido . "
1.6 Funes
No Python, uma funo um bloco de cdigo denido por um
cabealho especco e um conjunto de linhas indentadas, abaixo
deste. Funes, uma vez denidas, podem ser chamadas de qual-
quer ponto do programa (desde que pertenam ao espao de no-
1.6. FUNES 35
Funes lambda
Geradores
Decoradores
1 def faznada ( f ) :
2 def novaf ( args , kwargs ) :
3 print " chamando . . . " , a r g s , k w a r g s
4 return f ( a r g s , k w a r g s )
5 n o v a f . __name__ = f . __name__
6 n o v a f . __doc__ = f . __doc__
7 n o v a f . __dict__ . u p d a t e ( f . __dict__ )
8 return novaf
1 >>>@ f a z n a d a
2 def soma ( a , b ) :
3 return a+b
4
5 >>> soma ( 1 , 2 )
6 chamando . . . (1 , 2) {}
7 Out [ 5 ] : 3
Strings de Documentao
2 >>> f i b o . f i b ( 5 0 )
3 1 1 2 3 5 8 13 21 34
4 >>> f i b o . __name__
5 ' fibo '
1 $ python f i b o . py 60
2 __main__
3 [ ' f i b o . py ' , '60 ']
4 1 1 2 3 5 8 13 21 34 55
Numpy
Um dos pacotes mais importantes, seno o mais importante para
quem deseja utilizar o Python em computao cientca, o numpy.
Este pacote contm uma grande variedade de mdulos voltados
para resoluo de problemas numricos de forma eciente.
Exemplos de objetos e funes pertencentes ao pacote numpy
aparecero regularmente na maioria dos exemplos deste livro. Uma
lista extensiva de exemplos de Utilizao do Numpy pode ser con-
sultada neste endereo: http://www.scipy.org/Numpy_Example_
List
Na listagem 1.55, vemos um exemplo de uso tpico do numpy. O
numpy nos oferece um objeto matriz, que visa representar o conceito
matemtico de matriz. Operaes matriciais derivadas da algebra
linear, so ainda oferecidas como funes atravs do subpacote li-
nalg (Listagem 1.55).
14 nome_da_varivel.atributo
1.8. DOCUMENTANDO PROGRAMAS 47
Scipy
Outro mdulo muito til para quem faz computao numrica com
Python, o scipy. O scipy depende do numpy e prov uma
grande coleo de rotinas numricas voltadas para aplicaes em
matemtica, engenharia e estatstica.
Diversos exemplos da segunda parte deste livro se utilizaro
do scipy, portanto, no nos extenderemos em exemplos de uso do
scipy.
Uma lista extensa de exemplos de utilizao do scipy pode ser
encontrada no seguinte endereo:http://www.scipy.org/Documentation.
Pydoc
1 $ pydoc pydoc
Epydoc
1 $ epydoc h
15 http://epydoc.sourceforge.net
50 CAPTULO 1. FUNDAMENTOS DA LINGUAGEM
1.9 Exerccios
1. Repita a iterao do exemplo 1.35 sem utilizar a funo enu-
merate. Execute a iterao do objeto gerado por enumerate
manualmente, sem o auxlio do lao for e observe o seu re-
sultado.
Programao Orientada a
Objetos
Introduo programao orientada a objetos e sua im-
plementao na linguagem Python. Pr-requisitos:
Ter lido o captulo 1.
51
52 CAPTULO 2. ORIENTAO A OBJETO
laridade, e linguagens at ento no estruturadas (Basic, Fortran,
etc.) ganham verses estruturadas. Outros exemplos de lingua-
gens no estruturadas incluem Ada, D, Forth,PL/1, Perl, maple,
Matlab, Mathematica, etc.
A estruturao de programas deu origem a diversos paradig-
mas de programao, tais como a programao funcional, na qual
a computao vista como a avaliao sequencial de funes mate-
mticas, e cujos principais exemplos atuais so as linguagens Lisp
e Haskell.
A programao estruturada atingiu seu pico em versatilidade e
popularidade com o paradigma da programao orientada a obje-
tos. Na programao orientada a objetos, o programa dividido
em unidades (objetos) contendo dados (estado) e funcionalidade
(mtodos) prpria. Objetos so capazes de receber mensagens,
processar dados (de acordo com seus mtodos) e enviar mensagens
a outros objetos. Cada objeto pode ser visto como uma mquina
independente ou um ator que desempenha um papel especco.
2.1 Objetos
Um tema frequente em computao cientca, a simulao de
sistemas naturais de vrios tipos, fsicos, qumicos, biolgicos, etc.
A orientao a objetos uma ferramenta natural na construo de
simulaes, pois nos permite replicar a arquitetura do sistema natu-
ral em nossos programas, representando componentes de sistemas
naturais como objetos computacionais.
A orientao a objeto pode ser compreendida em analogia ao
conceito gramatical de objeto. Os componentes principais de uma
frase so: sujeito, verbo e objeto. Na programao orientada a
objeto, a ao est sempre associada ao objeto e no ao sujeito,
como em outros paradigmas de programao.
Um dos pontos altos da linguagem Python que facilita sua assi-
milao por cientistas com experincia prvia em outras linguagens
2.1. OBJETOS 53
1 class Objeto :
2 pass
1 class pessoa :
2 i d a d e =20
3 a l t u r a =170
4 s e x o= ' m a s c u l i n o '
5 p e s o =70
1 >>> m a r i a = p e s s o a ( )
2 >>> m a r i a . p e s o
3 70
4 >>> m a r i a . s e x o
5 ' masculino '
6 >>> m a r i a
7 <__main__ . p e s s o a instance at 0 x402f196c>
Herana
1 >>> class C a c h o r r o :
2 pass
3 >>> r e x=C a c h o r r o ( )
4 >>> r e x . dono = ' P e d r o '
5 >>> r e x . r a c a = ' P a s t o r '
6 >>> r e x . p e s o =25
7 >>> r e x . dono
8 ' Pedro '
9 >>> l a i k a = C a c h o r r o ( )
10 >>> l a i k a . dono
11 AttributeError : Cachorro instance has no
attribute ' dono '
2.2 Exerccios
1. Utilizando os conceitos de herana e os exemplos de classes
apresentados, construa uma classe Cachorro que herde atri-
butos das classes Carnivoro e Mamfero e crie instncias que
possuam donos, raas, etc.
1 http://matplotlib.sourceforge.net
59
60 CAPTULO 3. CRIANDO GRFICOS EM PYTHON
terativa quanto em scripts, aplicaes web ou integrada a interfaces
grcas (GUIs) de vrios tipos.
1 $ python s e t u p . py install
Congurando o MPL
Comandos Bsicos
O Comando subplot
O MPL trabalha com o conceito de gura independente do de ei-
xos. O comando gcf() retorna a gura atual, e o comando gca()
retorna os eixos atuais. Este detalhe nos permite posicionar os ei-
xos de um grco em posies arbitrrias dentro da gura. Todos
os comandos de plotagem so realizados nos eixos atuais. Mas,
para a maioria dos usurios, estes detalhes so transparentes, ou
66 CAPTULO 3. CRIANDO GRFICOS EM PYTHON
Tabela 3.2: Argumentos que podem ser passados juntamente com
a funo plot para controlar propriedades de linhas.
Propriedade Valores
alpha transparncia (0-1)
antialiased true | false
color Cor: b,g,r,c,m,y,k,w
label legenda
linestyle -- : -. -
linewidth Espessura da linha (pontos)
marker + o . s v x > < ^
markeredgewidth Espessura da margem do smbolo
markeredgecolor Cor da margem do smbolo
markerfacecolor Cor do smbolo
markersize Tamanho do smbolo (pontos)
11
12 figure (1)
13 subplot (211)
14 p l o t ( t1 , f ( t1 ) , ' bo ' , t2 , f ( t2 ) , 'k ' )
15
16 subplot (212)
17 p l o t ( t2 , cos (2 pi t2 ) , ' r ' )
18 s a v e f i g ( ' s u b p l o t . png ' , d p i =400)
19 show ( )
68 CAPTULO 3. CRIANDO GRFICOS EM PYTHON
Tabela 3.3: Argumentos opcionais dos comandos de insero de
texto.
Propriedades Valores
alpha Transparncia (0-1)
color Cor
fontangle italic | normal | oblique
fontname Nome da fonte
fontsize Tamanho da fonte
fontweight normal | bold | light4
horizontalalignment left | center | right
rotation horizontal | vertical
verticalalignment bottom | center | top
cifres($).
Mapas
O matplotlib pode ser extendido para plotar mapas. Para isso pre-
cisamos instalar o Basemap toolkit. Se voc j instalou o matplo-
70 CAPTULO 3. CRIANDO GRFICOS EM PYTHON
3 import pylab as p
4
5 map = Basemap ( p r o j e c t i o n= ' r o b i n ' , l a t _ 0 = 23,
lon_0 = 46,
6 r e s o l u t i o n= ' l ' , a r e a _ t h r e s h
=1000.)
7 map . d r a w c o a s t l i n e s ( )
8 map . d r a w c o u n t r i e s ( )
9 map . f i l l c o n t i n e n t s ( c o l o r= ' c o r a l ' )
10 map . drawmapboundary ( )
11 map . d r a w m e r i d i a n s ( p . a r a n g e ( 0 , 3 6 0 , 3 0 ) )
12 map . d r a w p a r a l l e l s ( p . a r a n g e ( 9 0 , 9 0 , 3 0 ) )
13 p . show ( )
Ferramentas de
Desenvolvimento
Exposio de ferramentas voltadas para o aumento da
produtividade em um ambiente de trabalho em compu-
tao cientca. Pr-requisitos: Captulos 1 e 2
4.1 Ipython
A utilizao interativa do Python de extrema valia. Outros am-
bientes voltados para computao cientca, tais como Matlab
TM ,
R, Mathematica
TM dentre outros, usam o modo interativo como seu
principal modo de operao. Os que desejam fazer o mesmo com o
Python, podem se beneciar imensamente do Ipython.
O Ipython uma verso muito sosticada da shell do Python
voltada para tornar mais eciente a utilizao interativa da lingua-
gem Python.
73
74 CAPTULO 4. FERRAMENTAS DE DESENVOLVIMENTO
Primeiros Passos
Todas as opes podem ser prexadas por no para serem des-
ligadas (no caso de serem ativas por default).
Comandos Mgicos
1 In [ 6 ] : % ed
2 IPython will make a temporary file named : /
tmp/ ipython_edit_GuUWr_ . py
3 done . Executing edited code . . .
4 Out [ 6 ] : " d e f fun ( ) : \ n print ' fun '\ n \
ndef funa ( ) : \ n print ' f u n a ' \ n"
5
6 In [ 7 ] : fun ( )
7 fun
8
9 In [ 8 ] : funa ( )
10 funa
11
12 In [ 9 ] : % ed fun
13 done . Executing edited code . . .
Editores Genricos
1 http://www.dur.ac.uk/p.j.heslin/Software/Emacs/Easymacs/
82 CAPTULO 4. FERRAMENTAS DE DESENVOLVIMENTO
Editores Especializados
Entendendo o Mercurial
2 http://www.selenic.com/mercurial
4.3. CONTROLE DE VERSES EM SOFTWARE 89
Exemplo de uso:
Nestes exemplos, exploraremos as operaes mais comuns num am-
biente de desenvolvimento em colaborao utilizando o Mercurial.
Vamos comear com nossa primeira desenvolvedora, chamada
Ana. Ana possui um arquivo como mostrado na gura 4.10.
Nosso segundo desenvolvedor, Bruno, acabou de se juntar ao
time e clona o repositrio Ana .
5
1 $ hg clone s s h : / / maquinadana / p r o j e t o
meuprojeto
2 requesting all changes
3 adding changesets
4 adding manifests
5 adding file changes
6 added 4 changesets with 4 changes to 2 files
URLs vlidas:
le://
http://
https://
ssh://
static-http://
1 $ hg pull
4.3. CONTROLE DE VERSES EM SOFTWARE 93
1 $ hg update
2 this update spans a branch affecting the
following files :
3 h e l l o . py ( resolve )
94 CAPTULO 4. FERRAMENTAS DE DESENVOLVIMENTO
1 $ hg merge tip
2 merging h e l l o . py
Criando um Repositrio
Para criar um repositrio do zero, preciso apenas um comando:
1 $ hg init
4.3. CONTROLE DE VERSES EM SOFTWARE 95
5.1 Introduo
O Python uma linguagem extremamente poderosa e verstil, per-
feitamente apta a ser, no somente a primeira, como a ltima lin-
guagem de programao que um cientista precisar aprender. En-
tretanto, existem vrias situaes nas quais torna-se interessante
combinar o seu cdigo escrito em Python com cdigos escritos em
outras linguagens. Uma das situaes mais comuns, a necessi-
dade de obter maior performance em certos algoritmos atravs da
re-implementao em uma linguagem compilada. Outra Situao
comum possibilidade de se utilizar de bibliotecas desenvolvidas
em outras linguagens e assim evitar ter que reimplement-las em
Python.
O Python uma linguagem que se presta. extremamente bem.
a estas tarefas existindo diversos mtodos para se alcanar os obje-
99
CAPTULO 5. INTERAGINDO COM OUTRAS
100 LINGUAGENS
tivos descritos no pargrafo acima. Neste captulo, vamos explorar
apenas os mais prticos e ecientes, do ponto de vista do tempo de
implementao.
Weave
1 # e n c o d i n g : l a t i n 1
2 # Disponivel no pacote de programas como :
w e a v e l o o p . py
3 from s c i p y . weave import inline , converters
4 import t i m e
5 from p y l a b import
6
7 c o d e=" " "
8 int i =0;
9 while ( i < n)
10 {
11 i ^3;
12 i ++;
13 }"""
14 def loopp (n) :
15 i =0
16 while i < n:
17 i 3
18 i +=1
19
20 def loopc (n) :
21 return i n l i n e ( code , [ ' n ' ] ,
t y p e _ c o n v e r t e r s=c o n v e r t e r s . b l i t z
, c o m p i l e r= ' g c c ' )
22
23 def b e n c h ( max ) :
24 ptim = []
25 ctim = []
26 for n in x r a n g e ( 1 0 0 , max , 1 0 0 ) :
27 t = time . time ( )
28 loopp (n)
29 t 1=t i m e . t i m e ( ) t
CAPTULO 5. INTERAGINDO COM OUTRAS
102 LINGUAGENS
30 p t i m . append ( t 1 )
31 t = time . time ( )
32 loopc (n)
33 t 1=t i m e . t i m e ( ) t
34 c t i m . append ( t 1 )
35 return ptim , c t i m , max
36
37 ptim , c t i m , max = b e n c h ( 1 0 0 0 0 )
38 s e m i l o g y ( x r a n g e ( 1 0 0 , max , 1 0 0 ) , ptim , ' bo ' ,
x r a n g e ( 1 0 0 , max , 1 0 0 ) , c t i m , ' go ' )
39 y l a b e l ( ' tempo em s e g u n d o s ' ) ; x l a b e l ( u ' Nmero
de operaes ' ) ; grid ()
40 l e g e n d ( [ ' Python ' , 'C ' ] )
41 s a v e f i g ( ' w e a v e l o o p . png ' , d p i =400)
42 show ( )
pt
45 print ' Tempo mdio no weave : %g s e g u n d o s '%
ct
46 S t a t s = bayes_mvs ( a r r a y ( p t i m ) / a r r a y ( c t i m ) )
47 print " Acelerao mdia : %g + %g "% ( S t a t s
[0][0] ,
48 Stats [ 2 ] [ 0 ] )
1 $ python w e a v e f i b . py
2 Tempo mdio no p y t h o n : 1 . 6 9 2 7 7 e 05 segundos
3 Tempo mdio no weave : 1 . 3 1 1 3 e 05 segundos
4 Acelerao mdia : 1 . 4 9 5 5 4 + 0 . 7 6 4 2 7 5
Ctypes
1 >>> l i b c . p r i n t f
2 <_FuncPtr object at 0x . . . >
3 >>> print l i b c . t i m e ( None )
4 1150640792
5 >>> p r i n t f = l i b c . p r i n t f
6 >>> p r i n t f ( " Ola , %s \ n " , "Mundo ! " )
7 Ola , Mundo !
Pyrex
No h suporte a Unicode.
Vamos analisar o cdigo Pyrex, nas linhas onde ele difere do que
seria escrito em Python. Na linha 2 encontramos a primeira pe-
culiaridade: o argumento de entrada kmax denido como inteiro
por meio da expresso int kmax. Em Pyrex, devemos declarar os
tipos das variveis. Nas linhas 3 e 4 tambm ocorre a declarao
dos tipos das variveis que sero utilizadas na funo. Note como
denida uma lista de inteiros. Se uma varivel no declarada,
o Pyrex assume que ela um objeto Python.
Quanto mais variveis conseguirmos declarar como tipos bsicos
de C, mais eciente ser o cdigo C gerado pelo Pyrex. A varivel
result(linha 5) no declarada como uma lista de inteiros, pois
no sabemos ainda qual ser seu tamanho. O restante do cdigo
equivalente ao Python. Devemos apenas notar a preferncia do
lao while for i in range(x). Este
ao invs de um lao do tipo
ultimo seria mais lento devido a incluir a funo range do Python.
O prximo passo gerar a verso em C da listagem 5.6, compilar
e link-lo, transformando-o em um mdulo Python.
5.2. INTEGRAO COM A LINGUAGEM C 109
1 $ pyrexc p r i m e s . pyx
2 $ gcc c fPIC I / u s r / i n c l u d e / p y t h o n 2 . 4 /
primes . c
3 $ gcc s h a r e d primes . o o primes . so
1 import s e t u p t o o l s
2 from s e t u p t o o l s . e x t e n s i o n import Extension
b n1
ba
Z
h X
f (x) dx (f (a) + f (b)) + h f (a + ih), h= (5.1)
a 2 i=1
n
1 # e n c o d i n g : l a t i n 1
2 # Disponivel no pacote de programas como :
t r a p i n t l o o p . py
3 # copyright 2007 by Flvio Codeo Coelho
5.3. INTEGRAO COM C++ 113
1 $ python t r a p i n t l o o p . py
2 resultado : 16
3 Tempo : 11.68 seg
4 resultado : 49029
5 Tempo : 26.96 seg
{
36 double h2 , p , res ;
37 int __0, __1, i , n;
38
39 n = 5000000;
40 h2 = ( ( ba ) / ( n 2 . 0 ) ) ;
41 r e s = ( ( h2 f u n ( a ) ) +(h2 f u n ( b ) ) ) ;
42
43 FAST_FOR( i , 0 , n , 1 , 0 , 1 )
44 p = ( a +(( i 2 ) h2 ) ) ;
45 r e s += ( ( 2 h2 ) f u n ( p ) ) ;
46 END_FOR
47
48 return res ;
49 }
50
51 } // module namespace
52
53 int main ( int argc , char a r g v ) {
54 __shedskin__ : : _ _ i n i t ( ) ;
55 __math__ : : _ _ i n i t ( ) ;
56 __time__ : : _ _ i n i t ( ) ;
57 __trapintloop__ : : __main ( ) ;
58 }
f2py
Esta ferramenta est disponvel como parte do Pacote numpy (www.
scipy.org). Para ilustrar o uso do f2py, vamos voltar ao problema
da integrao pela regra trapezoidal (equao 5.3). Como vimos, a
implementao deste algoritmo em Python, utilizando um lao for,
ineciente. Para linguagens compiladas como C++ ou Fortran,
laos so executados com grande ecincia. Vejamos a performance
de uma implementao em Fortran da regra trapezoidal (listagem
??).
Listagem 5.16: implementao em Fortran da regra trapezoidal.
label
1 program t r a p e z i o
2 intrinsic exp , l o g , s i n
3 real l i n e a r , n o n l
4 external l i n e a r
5 external n o n l
6 call tint (1.0 ,5.0 , linear , res )
7 print , " R e s u l t a d o : " , r e s
8 c a l l t i n t ( 1 . 0 , 5 . 0 , nonl , r e s )
9 print , " R e s u l t a d o : " , r e s
10 end
11
12 subroutine t i n t ( a , b , f u n , r e s )
13 real a , b , r e s
14 integer 8 n
15 real h2 , a l f a
16 real f u n
17 external f u n
5.4. INTEGRAO COM A LINGUAGEM FORTRAN 119
18 n = 5000000
19 Cf2py intent ( in ) a
20 Cf2py intent ( in ) b
21 Cf2py intent ( in ) f u n
22 Cf2py intent ( out , h i d e , c a c h e ) res
23 h2 = ( ba ) / ( 2 n )
24 a l f a =h2 f u n ( a )+h2 f u n ( b )
25 r e s =0.0
26 do i =1 , n
27 p = a+ i 2 h2
28 r e s = r e s +2 h2 f u n ( p )
29 end do
30 r e s = r e s+ a l f a
31 return
32 end
33
34 real function l i n e a r ( x )
35 real x
36 Cf2py intent ( in , out ) x
37 linear = x +1.0
38 return
39 end
40
41 real function n o n l ( x )
42 real x
43 Cf2py intent ( in , out ) x
44 n o n l = e x p ( x 2 l o g ( x+x s i n ( x ) ) )
45 return
46 end
A listagem 5.17 nos mostra como compilar e executar o cdigo
da listagem ??. Este comando de compilao pressupe que voc
possua o GCC (Gnu Compiler Collection) verso 4.0 ou superior.
No caso de verses mais antigas deve-se substituir gfortran por
CAPTULO 5. INTERAGINDO COM OUTRAS
120 LINGUAGENS
g77 ou f77.
1 import ez_setup
2 ez_setup . u s e _ s e t u p t o o l s ( )
3 import s e t u p t o o l s
4 from numpy . d i s t u t i l s . c o r e import setup ,
Extension
5 flib = E x t e n s i o n ( name= ' m e u p a c o t e . f l i b ' ,
6 l i b r a r i e s =[] ,
7 library_dirs =[] ,
8 f2py_options =[] ,
9 s o u r c e s =[ ' m e u p a c o t e /
flib . f ' ]
10 )
11 s e t u p ( name = ' mypackage ' ,
12 version = ' 0.3.5 ' ,
13 packages = [ ' meupacote ' ] ,
14 ext_modules = [ flib ]
15 )
CAPTULO 5. INTERAGINDO COM OUTRAS
126 LINGUAGENS
5.5 A Pton que sabia Javans Integrao
com Java
Peo licena ao mestre Lima Barreto, para parodiar o ttulo do seu
excelente conto, pois no pude resistir analogia. A linguagem
Python, conforme descobrimos ao longo deste livro, extrema-
mente verstil, e deve esta versatilidade, em parte, sua biblioteca
padro. Entretanto existe uma outra linguagem que excede em
muito o Python (ao menos atualmente), na quantidade de mdu-
los disponveis para os mais variados ns: o Java.
A linguagem Java tem, todavia, contra si uma srie de fatores:
A complexidade de sua sintaxe rivaliza com a do C++, e no e-
ciente, como esperaramos que o fosse, uma linguagem compilada,
com tipagem esttica. Mas todos estes aspectos negativos no so
sucientes para anular as vantagens do vasto nmero de bibliotecas
disponveis e da sua portabilidade.
O interpretador Jython
1 import j a v a x . s w i n g . J O p t i o n P a n e ;
2 class t e s t D i a l o g {
3 public static void main ( S t r i n g [ ] args )
{
4 j a v a x . s wi n g . JOptionPane .
showMessageDialog ( null , " Isto e
um teste . " ) ;
CAPTULO 5. INTERAGINDO COM OUTRAS
128 LINGUAGENS
5 }
6 }
2 class a p p l e t p ( j a v a . a p p l e t . A p p l e t ) :
3 def p a i n t ( s e l f , g ) :
4 g . drawString ( ` ` Eu s o u um A p p l e t
Jython ! ' ' , 5, 5 )
1 $ jythonc d e e p c o r e j appletp . j a r
a p p l e t p . py
2 processing appletp
3
4 Required packages :
5 java . applet
6
7 Creating adapters :
8
9 Creating . java files :
CAPTULO 5. INTERAGINDO COM OUTRAS
130 LINGUAGENS
10 appletp module
11 appletp extends java . a p p l e t . Applet
12
13 Compiling . java to . class . . .
14 Compiling with args : [ ' / o p t / b l a c k d o w n j d k
1.4.2.01/ bin / javac ' , ' c l a s s p a t h ' , '/
usr / share / jython / l i b / jython 2.1. j a r :/ usr
/ s h a r e / l i b r e a d l i n e j a v a / l i b / l i b r e a d l i n e
j a v a . j a r : . : . / jpywork : : / u s r / s h a r e / j y t h o n /
t o o l s / jythonc :/ home/ f c c o e l h o / Documents /
L i v r o P y t h o n / . : / u s r / s h a r e / j y t h o n / Lib ' ,
' . / jpywork / a p p l e t p . java ' ]
15 0 Note : . / jpywork / a p p l e t p . j a v a uses or
overrides a deprecated API .
16 Note : Recompile with d e p r e c a t i o n for
details .
17
18 Building archive : appletp . j a r
19 Tracking java dependencies :
1 < html>
2 < head>
3 <meta content=" t e x t / h t m l ; c h a r s e t=ISO
8859 1"
4 h t t p e q u i v=" c o n t e n t t y p e ">
5 t i t l e>j y t h o n
< a p p l e t</ t i t l e>
6 </ head>
7 <body>
8 Este
5.6. EXERCCIOS 131
9 &e a c u t e ; o s e u a p p l e t em J y t h o n :<br>
10 < br>
11 <br>
12 <center>
13 <applet code=" a p p l e t p " archive=" a p p l e t p . j a r "
name=" A p p l e t em J y t h o n "
14 alt=" T h i s b r o w s e r d o e s n ' t s u p p o r t JDK 1 . 1
a p p l e t s . " align=" bottom "
15 height=" 5 0 " width=" 1 6 0 ">
16 <PARAMNAME=" c o d e b a s e " VALUE=" . ">
17 <h3>A l g o s a i u e r r a d o ao c a r r e g a r
18 e s t e a p p l e t .</ h3>
19 </ applet>
20 </ center>
21 <br>
22 <br>
23 </ body>
24 </ html>
5.6 Exerccios
1. Compile a listagem 5.1 com o Shed-skin e veja se h ganho de
performance. Antes de compilar, remova as linhas associadas
ao uso do Weave.
Aplicando o Python a
Problemas Cientcos
Concretos
133
Captulo 6
Modelagem Matemtica
Introduo modelagem matemtica e sua implementa-
o computacional. Discusso sobre a importncia da
Anlise dimensional na modelagem e apresentao do
pacote Unum para lidar com unidades em Python. Pr-
requisitos:Conhecimentos bsicos de clculo.
135
136 CAPTULO 6. MODELAGEM MATEMTICA
discriminar o que relevante do que no , hipotetizar sobre as
relaes causais que regem os processos observados, etc.
Ao se deter nestes detalhes, comeam a surgir os vazios do co-
nhecimento, buracos a serem preenchidos com experimentos e ob-
servaes ainda no pensados. Do mesmo modo, observaes e in-
tuies que antes no faziam muito sentido, comeam a se encaixar
melhor. . .
Muitas vezes, o resultado nal de um modelo parece to bvio,
que nos perguntamos para que serviu. No entanto, o bvio s se
tornou bvio, por causa do ato de modelar.
Caetano Veloso
6.1 Modelos
Lineares
R$ = a Km + b
138 CAPTULO 6. MODELAGEM MATEMTICA
Tabela 6.1: Valor de corridas de taxi
Y =aX +b
a, chamado de coeciente angular, a taxa de variao da
onde
grandeza Y por unidade de X e b, chamado de coeciente linear,
o valor de Y quando X = 0. Este modelo se expressa gracamente
como uma reta com ngulo a em relao a linha horizontal e que
cruza o eixo vertical no ponto b. Esta reta ser crescente se a
for maior do que 0; horizontal, se a = 0, e decrescente, se a for
negativo.
6.1. MODELOS 141
Exponenciais
Y = wB X
Modelando Iterativamente
Integrao Numrica
1 http://www.scipy.org
6.2. CONSTRUINDO MODELOS DINMICOS 149
dP
= rP pP Q (6.1)
dt
dQ
= mQ + P Q
dt
1 #modelo_ode . py
2 # Disponivel no pacote de programas como :
modelo_ode . py
3 # e n c o d i n g : u t f 8
4 from scipy import integrate
3 http://model-builder.sourceforge.net
4 A menos que adicionemos contantes ao modelo que re-equilibrem a equa-
o do ponto de vista dimensional
156 CAPTULO 6. MODELAGEM MATEMTICA
Tabela 6.2: Dimenses bsicas.
Outros adimensionais:
Funes trigonomtricas,
Expoentes,
Logaritmos,
Contagens,
, e, etc.
Anlise Dimensional
O Pacote Unum
5 Quando escrevemos nossos modelos em Python, podemos fazer
uso de unidades para nossas variveis de forma a no cometer erros
quanto s dimenses do nosso problema. Vamos explorar algumas
possibilidades interativamente dentro do Ipython.
1 In [1]: from unum . u n i t s import
2 In [ 2 ] :M
3 Out [ 2 ] : 1 . 0 [m]
1 In [ 3 ] : a=3M
2 In [ 4 ] : t =1 S
3 In [ 5 ] : a/ t
4 Out [ 5 ] : 3 . 0 [m/ s ]
5 In [ 6 ] : 1 / ( 3 M/ S )
6 Out [ 6 ] : 0 . 3 3 3 3 3 3 3 3 3 3 3 3 [ s /m]
7 In [ 7 ] : 2 5 M 2
8 Out [ 7 ] : 2 5 . 0 [ m2 ]
9 In [ 8 ] : ( 3 M) ( 4 M)
10 Out [ 8 ] : 1 2 . 0 [ m2 ]
11 In [ 9 ] : 1 3 KGM/ S 2
12 Out [ 9 ] : 1 3 . 0 [ kg .m/ s 2 ]
1 In [10]:(2 M/ S ) (3 S /M)
2 Out [ 1 0 ] : 6 . 0 []
1 In [ 1 1 ] : massa = 1 . 5 KG
2 In [ 1 2 ] : v e l o c i d a d e =2M/ S
3 In [ 1 3 ] : e n e r g i a _ c i n e t i c a =( massa v e l o c i d a d e
2 ) /2
4 In [ 1 4 ] : energia_cinetica
5 Out [ 1 4 ] : 3 . 0 [ kg . m2/ s 2 ]
Evitando Erros
Utilizar unidades no apenas uma questao esttica, tambm pode
ajudar a evitar enganos:
6.3. GRANDEZAS, DIMENSES E UNIDADES 161
1 In [ 1 5 ] : e n e r g i a _ c i n e t i c a +3KG
2 DimensionError : [ kg . m2/ s 2 ] incompatible with
[ kg ]
3 In [ 1 6 ] :MKG
4 DimensionError : unit [ kg ] unexpected
1 In [ 1 7 ] : e n e r g i a _ c i n e t i c a . as ( J )
2 Out [ 1 7 ] : 3 . 0 [J]
1 In [ 6 ] : f o r c a = PA M 2
2 In [ 7 ] : forca
3 Out [ 7 ] : 1 . 0 [N]
5 Out [ 4 ] : 1 . 0 [ legua ]
6 In [ 5 ] : KLEGUA = u n i t ( ' k i l o l e g u a ' , 1 0 0 0 LEGUA)
7 In [ 6 ] : 2 0 KLEGUA+1LEGUA
8 Out [ 6 ] : 2 0 . 0 0 1 [ kilolegua ]
N
T rabalho(J) = P ressao V olume = m3 = N m = J
m2
Esta denio de Trabalho (N m), no a mesma da tabela 6.3
mas um pouco de lgebra pode demonstrar a sua validade . Com
6
o Unum, isso seria uma tarefa trivial:
Fora(MKS):
Newton (m kg/s2 )
Fora(CGS):
Dyne (cm g/s2 )
M =1M
Mf
= 0.082
Mc0.87
e resolv-la com o Unum. Como vemos a unidade de nossa constante
kg 0.13 .
1 In [ 1 3 ] : KG/KG 0 . 8 7
2 Out [ 1 3 ] : 1 . 0 [ kg0 . 1 3 ]
1 In [ 2 0 ] : 1 0 0 0 0 . 1 3 KG 0 . 1 3 1 0 0 0 0 . 8 7 KG
0.87
2 Out [ 2 0 ] : 1 0 0 0 . 0 [ kg ]
3 In [21]:0.082(10000.13) (2000.87)
4 Out [ 2 1 ] : 2 0 . 2 1 6 6 8 5 1 9 9 7 9 1 5 6 3
6.4 Exerccios
1. Determine as dimenses das seguintes grandezas (manual-
mente e depois utilizando o Unum):
a) Volume
b) Acelerao (velocidade/tempo)
c) Densidade (massa/volume)
a) Presso (fora/rea)
2
b) (volume)
Teoria de Grafos
Breve introduo a teoria de grafos e sua representao
computacional. Introduo ao Pacote NetworkX, vol-
tado para a manipulao de grafos. Pr-requisitos:
Programao orientada a objetos.
7.1 Introduo
A teoria de grafos uma disciplina da matemtica cujo objeto de
estudo se presta, muito bem, a uma representao computacional
como um objeto. Matematicamente, um grafo denido por um
conjunto nito de vrtices (V ) e por um segundo conjunto (A) de
relaes entre estes vrtices, denominadas arestas. Grafos tem apli-
caes muito variadas, por exemplo: uma rvore genealgica um
grafo onde as pessoas so os vrtices e suas relaes de parentesco
so as arestas do grafo.
Um grafo pode ser denido de forma no ambgua, por sua lista
de arestas (A), que implica no conjunto de vrtices que compem
o grafo. Grafos podem ser descritos ou mensurados atravs de um
conjunto de propriedades:
169
170 CAPTULO 7. TEORIA DE GRAFOS
A ordem de um grafo corresponde ao seu nmero de vrtices;
1 >>> g = { ' a ' : [ ' c ' , ' d ' , ' e ' ] , ' b ' : [ ' d ' , ' e ' ] , ' c '
: [ 'a ' , 'd ' ] , 'd ' : [ 'b ' , ' c ' , 'a ' ] , ' e ' : [ 'a ' , 'b
' ]}
7.1. INTRODUO 171
Podemos utilizar o mtodo keys para obter uma lista dos vr-
tices de nosso grafo.
1 >>> g . k e y s ( )
2 [ 'a ' , 'c ' , 'b ' , 'e ' , 'd ' ]
7.2 NetworkX
O pacote NetworkX se presta criao, manipulao e estudo da
estrutura, dinmica e funes de redes complexas.
A criao de um objeto grafo a partir de seu conjunto de ares-
tas,A, muito simples. Seja um grafo G com vrtices V =
{W, X, Y, Z}:
[0 Y 0 ,0 X 0 ,0 Z 0 ,0 W 0 ][(0 Y 0 ,0 X 0 ), (0 Y 0 ,0 Z 0 ), (0 X 0 ,0 Z 0 ), (0 Z 0 ,0 W 0 )]
1 https://networkx.lanl.gov/
7.2. NETWORKX 173
Construindo Grafos
Manipulando Grafos
2 Uma cpia rasa signica que se cria um novo objeto grafo referenciando
o mesmo contedo. Ou seja, se algum vrtice ou aresta for alterado no grafo
original, a mudana se reete no novo grafo.
176 CAPTULO 7. TEORIA DE GRAFOS
cartesian_product(G1,G2) Produto cartesiano de dois grafos
(Figura 7.3).
4 import m a i l b o x
5 import n e t w o r k x a s NX
6 from p y l a b import show
7
8 def msgfactory ( fp ) :
9 try :
10 return e m a i l . m e s s a g e _ f r o m _ f i l e ( f p )
11 except e m a i l . E r r o r s . M e s s a g e P a r s e E r r o r :
12 return ' '
13
14 def s t a r G ( mess , G) :
15 try :
7.2. NETWORKX 181
16 c e n t r o = me s s . g e t ( ' f r o m ' ) . s p l i t ( )
[ 1]. s t r i p ( '<> ' )
17 pontas = [ j . s p l i t () [ 1]. s t r i p ( '<> ' )
for j in m es s . g e t _ a l l ( ' t o ' ) [ 0 ] .
split ( ' , ') ]
18 arestas = [ ( centro , k) for k in
pontas ]
19 G . add_edges_from ( a r e s t a s )
20 return G
21 except :
22 print ' f a l h o u '
23
24 d i r= ' /home/ f l a v i o / M a i l / i n b o x '
25 # V e j a documentacao do modulo mailbox
26 # p a r a outros tipo de mailboxes .
27 mbox = m a i l b o x . M a i l d i r ( d i r , msgfactory ) #
mailbox do kmail
28 G = NX. DiGraph ( )
29 for n in xrange (50) :
30 i = mbox . n e x t ( )
31 s t a r G ( i , G)
32 print G. n o d e s ( )
33 G = NX. c o n v e r t _ n o d e _ l a b e l s _ t o _ i n t e g e r s (G)
34 NX. draw (G, w i d t h =2 , s t y l e= ' d o t t e d ' , alpha
=0.5)
35 show ( )
7.3 Exerccios
1. Determine o conjunto de arestas A que maximiza o tamanho
do grafo cujos vrtices so dados por V = {a, b, c, d, e}.
185
186 CAPTULO 8. INTERAO COM BANCOS DE DADOS
padro nos apresenta o mdulo Pickle e cPickle e, a partir da verso
2.5, o banco de dados relacional sqlite3.
1 In [10]: class oi :
2 .10.: def d i g a o i ( s e l f , nome= ' f l a v i o ' ) :
3 .10.: print ' o i %s ! '%nome
4
5 In [ 1 1 ] : f = open ( ' p i c t e s t e ' , ' r ' )
8.2. O MDULO SQLITE3 187
6 In [ 1 2 ] : b=p i c k l e . l o a d ( f )
7 In [ 1 3 ] : b . digaoi ()
8 oi flavio !
3 In [ 7 ] : c . fetchall ()
4 [ ( ' tom ' , 12.5 , 2.2999999999999998) ]
2 http://www.sqlobject.org/
3 http://pt.wikipedia.org
8.3. O PACOTE SQLOBJECT 191
4 http://www.crummy.com/software/BeautifulSoup/
192 CAPTULO 8. INTERAO COM BANCOS DE DADOS
mos os.path.expanduser para substituir o por /home/usuario
como aconteceria no console unix normalmente.
Na linha 11 da listagem 8.3, vemos o comando que cria a cone-
xo a ser utilizada por todos os objetos criados neste mdulo.
Em seguida, passamos a especicar a tabela do nosso banco
de dados como se fora uma classe, na qual seus atributos so as
colunas da tabela.
16 class I d e i a ( SQLObject ) :
17 nome = U n i c o d e C o l ( )
18 nlinks = IntCol ()
19 links = PickleCol ()
20 ender = StringCol ( )
8.4 Exerccios
1. Modique a aranha apresentada neste captulo, para guardar
os documentos varridos.
Simulaes Estocsticas
Seleo de problemas relacionados com a simulao e
anlise de processos estocsticos. Pr-requisitos: Co-
nhecimentos avanados de estatstica.
199
200 CAPTULO 9. SIMULAES ESTOCSTICAS
ros aleatrios de forma convel. Felizmente, hoje em dia, pacotes
como o numpy ou o scipy, fornecem geradores de nmeros aleat-
rios de qualidade para muitas famlias de distribuies, de forma
que na maioria das vezes no precisamos nos preocupar com este
problema. Vez por outra, problemas de amostragem mais com-
plexos podem exigir geradores mais sosticados. Neste captulo
exploraremos algumas destas situaes.
1 #! / u s r / b i n / p y t h o n
2 # Disponivel no pacote de programas como :
202 CAPTULO 9. SIMULAES ESTOCSTICAS
l h s . py
3 from pylab import plot , f i g u r e , h i s t , show ,
savefig
4 import scipy . stats as stats
5 import numpy
6
7 def lhs ( dist , parms , n =100) :
8 p e r c = numpy . a r a n g e ( 0 , 1 . , 1 . / n )
9 smp = [ s t a t s . uniform ( i , 1 . / n ) . rvs ( ) for i
in perc ]
10 v = d i s t ( parms [ 0 ] , 1 . / parms [ 1 ] ) . p p f ( smp )
9.2. INFERNCIA BAYESIANA 203
11 return v
12
13 if __name__== '__main__ ' :
14 c=l h s ( s t a t s . norm , [0 ,1] ,20)
15 hist (c)
16 n = s t a t s . norm . r v s ( s i z e =20)
17 h i s t ( n . r a v e l ( ) , f a c e c o l o r= ' r ' , a l p h a =0.3)
18 s a v e f i g ( ' l h s . png ' , d p i =400)
19 show ( )
P (E F )
P (E | F ) =
P (F )
A partir desta frmula, podemos obter a verso mais simples
do teorema de Bayes.
P (F | E)P (E)
P (E | F ) =
P (F )
204 CAPTULO 9. SIMULAES ESTOCSTICAS
Se particionarmos o eventos E em n eventos, mutuamente ex-
cludentes, pelo teorema da probabilidade total, chegaremos ver-
so mais comumente utilizada da frmula de Bayes:
P (F | Ei )P (Ei )
P (Ei | F ) = Pn
i=1 P (F | Ei )P (Ei )
p()L(; x)
( | x) = R
L(; x)p()d
( | x) p()L(; x)
Logo, a densidade posterior de proporcional sua densidade
a priori multiplicada pela verossimilhana.
Conforme vimos acima, a inferncia Bayesiana pode ser bas-
tante intuitiva, conceitualmente. Na prtica, porm, quando que-
remos calcular a distribuio posterior dos parmetros, nos depa-
ramos com vrios problemas numricos de considervel diculdade.
Para encontrar a constante de proporcionalidade mencionada
na seo anterior, precisamos integrar o produto da distribuio
a priori dos parmetros pela verossimilhana, sobre o suporte de
. Se este suporte innito e/ou multidimensional, temos um
problema de integrao numrica complicadssimo.
Uma vez obtida a constante de proporcionalidade, se o espao
de parmetros multidimensional, encontrar as distribuies mar-
ginais para cada um deles, tambm um problema de integrao
numrica difcil.
n
= 1
X
J(y) f (y | xi )
n i=1
X U [a, b)
e
Y U [0, m)
Geramos x e y a partir destas distribuies e aceitamos x como
um valor de p(x) se y < f (x), caso contrario, rejeitamos a amostra
e tentamos novamente. Este procedimento signica que denimos
uma funo constante f (x) = m, que funciona como um envelope
para o nosso processo de amostragem.
Em suma, geramos um valor x a partir do suporte de X e
aceitamos este valor com uma probabilidade f (x)/m, caso contrrio
rejeitamos e tentamos novamente.
A ecincia deste mtodo depende da proporo de pontos
amostrados que so aceitos. A probabilidade de aceitao para
este mtodo :
P (aceitar) = P ((X, Y ) A)
Z b
1
= P ((X, Y ) A | X = x) dx
a ba
Z b
f (x) 1
= dx
a m b a
Z b
1
= f (x) dx
m(b a) a
1
=
m(b a)
208 CAPTULO 9. SIMULAES ESTOCSTICAS
Se a probabilidade de aceitao for muito baixa, devemos bus-
car um outro mtodo mais eciente. Especialmente para distribui-
es com suporte innito, a escolha de uma funo envelope mais
adequada, pode ajudar a aumentar a ecincia da amostragem.
Mtodo do Envelope
f (x) ag(x), x
ou seja, a um limite superior para f (x)/g(x).
Ento, amostramos Y = y deg(), e U = u U [0, ag(y)].
Aceitamos y como uma amostra de X se u < f (y)); caso contr-
rio, rejeitamos e tentamos novamente. Este mtodo funciona pois
distribui pontos uniformemente sobre a regio que envolve f (x), e
aceita apenas os pontos que cumprem o requisito de pertencer
regio delimitada por f (x).
Qual a probabilidade de aceitao?
Z
P (U < f (Y )) = P (U < f (Y ) | Y = y)g(y) dy
Z
f (y)
= g(y) dy
ag(y)
Z
f (y)
= dy
a
1
=
a
9.4. AMOSTRAGEM POR REJEIO 209
() = p()L(; x)
25 p1 = scatter (x , fx )
26 p2 = p l o t ( s o r t ( x ) , L )
27 l e g e n d ( [ p1 , p2 ] , [ ' P r i o r i ' , '
Verossimilhanca ' ] )
28 return s
29
30 def e f i c i e n c i a ( vector , n , data ) :
31 l = len ( vector )
32 prob = l / f l o a t (n)
33 diff = n l
34 n2 = i n t ( d i f f / p r o b )
35 v e c 2 = a m o s t r a ( n2 , d a t a , p l o t t e d =1)
36 s = concatenate ( ( vector , vec2 ) )
37 return s , prob
38
39 def main ( ) :
40 n =90000
41 data = uniform ( 0 , 1 , 3 )
42 s a m p l e=a m o s t r a ( n , data )
43 s , prob = e f i c i e n c i a ( sample , n , data )
44 f i g u r e ( 2 ) #g e r a histograma
45 hist (s , b i n s =50 , normed =1)
46 xlabel ( 'x ' )
47 t e x t ( 0 . 8 , 1 . 2 , ' E f i c i e n c i a :% s '%r o u n d ( pro b
,2) )
48 ylabel ( ' frequencia ' )
49 t i t l e ( ' Posterior : n=%s '% n )
50 s a v e f i g ( ' r e j e i c a o . png ' , d p i =400)
51 show ( )
52 return s
53
54 if __name__ == '__main__ ' :
55 main ( )
214 CAPTULO 9. SIMULAES ESTOCSTICAS
Zt = Zt1 + t , t N (0, 2 )
1 # c o d i n g : l a t i n 1
2 # Disponivel no pacote de programas como :
markov . py
3 #g e r a n d o uma c a d e i a de markov
4 from numpy . random import
5 import random a s r n
6 from p y l a b import
7
8 n =10000
9 a l p h a =0.99
10 x=z e r o s ( 1 0 0 0 0 , Float )
11 for i in xrange ( 1 , n ) :
12 x [ i ]= a l p h a x [ i 1] + exponential (1 ,1) [ 0 ]
13 # p l o t t i n g
14 subplot (211)
15 t i t l e ( ' Processo de Markov ' )
16 plot (x)
17 xlabel (u ' Iteraes ' )
18 ylabel ( 'x ' )
19 subplot (212)
216 CAPTULO 9. SIMULAES ESTOCSTICAS
20 h i s t ( x , b i n s =50)
21 xlabel ( 'x ' )
22 ylabel (u ' frequncia ' )
23 s a v e f i g ( ' markov . png ' , d p i =400)
24 show ( )
O Amostrador de Metropolis-Hastings
1 # e n c o d i n g : l a t i n 1
2 # Disponivel no pacote de programas como : MH
. py
3 from numpy import
4 from scipy . stats import
5
6 class A m o s t r a d o r :
7 def __init__ ( s e l f , alvo , proposta ) :
8 """
9 Incializa o amostrador
10 alvo : dados definindo densidade alvo
11 proposta : objeto gerador de
propostas .
12 """
13 s e l f . a l v o = kde . g a u s s i a n _ k d e ( a l v o )
14 s e l f . prop = p r o p o s t a
15
16 def Run ( s e l f , n , b u r n i n =100) :
17 ' ' '
18 Roda o amostrador por n passos
19 ' ' '
20 amostra = z e r o s ( n , f l o a t )
21 alvo = s e l f . alvo
22 i = 0
23 while i < n 1:
24 x = amostra [ i ]
25 inova = s e l f . prop . r v s ( ) [ 0 ]
26 can = x + i n o v a
9.6. MCMC (MARKOV CHAIN MONTE CARLO) 219
27 a p r o b = min ( [ 1 , a l v o . e v a l u a t e ( c a n
) / alvo . evaluate (x) ] )
28 u = uniform . rvs ( ) [ 0 ]
29 if u < aprob :
30 a m o s t r a [ i +1] = x = c a n
31 i += 1
32 return amostra [ burnin : ]
33
34 if __name__=="__main__" :
35 import pylab as P
36 d a d o s = c o n c a t e n a t e ( ( norm . r v s ( s i z e =500) ,
norm . r v s ( 4 , 1 , s i z e =500) ) )
37 a = A m o s t r a d o r ( d a d o s , norm ( 0 , 1 ) )
38 r e s = a . Run ( 1 0 0 0 0 )
39 P. p l o t ( arange ( 5 ,10 ,.01) , a . alvo . evaluate
( arange ( 5 , 1 0 , . 0 1 ) ) , ' r ' , lw =2)
40 P . h i s t ( r e s , normed =1 , a l p h a = 0 . 5 )
41 P . l e g e n d ( [ ' A l v o ' , ' Amostra ' ] )
42 P . s a v e f i g ( 'MH. png ' , d p i =400)
43 P . show ( )
3 Estas classes podem ser chamadas diretamente com seus parmetros como
mostrado na linha 36 da listagem 9.6, retornando um objeto frozen com os
220 CAPTULO 9. SIMULAES ESTOCSTICAS
do amostrador aps a remoo de um nmero de amostras do in-
cio da cadeia determinado pelo parmetro burnin. Esta remoo
importante, pois a cadeia leva algum tempo para convergir para
a rea sob a curva alvo.
O Amostrador de Gibbs
41 s = Amostra ( n , v a r l i s t , l o c , s c a l e , c o r m a t )
42 r e s = s . Run ( )
43 s 1=P . p l o t ( r e s [ 0 ] , r e s [ 2 ] , ' . ' )#m a r k e r = 'p ' ,
c = ' y ' , mec= ' k ' , l w =0)
44 s 2=P . p l o t ( r e s [ 1 ] , r e s [ 2 ] , '+ ' )#m a r k e r = ' v ' ,
c = ' y ' , mec= ' k ' , l w =0)
45 P . l e g e n d ( [ ' Beta x Normal ' , 'Gamma x
Normal ' ] )
46 P . s a v e f i g ( ' g i b b s . png ' , d p i =400)
47 P . show ( )
p(xk | y0 , y1 , . . . , yk )
p(x + 0, x1 , . . . , xk | y0 , y1 , . . . , yk )
224 CAPTULO 9. SIMULAES ESTOCSTICAS
1 # e n c o d i n g : l a t i n 1
2 # Disponivel no pacote de programas como :
s i r . py
226 CAPTULO 9. SIMULAES ESTOCSTICAS
3 from numpy import
4 import l i k e
5 import p y l a b a s P
6 from s c i p y . s t a t s import
7
8 class SMC:
9 """
10 Monte Carlo Sequencial usando SIR
11 """
12 def __init__ ( s e l f , p r i o r t y p e , pars , range
, r e s o l u t i o n =512) :
13 ' ' '
14 Inicializa Filtro .
15 priortype deve ser um RNG d e scipy .
stats
16 pars so os parmetros da priori .
17 ' ' '
18 self . priori = priortype
19 s e l f . pars = pars
20 s e l f . range = range
21 s e l f . r e s = ( range [1] range [ 0 ] ) 1./
resolution
22 self . likelihood = None
23 s e l f . p o s t e r i o r=a r r a y ( [ ] )
24
25 def __call__ ( s e l f , datum ) :
26 sc = s e l f . pars [ 1 ]
27 m = s e l f . range [ 0 ]
28 M = s e l f . range [ 1 ]
29 step = s e l f . res
30 s u p = a r a n g e (m,M, s t e p )
31 lik = e x p ( a r r a y ( [ l i k e . Normal ( datum , i
, sc ) for i in sup ] ) )
32 self . likelihood = l i k /sum ( l i k )
9.7. MTODOS MONTE CARLO SEQUENCIAIS 227
Varivel Discreta
Seja um espao de parmetros. Seja {p ; } uma famla pa-
rametrizada de modelos probabilsticos para um vetor de variveis
discretas X = (X1 , . . . , Xn ). A funo de verossimilhana para
(x1 , . . . , xn ) dada por:
L( | x1 , . . . , xn ) , p (x1 , . . . , xn )
e uma funo de .
A funo de verossimilhana nos d a probabilidade de que
(X1 , . . . , Xn ) = (x1 , . . . , xn ), ou seja um determinado conjunto de
230 CAPTULO 9. SIMULAES ESTOCSTICAS
dados ser amostrado em uma realizao do processo gerador, para
cada valor possvel de . Matematicamente, a funo de verossimi-
lhana apenas uma notao diferente para a funo de probabili-
dade. Contudo, conceitualmente existe uma distino importante:
Quando se estuda a funo de probabilidade, xa-se o parmetro e
obtm-se a variao da probabilidade em funo do valor da vari-
vel, x. Quando estudamos a verossimilhana, consideramos o valor
de x xo e variamos o parmetro, obtendo a verossimilhana de
cada valor. Para uma nica observao de uma varivel discreta,
a verossimilhana igual probabilidade de se observar aquele
valor. Por exemplo: Seja Pp uma distribuio Bernoulli com par-
metro p, 0 < p < 1. Uma varivel aleatria com uma distribuio
Bernoulli, s pode assumir dois valores, 0 e 1.
Para x = 0,
L(p | 0) = 1 p
Para x = 1,
L(p | 1) = p
Um pouco de lgebra, nos permite combinar ambas as frmulas
acima escrevendo:
1 # c o d i n g : l a t i n 1
2 # Disponivel no pacote de programas como :
l i k 1 . py
3 from pylab import
4 a ="ATTAGCCCTTGGGAACATCCC"
5 b ="ATGAGCTCTTGGTTAAGACCC"
6 n = len (a)
7 # Comparando as sequncias :
8 comp = [ i n t ( a [ i ]==b [ i ] ) for i in range ( len ( a
)) ]
9 # Contando nmero d e correspondncias
10 soma = sum ( a r r a y ( comp ) )
11 # C a l c u l a n d o L
12 L = [ p soma (1 p ) ( nsoma ) for p in arange
(0 ,1 ,.01) ]
13 p l o t ( arange ( 0 , 1 , . 0 1 ) , L)
14 s a v e f i g ( ' l i k 1 . png ' , d p i =400)
15 show ( )
232 CAPTULO 9. SIMULAES ESTOCSTICAS
A gura 9.10 mostra a funo de verossimilhana gerada pela
listagem 9.10. Mais adiante usaremos este resultado em outro
exemplo.
Analisando o cdigo da listagem 9.10, utilizamos a tcnica de
list comprehension para comparar as duas sequncias locus a locus
retornando 1 quando fossem iguais e 0, caso contrrio. Como a
comparao retorna verdadeiro (True) ou falso (False), aplicamos
a funo int para transformar estas sadas em 1 e 0, respectiva-
mente. Na linha 9, convertemos a lista de resultados da comparao
em vetor para poder somar os seus elementos com sum. Na linha
11, usamos tcnica similar da linha 7 para calcular a funo de
verossimilhana.
Varivel Contnua
A funo de verossimilhana para variveis aleatrias contnuas
similar ao caso discreto apresentado acima. Para uma varivel con-
tnua, substitumos a funo de probabilidade da denio discreta
pela funo de densidade de probabilidade. Se g (x1 , . . . , xn ),
, representa uma famlia de funes de densidade de probabili-
dade conjuntas para (X1 , . . . , Xn ), ento
n
Y
L( | x1 , . . . , xn ) = f (xi )
i=1
Log-verossimilhana
Na funo de verossimilhana, o termo que no depende de , de-
pende de n (o tamanho amostral), com isso o valor da verossimi-
4
lhana facilmente torna-se extremo . Devido a esta caracterstica
da funo de verossimilhana, frequentemente utiliza-se o seu loga-
ritmo. Vamos plotar a log-verossimilhana calculada na listagem
5
9.10.
1 MLE = c o m p r e s s ( e q u a l ( L , max ( L ) ) , a r a n g e
(0 ,1 ,.01) )
2 print MLE
3 [ 0.67]
1 >>> # D i s t r i b u i o de probabilidades d e um
dado cbico
2 >>> dado =
{1:1/6. ,2:1/6. ,3:1/6. ,4:1/6. ,5:1/6. ,6:1/6.}
29 s e l f . p o s t e r i o r=a r r a y ( [ ] )
30
31 def _ f l a v o r i z e ( s e l f , pt , ptbase ) :
32 ' ' '
33 add methods from distribution type
34 ' ' '
35 s e l f . c d f = pt . c d f
36 self . isf = pt . i s f
37 if i s i n s t a n c e ( ptbase , rv_continuous ) :
38 s e l f . pdf = pt . pdf
39 elif i s i n s t a n c e ( ptbase , r v _ d i s c r e t e ) :
40 s e l f . p d f = p t . pmf
41 else : sys . exit ( ' Invalid distribution
object ' )
100 return []
101
102 def _ Li k e li h oo d ( s e l f , typ ) :
103 ' ' '
104 Define familia paramtrica da
verossimilhana .
105 Retorna funo de verossimilhana .
106 typ deve ser uma string .
107 ' ' '
108 if t y p == ' norm ' :
109 return lambda ( x ) : l i k e . Normal ( x
[0] ,x[1] ,1./x[2])
110 elif t y p == ' expon ' :
111 return lambda ( x ) : ( 1 . / x [ 2 ] ) x
[0]. size e x p ( ( 1 . / x [ 2 ] ) sum (
x[0]) )
42 s e l f . ppf = pt . ppf
43 s e l f . r v s = pt . r v s
44 def _update ( s e l f ) :
240 CAPTULO 9. SIMULAES ESTOCSTICAS
45 """
46 Calculate likelihood function
47 """
48 if s e l f . data :
49 d = s e l f . data [ 1]
50 sc = s e l f . pars [ 1 ]
51 m = s e l f . range [ 0 ]
52 M = s e l f . range [ 1 ]
53 step = s e l f . res
54 #s e l f . l i k e f u n returns log
likelihood
55 lik = exp ( a r r a y ( [ s e l f . l i k e f u n ( ( d
, i , sc ) ) for i in a r a n g e (m,M,
step ) ] ) )
56 self . likelihood = l i k /sum ( l i k )
57
58 def addData ( s e l f , data = []) :
59 """
60 Adds dataset to variable ' s data
store
61 """
74 """
75 return s e l f . pdf ( arange ( s e l f . range
[ 0 ] , s e l f . range [ 1 ] , s e l f . r e s ) )
76 def getPosteriorSample ( s e l f , n) :
77 """
78 Return a sample of the posterior
distribution .
79 """
80 if s e l f . p o s t e r i o r . any ( ) :# Use last
posterior as prior
81 k= k d e . g a u s i a n _ k d e ( s e l f .
posterior )
82 s= k . r e s a m p l e ( n )
83 else :
84 s = s e l f . getPriorSample (n)
85 if s e l f . data :
242 CAPTULO 9. SIMULAES ESTOCSTICAS
86 m = s e l f . range [ 0 ]
87 M = s e l f . range [ 1 ]
88 step = s e l f . res
89 s u p p = a r a n g e (m,M, s t e p )#s u p p o r t
90 s = c o m p r e s s ( l e s s ( s . r a v e l ( ) ,M) &
g r e a t e r ( s . r a v e l ( ) ,m) , s )#
removing o u t o f r a n g e
samples
91 d = u n i f o r m . r v s ( l o c =0 , s c a l e =1 ,
s i z e =l e n ( s ) )#U n i f o r m 0 1
samples
92 w = s e l f . p d f ( supp ) s e l f .
likelihood
93 w = w/sum (w) #n o r m a l i z i n g
weights
94 s x = s e a r c h s o r t e d ( supp , s )
95 w = w [ s x 1]# s e a r c h sorted
returns 1 b a s e d binlist
96 p o s t = c o m p r e s s ( d<w , s )
97 s e l f . p o s t e r i o r = post
98 return post
114
115 if __name__=="__main__" :
116 bv = BayesVar ( norm , ( 3 , 1 ) , r a n g e = ( 0 , 5 ) )
117 data = ones ( 2 0 )
118 bv . addData ( d a t a )
119 p = bv . g e t P o s t e r i o r S a m p l e ( 2 0 0 0 0 0 )
120 P . p l o t ( a r a n g e ( bv . r a n g e [ 0 ] , bv . r a n g e [ 1 ] ,
bv . r e s ) , bv . l i k e l i h o o d , ' ro ' , l w =2)
121 P . p l o t ( a r a n g e ( bv . r a n g e [ 0 ] , bv . r a n g e [ 1 ] ,
bv . r e s ) , bv . g e t P r i o r D i s t ( ) , ' g+ ' , l w =2)
122 P. hist (p , normed =1)
123 P. legend ( [ ' Likelihood ' , ' Prior ' ] )
1 # e n c o d i n g : l a t i n 1
2 # Disponivel no pacote de programas como :
B a y e s . py
3 # copyright 2007 Flavio Codeco Coelho
4 # Licensed u n d e r GPL v3
5 from numpy import
6 import l i k e , s y s
7 import p y l a b a s P
8 from s c i p y . s t a t s import
9
10 class BayesVar :
11 """
12 Bayesian random variate .
13 """
14 def __init__ ( s e l f , p r i o r t y p e , pars , range
, r e s o l u t i o n =512) :
15 ' ' '
16 Inicializa varivel aleatria .
17 Adquire mtodos da classe priortype
.
18 priortype deve ser um RNG d e scipy .
stats
19 pars so os parmetros da priori .
20 ' ' '
21 s e l f . p r i o r n = p r i o r t y p e . name
22 s e l f . _ f l a v o r i z e ( p r i o r t y p e ( pars ) ,
priortype )
23 s e l f . pars = pars
24 s e l f . range = range
25 s e l f . r e s = ( range [1] range [ 0 ] ) 1./
resolution
9.9. INFERNCIA BAYESIANA COM OBJETOS. 245
83 else :
84 s = s e l f . getPriorSample (n)
85 if s e l f . data :
86 m = s e l f . range [ 0 ]
87 M = s e l f . range [ 1 ]
88 step = s e l f . res
89 s u p p = a r a n g e (m,M, s t e p )#s u p p o r t
90 s = c o m p r e s s ( l e s s ( s . r a v e l ( ) ,M) &
g r e a t e r ( s . r a v e l ( ) ,m) , s )#
removing o u t o f r a n g e
samples
91 d = u n i f o r m . r v s ( l o c =0 , s c a l e =1 ,
s i z e =l e n ( s ) )#U n i f o r m 0 1
samples
92 w = s e l f . p d f ( supp ) s e l f .
likelihood
93 w = w/sum (w) #n o r m a l i z i n g
weights
94 s x = s e a r c h s o r t e d ( supp , s )
95 w = w [ s x 1]#s e a r c h sorted
returns 1 b a s e d binlist
96 p o s t = c o m p r e s s ( d<w , s )
97 s e l f . p o s t e r i o r = post
98 return post
99 else :
100 return []
101
102 def _ Li k e li h oo d ( s e l f , typ ) :
103 ' ' '
104 Define familia paramtrica da
verossimilhana .
105 Retorna funo de verossimilhana .
106 typ deve ser uma string .
107 ' ' '
248 CAPTULO 9. SIMULAES ESTOCSTICAS
108 if t y p == ' norm ' :
109 return lambda ( x ) : l i k e . Normal ( x
[0] ,x[1] ,1./x[2])
110 elif t y p == ' expon ' :
111 return lambda ( x ) : ( 1 . / x [ 2 ] ) x
[0]. size e x p ( ( 1 . / x [ 2 ] ) sum (
x[0]) )
112 elif t y p == ' beta ' :
113 return lambda ( x ) : l i k e . B e t a ( x
[0] ,x[1] ,x[2])
114
115 if __name__=="__main__" :
116 bv = BayesVar ( norm , ( 3 , 1 ) , r a n g e = ( 0 , 5 ) )
117 data = ones ( 2 0 )
118 bv . addData ( d a t a )
119 p = bv . g e t P o s t e r i o r S a m p l e ( 2 0 0 0 0 0 )
120 P . p l o t ( a r a n g e ( bv . r a n g e [ 0 ] , bv . r a n g e [ 1 ] ,
bv . r e s ) , bv . l i k e l i h o o d , ' ro ' , l w =2)
121 P . p l o t ( a r a n g e ( bv . r a n g e [ 0 ] , bv . r a n g e [ 1 ] ,
bv . r e s ) , bv . g e t P r i o r D i s t ( ) , ' g+ ' , l w =2)
122 P. hist (p , normed =1)
123 P. legend ( [ ' Likelihood ' , ' Prior ' ] )
124 P. t i t l e ( ' Bayesian inference ' )
125 P . s a v e f i g ( ' b a y e s v a r . png ' , d p i =400)
126 P . show ( )
9.10 Exerccios
1. Compare a acurcia do amostrador de Metropolis-Hastings
com o amostrador oferecido pelo mtodo resample do objeto
retornado por gaussian kde. Teste com diferentes formas de
distribuio. O mtodo resample uma mera amostragem
com reposio.
9.10. EXERCCIOS 249
251
Introduo ao Console
Gnu/Linux
Guia de sobrevivncia no console do Gnu/Linux
253
Console Gnu/Linux
A linguagem BASH
A primeira coisa que se deve entender antes de comear a estudar
o shell do Linux, que este uma linguagem de programao bas-
tante poderosa em si mesmo. O termo Shell, cpsula, traduzido
literalmente, se refere sua funo como uma interface entre o
usurio e o sistema operacional. A shell nos oferece uma interface
textual para invocarmos aplicativos e lidarmos com suas entradas
e sadas. A segunda coisa que se deve entender que a shell no o
sistema operacional, mas um aplicativo que nos facilita a interao
com o SO.
O Shell no depende de interfaces grcas sosticadas, mas co-
mumente utilizado atravs de uma janela, do conforto de uma
interface grca. Na gura 1, vemos um exemplo de uma sesso
do bash rodando em uma janela.
254
A linguagem BASH
255
Console Gnu/Linux
256
Entradas e Sadas, redirecionamento e "Pipes".
257
Console Gnu/Linux
Redirecionamento
Pipelines
258
Prolas Cientcas do Console Gnu/Linux
Gnu plotutils
259
Console Gnu/Linux
Aplicativos Matemticos:
ode Integra numericamente sistemas de equaes diferenciais or-
dinrias (EDO);
graph
A cada vez que chamamos o programa graph, ele l um ou mais
conjuntos de dados a partir de arquivos especicados na linha de
comando, ou diretamente da STDIN, e produz um grco. O grco
pode ser mostrado em uma janela, ou salvo em um arquivo em
qualquer dos formatos suportados.
260
Prolas Cientcas do Console Gnu/Linux
1 $ echo .1 .1 .1 .9 .9 .9 .9 .1 .1 .1 | graph
T X C m 1 q 0.3
spline
O programa funciona de forma similar ao graph no que diz res-
peito entradas e sadas. Como todos os aplicativos de console,
benecia-se muito da interao com outros programas via pipes.
1 echo 0 0 1 0 1 1 0 1 | spline d 2 a s |
graph T X
261
Console Gnu/Linux
262
Prolas Cientcas do Console Gnu/Linux
263
Console Gnu/Linux
ode
O utilitrio ode capaz de produzir uma soluo numrica de sis-
temas de equaes diferenciais ordinrias. A sada de ode pode
ser redirecionada para o utilitrio graph, que j discutimos anteri-
ormente, de forma que as solues sejam plotadas diretamente,
medida em que so calculadas.
Vejamos um exemplo simples:
dy
= y(t) (3)
dt
A soluo desta equao :
y(t) = et (4)
1 $ ode
2 y '= y
3 y=1
4 print t ,y
5 step 0 ,1
264
Prolas Cientcas do Console Gnu/Linux
265
Console Gnu/Linux
266
ndice Remissivo
267
ndice Remissivo
mdulo
R, xix
numpy.linalg, 46
return, 37
scipy, 46
Mdulos scipy, 46
BeautifulSoup, 190 Scite, 81
email, 181 Shedskin, 111
mailbox, 182 sqlite, 187
threading, 178 SQLObject, 190
mdulos, 41 strings, 22
numpy, 45 formatando, 23
Mathematica, xix
Matlab, xix try, 32
268
tuplas, 19
unidades, 155
unum, 159
urllib, 193
urllib2, 193
uso interativo, 5
verossimilhana, 228
weave, 100
web-spider, 190
while, 29
zip, 31
269
Colophon
Este livro foi formatado usando
LAT X, criado por Leslie
E
Lamport e a classe memoir. O
corpo do texto utiliza fontes de
tamanho 10 Modern Roman,
criadas por Donald Knuth.
Outras fontes incluem Sans,
Smallcaps, Italic, Slanted and
Typewriter, todas da famlia
Computer Modern desenvolvida
por Knuth.