Computação 2
Aula 11 Teóricaprofessor: Leonardo Carvalho
SciPy2
SciPy
3
Conjunto de algoritmos matemáticos usados com frequência por cientistas e engenheiros.
Alguns submódulos:
cluster: algoritmos de clusterização fftpack: cálculo de transformada de Fourierintegrate: integração e soluções de EDOsinterpolate: interpolaçãolinalg: álgebra linearndimage: processamento de imagensoptimize: otimização e cálculo de raizessignal: processamento de sinais
SciPy - integrate
4
import scipy.integrate as integrate
def f(x):
return 6*x**2-4*x-2
res, err = integrate.quad(f, 0, 5)
print res, err
190.0 2.15410824244e-12
SciPy - integrate
5
import scipy.integrate as integrate
def f(x, y):
return x*y
def low(y):
return 0
def high(y):
return 1-2*y
res, err = integrate.dblquad(f, 0.0, 0.5, low, high)
print 1.0/96, res, err
0.0104166666667 0.0104166666667 1.15648231732e-16
SciPy - optimize
6
import scipy.optimize as optimize
from numpy import sin, cos
def f(x):
return x*sin(x*2)*cos(3*x**2)
print optimize.bisect(f, 1, 1.5)
1.25331413732
SciPy - interpolate
7
from scipy.interpolate import interp1d
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 5)
y = np.array([3, -2, 1, 0, 2])
f1 = interp1d(x, y)
f2 = interp1d(x, y, kind='cubic')
...
SciPy - interpolate
8
...
xx = np.linspace(0, 10, 2000)
y1 = f1(xx)
y2 = f2(xx)
plt.xlim(-1, 11)
plt.ylim(-3, 4)
plt.plot(x, y, 'o')
plt.plot(xx, y1, '-')
plt.plot(xx, y2, '--')
plt.show()
SciPy - interpolate
9
SciPy - linalg
Tudo que tem no numpy.linalg e mais um pouco!import numpy as np
from scipy import linalg
A = np.matrix([ [4, 3, 2], [7, 2, 5], [8, 0, -1], [9, 7, -3] ])
b = np.matrix([ [2], [1], [0], [4] ])
x, resid, rank, sing_val = linalg.lstsq(A, b)
print x
print resid
print rank
print sing_val
10
11
Problema
Sistemas para resolver problemas complexos podem possuir milhares de linhas de código, com muitas classes e funções.
Suponha que precisamos adicionar uma nova funcionalidade a um código existente, ou aperfeiçoar a implementação.
Como ter certeza de que essa funcionalidade não vai "quebrar" o código?
Ou seja, gostaríamos de manter o que funcionava antes funcionando depois.
12
Testes automáticos
13
Testes automáticos
Podemos utilizar ferramentas que realizam testes automaticamente em busca de falhas no código.
Exemplos:
doctest, unittest, py.test, nose, tox
14
doctest
Testes são definidos em docstrings, veja exemplo:
import doctestdef funcao(x, y):
''' Faz uma coisa muito louca.>>> funcao(3, 10)108>>> funcao(8, 23)1232'''s = 0for i in range(1, 100):
if x%i==0 or y%i == 2:s += x*y - x
return s
if __name__ == '__main__':doctest.testmod()
15
doctest
Saída do programa:
16
doctest
O programa só gera saída se for encontrado algum erro!
17
doctest
Testes são definidos em docstrings, veja exemplo:
import doctestdef funcao(x, y):
''' Faz uma coisa muito louca.>>> funcao(3, 10)1080>>> funcao(8, 23)1232'''s = 0for i in range(1, 100):
if x%i==0 or y%i == 2:s += x*y - x
return s
if __name__ == '__main__':doctest.testmod()
18
doctest
Saída do programa:
**********************************************************************File "aula.py", line 5, in __main__.funcaoFailed example: funcao(3, 10)Expected: 1080Got: 108**********************************************************************1 items had failures: 1 of 2 in __main__.funcao***Test Failed*** 1 failures.
19
doctest
import doctest
...
def fatorial(n):''' Calcula o fatorial de n>>> fatorial(5)120>>> fatorial(0)1>>> fatorial(2)2'''if n <= 1: return nelse: return n*fatorial(n-1)
if __name__ == '__main__':doctest.testmod() 20
doctest
Saída do programa:
**********************************************************************File "aula.py", line 20, in __main__.fatorialFailed example: fatorial(0)Expected: 1Got: 0**********************************************************************1 items had failures: 1 of 3 in __main__.fatorial***Test Failed*** 1 failures.
21
doctest
import doctest
...
def fatorial(n):''' Calcula o fatorial de n>>> fatorial(5)120>>> fatorial(0)1>>> fatorial(2)2'''if n <= 1: return 1else: return n*fatorial(n-1)
if __name__ == '__main__':doctest.testmod() 22
doctest - testfile
Os testes não precisam estar na documentação das funções. Você pode criar um arquivo contendo todos os testes que desejar:
Exemplo, arquivo sobre.txt:
Sobre o módulo aula.
Importe o módulo fazendo:>>> from aula import *
Este módulo contém uma função chamada fatorial, que calcula o fatorial de um número (dããã).Exemplo:
>>> fatorial(5)120>>> fatorial(0)1>>> fatorial(2)2
23
doctest - testfile
Programa para executar os testes:
import doctest
if __name__ == '__main__': doctest.testfile('sobre.txt')
24
E se...
Se quisermos testar a função fatorial para todos os valores entre 0 e 50?
Colocar tudo na documentação é muito feio...
25
unittest
Podemos criar objetos cujo único objetivo é fazer testes de código.
import unittest
from aula import fatorial
class Testador(unittest.TestCase):def test_fatorial(self):
self.assertEqual(fatorial(0), 1)self.assertEqual(fatorial(1), 1)self.assertEqual(fatorial(2), 2)self.assertEqual(fatorial(5), 120)
if __name__ == '__main__': unittest.main()
26
unittest
Saída do programa:
.----------------------------------------------------------------------Ran 1 test in 0.000s
OK
27
unittest
Saída do programa (caso o programa esteja errado):
F======================================================================FAIL: test_fatorial (__main__.Testador)----------------------------------------------------------------------Traceback (most recent call last): File "tutu.py", line 7, in test_fatorial self.assertEqual(fatorial(0), 1)AssertionError: 0 != 1
----------------------------------------------------------------------Ran 1 test in 0.000s
FAILED (failures=1)
28
unittest
Aperfeiçoando nosso teste:
import unittestimport math
from aula import fatorial
class Testador(unittest.TestCase):def test_fatorial(self):
for i in range(0, 51):self.assertEqual(fatorial(i), math.factorial(i))
if __name__ == '__main__': unittest.main()
29
unittest
Adicionando ao programa aula.py:
def primo(n):'''Retorna True se n eh primo.'''if n in (0, 1):
return False
for i in range(2, n):if n%i == 0:
return False
return True
30
unittest
Outros tipos de teste possíveis no unittest:
import unittestimport math
from aula import *
class Testador(unittest.TestCase):...def test_primo(self):
'''Testa funcao primo.'''self.assertTrue(primo(13))self.assertFalse(primo(0))self.assertFalse(primo(4), msg='Quatro não é primo')
if __name__ == '__main__': unittest.main()
31
unittest
Saída do programa:..----------------------------------------------------------------------Ran 2 tests in 0.001s
OK
32
unittest
Outros possíveis assert*
# Verifica se a é diferente de bself.assertNotEqual(a, b)
# Verifica se primo('batata') vai gerar um TypeErrorself.assertRaises(TypeError, primo, 'batata')
# Verifica se valor pertence a Lself.assertIn(valor, L)
# Verifica se a>bself.assertGreater(a, b)
33
34
Trabalho35
Trabalho
36
Individual, em dupla, ou em trio
Prazo de entrega: 2 de março
Objetivo: criar um programa em Python para resolver algum problema mais complexo do que os que fizemos em aula
O programa deve ter:
- Interface gráfica (tkinter)- Classes- Tratamento de exceções- arquivos- numpy
37
Provas38
Datas das próximas provas
39
Previsão de datas:
P2: 24/02
P3: 09/03
Top Related