M ´etodos Computacionais em F´ısica I
Jos ´e Helder Lopes
Instituto de F´ısica
Universidade Federal do Rio de Janeiro
Aula Remota Semestre Especial 2020-2
baseado nas aulas remotas da Profa. Sandra Amato para o
Matplotlib
Ü Gr ´aficos e animac¸ ˜oes s ˜ao ferramentas extremamente ´uteis
Ü Existem v ´arios pacotes de visualizac¸ ˜ao para o Python
Ü Usaremos neste curso o pacote mais b ´asico - Matplotlib
Ü Detalhes podem ser encontradosaqui (site oficial) Ü e nesselink: Problem Solving with Python (mais did ´atico)
Ü Criado pelo neurologista John D. Hunter no in´ıcio dos anos 2000.
Gr ´aficos
Ü Suponha que queiramos fazer o gr ´afico da func¸ ˜ao f (x ) no intervalo a ≤ x ≤ b
Ü Os passos computacionais s ˜ao:
m criar uma lista (numpy.array) com os n valores de xi, em geral, igualmente espac¸ados de δx
xi =a + iδx , com δx = b − a n − 1 m calculamos os valores de yi =f (xi)para cada ponto i m colocamos esses pontos em um gr ´afico e ligamos os pontos
Ü J ´a trabalhamos com a classe array do pacote num ´erico NumPy
Ü V ´arias func¸ ˜oes do matplotlib utilizam func¸ ˜oes da NumPy
Gr ´aficos no Matplotlib
ÜEx: Gr ´afico da func¸ ˜ao y = sin(x ) para x entre 0 e 4π espac¸ados de 0.1: >>> import numpy as np >>> import matplotlib.pyplot as plt >>> #np.arange(start,stop,step) >>> x = np.arange(0, 4 * np.pi, 0.1) >>> y = np.sin(x) >>> plt.plot(x, y) >>> plt.show()
Coloque esses comandos em um arquivo chamado plotSin.py e execute-o
Embelezando
Embelezando
import numpy as np import matplotlib.pyplot as plt #np.arange(start,stop,step) x = np.arange(0, 4 * np.pi, 0.1) y = np.sin(x)plt.plot(x, y, ’ro’) # r de red; o ´e um c´ırculo plt.xlabel(’angulo (0 a 4 pi)’)
plt.ylabel(’seno(x)’)
plt.title(’Grafico de seno(x)’)
plt.savefig(’seno1.png’) # deve vir antes de plt.show() plt.show()
Propriedades de Linhas
Argumentos que podem ser passados juntamente com a func¸ ˜ao plot
para controlar propriedades de linhas
Propriedade
Valores
alpha
transpar ˆencia (0–1)
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 s´ımbolo
markeredgecolor
Cor da margem do s´ımbolo
markerfacecolor
Cor do s´ımbolo
markersize
Tamanho do s´ımbolo (pontos)
x = np.arange(0, 4 * np.pi, 0.1) y = np.sin(x)
plt.plot(x, y, linewidth=2.0, linestyle=’--’,
color=’r’, marker=’o’, markersize=5, markeredgecolor=’b’, markerfacecolor=’g’, alpha=0.5) plt.xlabel(’angulo (0 a 4 pi)’) plt.ylabel(’seno(x)’) plt.title(’Grafico de seno(x)’) plt.grid(True) plt.xticks(
np.arange(0, 4*np.pi + np.pi/2, np.pi/2), [’0’,’pi/2’,’pi’,’3pi/2’,’2pi’,’5pi/2’, ’3pi’,’7pi/2’,’4pi’])
plt.yticks()
plt.savefig(’seno.png’) # deve vir antes de plt.show() plt.show()
Ex. de Duas Curvas no mesmo gr ´afico e aproveitando pra definir a func¸ ˜ao com def import numpy as np import matplotlib.pyplot as plt def f1(t): return t**2*np.exp(-t**2) def f2(t): return t**2*f1(t) t = np.linspace(0, 3, 51) y1 = f1(t) y2 = f2(t) plt.plot(t, y1, ’r-’) plt.plot(t, y2, ’bo’) plt.xlabel(’t [s]’) plt.ylabel(’y [m]’) plt.legend([’tˆ2*exp(-tˆ2)’,\ ’tˆ4*exp(-tˆ2)’]) plt.title(’Duas curvas’) plt.savefig(’duasCurvas.pdf’) plt.show() 0.0 0.5 1.0 1.5 2.0 2.5 3.0 t [s] 0.0 0.1 0.2 0.3 0.4 0.5 y [m] Duas curvas t^2*exp(-t^2) t^4*exp(-t^2)
Gr ´afico de pontos com incertezas
Crie o arquivo plotPontos.py com os seguintes comandos import matplotlib.pyplot as plt
x = [0, 2, 4, 6] y = [1, 3, 4, 8]
plt.errorbar(x, y, yerr=0.2) #... e com incertezas plt.xlabel(’x’)
plt.ylabel(’y’)
plt.title(’Grafico com barra de erro’)
plt.legend([’resultado 1’],loc=0) #melhor local plt.show()
Propriedades de Texto
Argumentos opcionais dos comandos de texto
Propriedade
Valores
alpha
transpar ˆencia (0–1)
color
Cor: b,g,r,c,m,y,k,w
fontangle
italic, normal, oblique
fontname
Nome da fonte
fontsize
Tamanho da fonte
fontweight
normal, bold, light4
horizontalalingnment
left, center, right
verticalalingnment
bottom, center, top
rotation
horizontal, vertical
Incompatibilidade entre fontes no Windows
Pode haver uma incompatibilidade entre a biblioteca matplotlib e o
sistema operacional Windows ao salvar as imagens em .pdf, pois a
fonte de texto original da biblioteca n ˜ao vem instalada por padr ˜ao no
Windows. Para contornar isso, basta mudarmos a fonte de texto a ser
utilizada. Escreva essas duas linhas de comando antes de comec¸ar a
montar seu plot:
plt.rcParams[’pdf.fonttype’] = 42
Embelezando
import matplotlib.pyplot as plt x = [0, 2, 4, 6]
y = [1, 3, 4, 8]
plt.xlim(left=-1,right=8)
plt.errorbar(x, y, yerr=0.2, fmt=’o’, fontsize=20) plt.xlabel(’x’,fontsize=20)
plt.ylabel(’Voltagem [$\mu$V]’, color=’r’) plt.title(’Grafico com barra de erro’)
plt.text(5,2,’$\sum_iˆ\infty x_i$’,fontsize=20) plt.legend([’resultado 1’],loc=’upper left’)
plt.savefig(’pontos.pdf’) plt.show()
Para ver as possibilidades:
>>> help(plt.plot) >>> help(plt.legend) 1 0 1 2 3 4 5 6 7 8 x 1 2 3 4 5 6 7 8 Vo lta ge m [ V] ixi Grafico com barra de erro
resultado 1
S ´erie de Taylor
Ü S ´erie de Taylor ´e uma das ferramentas matem ´aticas mais importantes em m ´etodos num ´ericos e computac¸ ˜ao cient´ıfica
Ü Ela ´e usada para desenvolver os m ´etodos que veremos neste curso m M ´etodo de Newton para encontrar a raiz de uma func¸ ˜ao m M ´etodo dos Trap ´ezios e de Simpson para calcular integrais m M ´etodos de Euler e Runge-Kutta pra EDO
Ü e nos permite uma an ´alise da acur ´acia que o m ´etodo prov ˆe
Ü Suponha conhecido o valor da func¸ ˜ao f em um ponto x0e queremos saber o valor de f em ponto pr ´oximo x = x0+h, com h sendo bem pequeno. Suponha que saibamos tamb ´em a derivada de f no mesmo ponto x0. Uma primeira aproximac¸ ˜ao pode ser escrita como:
f0(x0) ≈
f (x0+h)− f (x0)
h ⇒ f (x0+h) ≈ f (x0) +h f 0(x
S ´eries de Taylor
Se uma func¸ ˜ao f (x ) ´e diferenci ´avel n vezes no intervalo (a, b) : podemos escrev ˆe-la como: aS ´erie de Taylor:
f (x ) = f (x0) +f1(x0)(x − x0) + 1 2!f 2(x0)(x − x0)2+ · · · + 1 n!f n(x0)(x − x0)n+ . . . f (x ) = ∞ X n=0 1 n! dnf dxn(x0)(x − x0) n
fn(x0) ´e sua n- ´esima derivada calculada no ponto x0∈ (a, b) A contribuic¸ ˜ao relativa de cada termo cai com n (∝ 1/n!)
Se truncarmos a s ´erie no termo de ordem n, a soma ser ´a uma aproximac¸ ˜ao Quanto maior o n, melhor a aproximac¸ ˜ao
A soma dos termosdesprezadosser ´a dominada pelo termo de ordem n + 1
Ao truncar a s ´erie de Taylor no termo de ordemnteremos umerrona aproximac¸ ˜ao proporcional ao pr ´oximo termo, ou seja,δf = O(x − x0)(n+1),
o erro depende de h = x − x0e do n ´umero de termos n
S ´eries de Taylor - Exemplos
f (x ) = f (x0)+f1(x0)(x −x0)+1 2!f2(x0)(x −x0)2+· · ·+ 1 n!fn(x0)(x −x0)n+. . . f (x ) = ex, em torno de x 0=0: f1(x ) = ex → f1(0) = 1, f2(x ) = ex → f2(0) = 1, . . . ex =1 + x +12x2+3!1x3+ · · · + n!1xn+ . . . n = 1, 2, 3, . . . f (x ) = sin(x ), em torno de x0=0: f1(x ) = cos(x ) → f1(0) = 1, f2(x ) = − sin(x ) → f2(0) = 0, f3(x ) = −cos(x ) → f3(0) = −1, f4(x ) = sin(x ) → f4(0) = 0, . . . sin(x ) = x − 3!1x3+ 1 5!x5− 1 7!x7. . . sin(x ) = ∞ X i=0 (−1)n(x − x0) 2n+1 (2n + 1)!S ´erie de Taylor de e
xÜUm programa extremamente simples e n ˜ao muito funcional para calcular alguns poucos termos da s ´erie de Taylor da func¸ ˜ao exponencial poderia ser (exp taylor simples.py)
from math import exp
h = float(input(’Digite o valor de (h)\n’)) print (’exp(%f) = %f’ %(h, exp(h)))
soma = 1. ordem = 0
print (’ordem=%d, serie=%g, erro=%g’ %(ordem,soma,exp(h)-soma)) ordem = 1
soma += h
print (’ordem=%d, serie=%g, erro=%g’ %(ordem,soma,exp(h)-soma)) ordem = 2
soma += (1/2.0)*h**2
print (’ordem=%d, serie=%g, erro=%g’ %(ordem,soma,exp(h)-soma)) ordem = 3
soma += (1/6.0)*h**3
print (’ordem=%d, serie=%g, erro=%g’ %(ordem,soma,exp(h)-soma)) ordem = 4
soma += (1/24.0)*h**4
print (’ordem=%d, serie=%g, erro=%g’ %(ordem,soma,exp(h)-soma))
S ´erie de Taylor de e
x $ python3 exp_taylor_simples.py Digite o valor de (h).2
exp(0.200000) = 1.221403
ordem=0, serie = 1, erro = 0.221403 ordem=1, serie = 1.2, erro = 0.0214028 ordem=2, serie = 1.22, erro = 0.00140276 ordem=3, serie = 1.22133, erro = 6.94248e-05 ordem=4, serie = 1.2214, erro = 2.75816e-06 $ python3 exp_taylor_simples.py
Digite o valor de (h) 3
exp(3.000000) = 20.085537
ordem=0, serie = 1, erro = 19.0855 ordem=1, serie = 4, erro = 16.0855 ordem=2, serie = 8.5, erro = 11.5855 ordem=3, serie = 13, erro = 7.08554 ordem=4, serie = 16.375, erro = 3.71054
S ´erie de Taylor de e
xÜ Neste exemplo, truncamos a s ´erie de Taylor em n = 4, portanto, para a
exponencial, esperamos um erro da ordem de
δf ≈ (x − x0)(n+1)/(n + 1)!
Ü Para x − x0=0.2 o erro foi 2.75816e-06 e o valor esperado ´e δf = 0.25/5! = 2.666 × 10−6
Ü Para x − x0=3 o erro foi 3.71054 e o valor esperado ´e δf = 35/5! = 2.025
Ü Mas podemos ir adicionando quantos termos quisermos at ´e atingir a acur ´acia desejada. Para x − x0=3, obtemos o valor de 20.086 com 15 termos da s ´erie.
Ü Para x − x0=50, e50=5.1847 × 1021e variando o n ´umero de termos:
n+1 s ´erie 2 51 4 2.2134 ×104 8 1.7960 ×108 16 3.2964 ×1013 32 1.3928 ×1019 64 5.0196 ×1021 128 5.1847 ×1021
Exerc´ıcio
Ü Vamos analisar a func¸ ˜ao sin(x ) em torno de x0=0:
sin(x ) = x − 1 3!x 3+ 1 5!x 5− 1 7!x 7· · · = ∞ X i=0 (−1)n (x ) 2n+1 (2n + 1)!
Ü Fac¸a um programa em Python que calcule essa s ´erie. O programa deve conter uma func¸ ˜ao taylor seno(x,n) que receba o valor de x e o n ´umero de termos (os quais devem ser solicitados pelo teclado) e retorne o valor da s ´erie. O programa principal deve imprimir o resultado da soma e a diferenc¸a entre esse resultado e o valor “exato” obtido por math.sin(x).seno.py
Ü Escolha um valor de x (que na pr ´atica significa escolher h) e execute o programa v ´arias vezes alterando o valor de N
Ü Mude o valor de x e repita o procedimento. Discuta o que acontece. Verifique queδf ≈ (x − x0)(n+1)/(n + 1)!
Ü E interessante analisar a s ´erie de Taylor observando este gr ´afico que´ mostra a func¸ ˜ao “exata” sin(x ) e o resultado da s ´erie para n = 2, 3, 4, 5 (onde n aqui ´e o n ´umero de termos da s ´erie – n=2 equivale a ir at ´e o termo x3) para valores de x de 0 a 3π/2. Produza esse gr ´afico no final do seu programa, usando o matplotlib.
Sugest ˜ao: Em vez de solicitar que x e n sejam dados pelo teclado, crie um array com os valores de x :
x = np.linspace(0, 270, 51)e calcule os valores de y chamando a sua func¸ ˜ao y2=taylor seno(x,2) e plote esse gr ´afico. Chame a func¸ ˜ao quatro vezes alterando o valor de n e fazendo o plot novamente
0 50 100 150 200 250 x(graus) 2.0 1.5 1.0 0.5 0.0 0.5 1.0 1.5 2.0 sen(x)
Serie de Taylor - sen(x)
sen(x) n=2 n=3 n=4 n=5
Histogramas
Ü
Histogramas s ˜ao usados para visualizar e analisar dados
distribu´ıdos em determinadas categorias ou em intervalos de uma
dada vari ´avel. Permitem que se perceba o valor central (m ´edia), a
faixa de variac¸ ˜ao (desvio padr ˜ao), poss´ıveis estruturas e eventos
inesperados.
Gr ´aficos S. Taylor Histogramas interface OO v ´arios arquivos Animac¸ ˜ao Array-Matrizes plt - Fit
Histogramas
Ü
Para construir um histograma classificamos os dados de acordo
com os intervalos
, calculando o n ´umero N(x
i)
ou a frequ ˆencia
F (x
i) =
N(x
i)/N de ocorr ˆencia em cada intervalo.
Histogramas
Ü
Para construir um histograma classificamos os dados de acordo
com os intervalos,
calculando o n ´umero N(x
i)
ou a frequ ˆencia
F (x
i) =
N(x
i)/N de ocorr ˆencia em cada intervalo.
Gr ´aficos S. Taylor Histogramas interface OO v ´arios arquivos Animac¸ ˜ao Array-Matrizes plt - Fit
Histogramas
Ü
Quando queremos fazer um histograma de uma vari ´avel real,
definimos uma largura do intervalo (
bin
), ∆x .
As quantidades N(x
i)
v ˜ao representar o n ´umero de ocorr ˆencias
entre x
ie x
i+ ∆x .
N(x
i)
depende da escolha da largura ∆x .
Gr ´aficos S. Taylor Histogramas interface OO v ´arios arquivos Animac¸ ˜ao Array-Matrizes plt - Fit
Histogramas
Ü
Quando queremos fazer um histograma de uma vari ´avel real,
definimos uma largura do intervalo (
bin
), ∆x .
As quantidades N(x
i)
v ˜ao representar o n ´umero de ocorr ˆencias
Histogramas
Ü
Quando queremos fazer um histograma de uma vari ´avel real,
definimos uma largura do intervalo (
bin
), ∆x .
As quantidades N(x
i)
v ˜ao representar o n ´umero de ocorr ˆencias
entre x
ie x
i+ ∆x .
N(x
i)
depende da escolha da largura ∆x .
Gr ´aficos S. Taylor Histogramas interface OO v ´arios arquivos Animac¸ ˜ao Array-Matrizes plt - Fit
Histogramas
bin xi +∆x Cont 1 9.00 9.08 0 2 9.08 9.16 0 3 9.16 9.24 2 4 9.24 9.32 0 5 9.32 9.40 1 6 9.40 9.48 4 7 9.48 9.56 8 8 9.56 9.64 19 9 9.64 9.72 20 10 9.72 9.80 35 11 9.80 9.88 32 12 9.88 9.96 33 13 9.96 10.04 23 14 10.04 10.12 10 15 10.12 10.20 9 16 10.20 10.28 7 17 10.28 10.36 4 18 10.36 10.44 1 19 10.44 10.52 0 20 10.52 10.60 0Histogramas
bin xi +∆x Cont 1 9.00 9.08 0 2 9.08 9.16 0 3 9.16 9.24 2 4 9.24 9.32 0 5 9.32 9.40 1 6 9.40 9.48 4 7 9.48 9.56 8 8 9.56 9.64 19 9 9.64 9.72 20 10 9.72 9.80 35 11 9.80 9.88 32 12 9.88 9.96 33 13 9.96 10.04 23 14 10.04 10.12 10 15 10.12 10.20 9 16 10.20 10.28 7 17 10.28 10.36 4 18 10.36 10.44 1 19 10.44 10.52 0 20 10.52 10.60 0Observe que, para melhor visualizac¸ ˜ao, o gr ´afico cobre uma faixa um pouco maior que a faixa de valores de x
Gr ´aficos S. Taylor Histogramas interface OO v ´arios arquivos Animac¸ ˜ao Array-Matrizes plt - Fit
Histogramas
Ü Atenc¸ ˜ao:
A escolha da largura dos intervalos pode distorcer o
comportamento dos dados que estamos analisando.
20 bins
Tem que haver um compromisso entre o n ´umero de bins e o n ´umero de eventos em cada bin
Gr ´aficos S. Taylor Histogramas interface OO v ´arios arquivos Animac¸ ˜ao Array-Matrizes plt - Fit
Histogramas
Ü Atenc¸ ˜ao:
A escolha da largura dos intervalos pode distorcer o
comportamento dos dados que estamos analisando.
20 bins
4 bins
Tem que haver um compromisso entre o n ´umero de bins e o n ´umero de eventos em cada bin
Gr ´aficos S. Taylor Histogramas interface OO v ´arios arquivos Animac¸ ˜ao Array-Matrizes plt - Fit
Histogramas
Ü Atenc¸ ˜ao:
A escolha da largura dos intervalos pode distorcer o
comportamento dos dados que estamos analisando.
20 bins
200 bins
Gr ´aficos S. Taylor Histogramas interface OO v ´arios arquivos Animac¸ ˜ao Array-Matrizes plt - Fit
Histogramas
Ü Atenc¸ ˜ao:
A escolha da largura dos intervalos pode distorcer o
comportamento dos dados que estamos analisando.
20 bins
500 bins
Tem que haver um compromisso entre o n ´umero de bins e o n ´umero de eventos em cada bin
Histogramas
Ü Atenc¸ ˜ao:
A escolha da largura dos intervalos pode distorcer o
comportamento dos dados que estamos analisando.
20 bins
500 bins
Tem que haver um compromisso entre o n ´umero de bins e o n ´umero de eventos em cada bin
Gr ´aficos S. Taylor Histogramas interface OO v ´arios arquivos Animac¸ ˜ao Array-Matrizes plt - Fit
Determinac¸ ˜ao do bin a que pertence um certo valor
De forma intuitiva:
Percorra os intervalos e veja se xi−1<valor <= xi
Podemos obter uma forma direta para sabermos a que bin um certo valor pertence:
min = 1.5 max = 2.0 Nbins = 5: ´ındice pode ser i=0,1,2,3,4
Dado um valor , ´ındice i = ? Ex: se valor = 1.52 ⇒ i = 0 se valor = 1.91 ⇒ i = 4
Dica: dx = max −minNbins = 0.5/5 = 0.1
Gr ´aficos S. Taylor Histogramas interface OO v ´arios arquivos Animac¸ ˜ao Array-Matrizes plt - Fit
Determinac¸ ˜ao do bin a que pertence um certo valor
De forma intuitiva:
Percorra os intervalos e veja se xi−1<valor <= xi
Podemos obter uma forma direta para sabermos a que bin um certo valor pertence:
min = 1.5 max = 2.0 Nbins = 5
Dado um valor , ´ındice i = ? Ex: se valor = 1.52 ⇒ i = 0 se valor = 1.91 ⇒ i = 4
Gr ´aficos S. Taylor Histogramas interface OO v ´arios arquivos Animac¸ ˜ao Array-Matrizes plt - Fit
Determinac¸ ˜ao do bin a que pertence um certo valor
De forma intuitiva:
Percorra os intervalos e veja se xi−1<valor <= xi
Podemos obter uma forma direta para sabermos a que bin um certo valor pertence:
min = 1.5 max = 2.0 Nbins = 5: ´ındice pode ser i=0,1,2,3,4
Dado um valor , ´ındice i = ? Ex: se valor = 1.52 ⇒ i = 0 se valor = 1.91 ⇒ i = 4
Dica: dx = max −minNbins = 0.5/5 = 0.1
Gr ´aficos S. Taylor Histogramas interface OO v ´arios arquivos Animac¸ ˜ao Array-Matrizes plt - Fit
Determinac¸ ˜ao do bin a que pertence um certo valor
De forma intuitiva:
Percorra os intervalos e veja se xi−1<valor <= xi
Podemos obter uma forma direta para sabermos a que bin um certo valor pertence:
min = 1.5 max = 2.0 Nbins = 5: ´ındice pode ser i=0,1,2,3,4
Dado um valor , ´ındice i = ? Ex: se valor = 1.52 ⇒ i = 0 se valor = 1.91 ⇒ i = 4
Determinac¸ ˜ao do bin a que pertence um certo valor
De forma intuitiva:
Percorra os intervalos e veja se xi−1<valor <= xi
Podemos obter uma forma direta para sabermos a que bin um certo valor pertence:
min = 1.5 max = 2.0 Nbins = 5: ´ındice pode ser i=0,1,2,3,4
Dado um valor , ´ındice i = ? Ex: se valor = 1.52 ⇒ i = 0 se valor = 1.91 ⇒ i = 4
Dica: dx = max −minNbins = 0.5/5 = 0.1
Exerc´ıcio - Preparac¸ ˜ao de um histograma
ÜSuponha que voc ˆe tenha uma lista de valores para fazer um histograma.
ÜPara isso voc ˆe deve dividir o intervalo dos valores em sub-intervalos iguais e contar quantos valores est ˜ao dentro de cada um desses sub-intervalos.
ÜEscreva um algoritmo para realizar essa operac¸ ˜ao.
ÜObserve o conte ´udo do arquivo gravidade.dat que cont ´em medic¸ ˜oes da acelerac¸ ˜ao da gravidade feita por alunos na FisexpI. Os dados contidos nesse arquivo variam entre 975.0 e 995.0 cm/s2.
ÜEscreva um programa em Python (histogramaRaiz.py) que: 1 Leia do teclado os limites do histograma e o n ´umero de bins. 2 Leia os valores do arquivo gravidade.dat
3 determine a que bin cada valor ser ´a atribu´ıdo 4 Conte quantos valores caem em cada intervalo
5 Fac¸a o gr ´afico de y × x onde x s ˜ao os valores da acelerac¸ ˜ao da
gravidade e y ´e o n ´umero de ocorr ˆencias de medidas em cada bin
Histograma em Matplotlib
Ü O m ´odulo matplotlib.pyplot nos fornece o m ´etodo plt.hist(valores, bins=20) ou
plt.hist(valores, bins=20, density=True)
Ü que plota o histograma dos valores contidos no array valores. Quando o argumento density for setado para True o histograma ´e normalizado.
Ü Fac¸a um programa histograma.py que: m Leia os valores do arquivo gravidade.dat
m fac¸a o histograma desses valores(Rode o programa com 20 e 60 bins)
m calcule a m ´edia (µ) dos valores e o desvio padr ˜ao σ dado pela raiz da vari ˆancia σ2= 1 N − 1 N X 1 (xi− µ)2= 1 N − 1 N X 1 xi2 ! − N N − 1µ 2
O m ´odulo numpy tamb ´em oferece as func¸ ˜oes
min, max, sum, len, meane std para array
Tipos de gr ´aficos
Ü
Vimos alguns tipos de gr ´aficos:
m
plot(x,y)
– gr ´afico de linha ou pontos
m
errorbar(x, y, xerr = , yerr = )
– com barra de erro
m
scatter(x , y)
– gr ´afico de pontos
(esse n ˜ao vimos, pesquise!)m
hist(dados, n bins)
– histograma
Ü
Vimos o m ´etodo mais simples e direto, exemplo
plotSin-simples.py
import numpy as np import matplotlib.pyplot as plt #np.arange(start,stop,step) x = np.arange(0, 4 * np.pi, 0.1) y = np.sin(x)plt.plot(x, y, linewidth=2.0, linestyle=’--’, color=’r’, marker=’o’, markersize=5, markeredgecolor=’b’, markerfacecolor=’g’) plt.xlabel(’angulo (0 a 4 pi)’)
plt.ylabel(’seno(x)’)
plt.title(’Grafico de seno(x)’) plt.show()
Interface orientada a objeto
Ü Existe uma outra forma de fazer os gr ´aficos, ligeiramente diferente, chamada de Interface Orientada a Objeto
Ü Nessa interface, as componentes do gr ´afico (eixos, t´ıtulo, linhas, pontos, labels dos ticks, etc.) s ˜ao tratados como objetos program ´aveis que tem associados atributos, cujos valores podem ser fixados, e m ´etodos (func¸ ˜oes), que podem ser chamados para modificar o objeto.
Ü A anatomia b ´asica de um plot inclui quatro camadas:
m Figure:a camada mais de baixo. Pense nela como sendo uma janela que cont ´em os bot ˜oes de minimizar, maximizar e fechar m Plot: ´e criado sobre a camada da figure. Se existir mais de um
plot na mesma figure, cada um ´e chamado de subplot m Axis:s ˜ao os eixos x e y , onde as linhas, pontos, histogramas,
etc, s ˜ao desenhados sobre a camada plot. Um axis tem atributos como axis labels, tick labels, espessura da linha
m Data:pontos, linhas, formas que s ˜ao plotados sobre a camada axis
Interface orientada a objeto
Ü A func¸ ˜ao plt.subplots() cria ao mesmo tempo o objeto figure e o objeto axis. Quando usada sem argumentos, cria apenas uma
figuree apenas um axis
Ü por convenc¸ ˜ao, chama-se o objeto figure de fig e o objeto axis de ax:
fig, ax = plt.subplots()
Ü Uma vez criados os objetos, podemos adicionar seus atributos , usando a estrutura de linguagem orientada a objeto:
< objeto > . < atributo >, p. ex: ax.plot(x, y)
ax.plot(x, z)
onde x, y e z s ˜ao numpy.arrays
Ü O objeto ax, tem v ´arios m ´etodos e atributos, p. ex. : ax.set title(), ax.legend().
Ele tem tamb ´em objetos filhas , com seus pr ´oprios atributos:
plotSin-oo.py
import numpy as np import matplotlib.pyplot as plt x = np.arange(0,4*np.pi,0.1) y = np.sin(x) z = np.cos(x) fig, ax = plt.subplots() ax.plot(x,y,linewidth=2.0, linestyle=’--’) ax.plot(x,z)ax.set_title(’Duas func¸˜oes’) ax.legend([’sin’,’cos’])
ax.xaxis.set_label_text("angulo")
ax.yaxis.set_label_text(’Seno e Cosseno’) plt.show()
M ´etodos e atributos de axis
tabela retirada desse link
Comando Orientado a objeto Descric¸ ˜ao correspondente plt. fig, ax = plt.subplots() Cria o objeto figure e eixo –
ax.plot(x,y) cria gr ´afico de linha plt.plot(x,y)
ax.set title(’Meu T´ıtulo’) t´ıtulo do gr ´afico plt.title(’My Title’) ax.set xlabel(’x label’) legenda do eixo x plt.xlabel(’x label’) ax.set ylabel(’y label’) legenda do eixo y plt.ylabel(’x label’) ax.legend([’line1’,’line2’]) legenda do gr ´afico plt.legend([’line1’,’line2’]) ax.set xlim([0, 5]) limites do eixo x plt.xlim([0, 5]) ax.set ylim([-1, 1]) limites do eixo y plt.ylim([-1, 1]) ax.axis([-x, +x, -y, +y]) limites dos 2 eixos
-ax.grid(True) grid nas duas direc¸ ˜oes plt.grid(True)
ax.xaxis.grid(True) grid na vertical
-ax.yaxis.grid(True) grid na horizontal
-ax.xaxis.set xticks([loc]) localizac¸ ˜ao dos ticks em x plt.xticks([loc],[label]) ax.xaxis.set xticklabels([labels]) tick labels x plt.xticks([loc],[label]) ax.yaxis.set yticks([loc]) localizac¸ ˜ao dos ticks em y plt.yticks([loc],[label]) ax.yaxis.set yticklabels([labels]) tick labels y plt.yticks([loc],[label]) ax.xaxis.set ticks([]) remove x tick labels plt.xticks([],[]) ax.yaxis.set ticks[]) remove y tick labels plt.yticks([],[]) ax.set aspect(’equal’) iguala as escalas dos eixos
-fig.tight layout() ajusta padding plt.tight layout()
plt.show() mostra o gr ´afico plt.show()
Al ´em do ax.plot(x,y) temos todos os outros tipos de gr ´aficos:
Interface orientada a objeto
Ü
Essa forma de fazer gr ´aficos no matplotlib ´e a mais utilizada nos
exemplos
Ü
Ela oferece muitas possibilidades que n ˜ao s ˜ao poss´ıveis (ou que
n ˜ao ´e t ˜ao simples) utilizando o modo plt.:
m
apresentar mais de um gr ´afico na mesma figura
m
apresentar mais de um tipo de gr ´afico no mesmo plot
(p. ex. histograma e uma func¸ ˜ao superposta)
m
posicionar o eixo x no zero do eixo y
m
mostrar o gr ´afico em escala log
m
animac¸ ˜ao
m
...
Mais de um gr ´afico na mesma figura - 1
Ü Para termos mais de um gr ´afico em uma figura colocamos o n ´umero de linhas e colunas como argumento da func¸ ˜ao subplots(), e atribu´ımos cada um a um objeto do tipo axis
Ü A sintaxe geral ´e:
fig, <ax objects> = plt.subplots(rows, cols)
Ü e um exemplo de uma figura com dois 6 gr ´aficos, apresentados em 2 linhas e 3 colunas:
fig, ( (ax1,ax2,a3), (ax4,ax5,ax6) ) = plt.subplots(2, 3) Ü Uma atributo bastante utilizado da classe axis s ˜ao as escalas
logar´ıtmicas dos gr ´aficos:
ax.plot() linear em x e em y
ax.semilogy() linear em x, logar´ıtmica em y ax.semilogx() logar´ıtmica em x, linear em y ax.loglog() logar´ıtmica em x e em y
maisDeUmPlot-1.py
t = np.arange(0.01, 20.0, 0.01)
# Cria a figure com 2 linhas e 2 colunas de subplots fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2)
ax1.plot(t, np.exp(-t / 5.0)) # linear x e y
ax1.set_title(’linear x and y’) ax1.grid()
ax2.semilogy(t, np.exp(-t / 5.0)) # log eixo y
ax2.set_title(’semilogy’) ax2.grid()
ax3.semilogx(t, np.exp(-t / 5.0)) # log eixo x
ax3.set_title(’semilogx’) ax3.grid()
ax4.loglog(t, 20 * np.exp(-t / 5.0), basex=2) # log eixo x e y ax4.set_title(’loglog base 2 on x’)
ax4.grid()
fig.tight_layout() plt.show()
Mais de um gr ´afico na mesma figura - 2
Ü Existe uma outra forma de fazer subplots: m primeiramente cria-se apenas uma figura
plt.figure()
m depois adiciona-se cada plot individualmente: ax1 = plt.subplot(1, 3, 1)
a ordem dos argumentos ´e:
n ´umero de linhas, n ´umero de colunas, ´ındice desse gr ´afico (que comec¸a com 1)
repare que o m ´etodo ´e subplot (sem “s” no final)
maisDeUmPlot-2.py
# Cria apenas a figure , podendo definir seu tamanho plt.figure(figsize=(9, 3)) # largura e altura em inches
t = np.arange(0.01, 20.0, 0.01) ax1 = plt.subplot(1, 3, 1) ax1.plot(t, np.exp(-t / 5.0)) ax1.set_title(’exp(-t / 5.0)’) t = np.arange(0,4*np.pi,0.1) ax2 = plt.subplot(1, 3, 2) ax2.plot(t, np.sin(t)) ax2.set_title(’seno (x) ’) ax3 = plt.subplot(1, 3, 3) ax3.plot(t, np.sin(t)) ax3.spines[’bottom’].set_position(’zero’) ax3.spines[’right’].set_color(’none’) ax3.spines[’top’].set_color(’none’) plt.show()
maisDeUmPlot-2.py
Criando v ´arios arquivos
Ü
Suponha que queiramos criar diversos gr ´aficos de gaussianas,
variando o par ˆametro σ
Ü
isso pode ser feito dentro de um loop, variando esse valor e
salvando cada gr ´afico:
Criando v ´arios arquivos
def f(x, m, s): return (1.0/(np.sqrt(2*np.pi)*s))*np.exp(-0.5*((x-m)/s)**2) m = 0 s_max = 2 s_min = 0.2x = np.linspace(m -3*s_max, m + 3*s_max, 1000)
# f ´e max para x=m; menor s d´a o maior valor de f
max_f = f(m, m, s_min) plt.axis([x[0], x[-1], -0.1, max_f]) s = s_min while s < s_max: y = f(x, m, s) plt.plot(x, y) plt.title(’Gaussian m = %.1f s = %.1f’ % (m, s)) plt.savefig(’gaussian/gauss_%.1f.pdf’ % (s)) plt.show() s += 0.4
Animac¸ ˜ao
Ü O Matplotlib fornece a ferramenta FuncAnimation para fazer animac¸ ˜oes
Ü Veja exemplos no site do matplotlib Ü e tutorial aqui
Ü e na sec ˜ao 5.3.4 do livro do Langtangen
Ü coloco aqui tr ˆes exemplos com os filmes gerados por eles: m seno anim.py e seno.mp4
m wavePacket anim.py e wavepackage.mp4 m gaussian anim.py e gauss.mp4
Ü Pesquise para entender o que faz cada func¸ ˜ao e o que s ˜ao os par ˆametros usados em cada uma delas
seno anim.py
import numpy as npimport matplotlib.pyplot as plt
import matplotlib.animation as animation def animate(i):
line.set_ydata(np.sin(x+i/10.0)) # update a curva
return line, def init(): line.set_ydata(np.ma.array(x, mask=True)) return line, fig = plt.figure() ax = fig.add_subplot(111)
x = np.arange(0, 2*np.pi, 0.01) # x-array
# line ´e um objeto que cont´em a primeira curva
line, = ax.plot(x, np.sin(x))
anim = animation.FuncAnimation(fig, animate, np.arange(1, 200), init_func=init, interval=25, blit=True)
anim.save(’seno.mp4’, fps=30) plt.show()
Relembrando... Pacote Numpy
Numpy
E o pacote do Python mais fundamental para computac¸ ˜ao
´
cient´ıfica.
Ele cont ´em, entre outras coisas:
Ü
arrays e matrizes
Ü
func¸ ˜oes matem ´aticas sofisticadas
Ü
ferramentas de ´algebra linear
Ü
transformada de Fourier
Ü
geradores de n ´umeros aleat ´orios
Array
Ü
J ´a vimos o container Array, definido no m ´odulo numpy:
m
´e muito mais r ´apido que List, especialmente se contiver
muitos n ´umeros
m
j ´a tem os m ´etodos matem ´aticos, como se fossem aplicados a
vetores, p. ex. soma de dois arrays, produto escalar, etc.
Assim n ˜ao ´e necess ´ario fazer loops sobre os elementos
m
pode ser bi-dimensional,
para aplicac¸ ˜oes com matrizes
m
usado no m ´odulo de visualizac¸ ˜ao de gr ´aficos matplotlib
Ü
Atenc¸ ˜ao:
m
todos os elementos devem ser do mesmo tipo (float, int ...)
m
o n ´umero de elementos deve ser conhecido na criac¸ ˜ao, n ˜ao pode
ser modificado posteriormente
m
detalhes no
site do SciPy
Inicializac¸ ˜ao de um Array
Podemos inicializar um array de v ´arias formas >>> import numpy as np
>>> a = np.zeros(4) # cria array com 4 el. com 0. (float) >>> print (a)
[0. 0. 0. 0.] # repare que ´e sem v´ırgula
>>> b = np.zeros(4, int) # para que os elementos sejam int >>> r = np.empty(1000) # cria com 1000 el. vazios (lixo) >>> alist = [1., 1.5, -2.2] # uma lista
>>> aarray = np.array(alist) # pode ser convertida em array >>> aarray = np.array([5, 10, 15], float)
array([ 5., 10., 15.])
>>> s = np.linspace(0, 2, 3) # (in´ıcio, fim, num. elem) array([0., 1., 2.]) # inclui o ´ultimo. sempre float >>> s = np.arange(1, 8, 2) # (in´ıcio, fim, passo) array([1, 3, 5, 7]) # n˜ao inclui o ´ultimo. >>> w = np.arange(5)
Inic. de um Array c/ valores lidos de arquivo
Ü Uma outra forma de criar um array ´e atrav ´es da leitura dos valoresarmazenados em um arquivo
Ü Bastante ´util para ler dados obtidos em um experimento, ou gerados por outro programa
Ü Suponha que tenhamos um arquivo valores.txt com o seguinte conte ´udo:
1.0 1.5 -2.2
Para l ˆe-los em um array:
>>> from numpy import loadtxt >>> a = loadtxt ("valores.txt") >>> print (a)
[ 1. 1.5 -2.2]
ÜRepare que n ˜ao ´e preciso saber o n ´umero de linhas do arquivo
Slices
Ü Slice se refere `a uma parte de uma lista ou array
Ü Para extrair uma parte de um array, usamos a sintaxe: A[i:j]. Ser ´a extra´ıda uma sublista que comec¸a com o elemento A[i] e termina com o elemento A[j-1]
>>> from numpy import array
>>> a = array([2,4,6,8,10,12,14,16],int) >>> b=a[3:6] [ 8 10 12] >>> c= a[3:] >>> print (c) [ 8 10 12 14 16] >>> d = a[:3] >>> print (d) [2 4 6] >>> r = a[1:-1] >>> print (r) [ 4 6 8 10 12 14]
Matrizes
Ü
Matriz ´e um conjunto de n ´umeros organizado em forma de tabela,
com algumas propriedades matem ´aticas. S ˜ao muito utilizadas em
´algebra linear e Mec ˆanica Qu ˆantica
Ü
A matriz A
A =
A
11A
12A
13A
14A
21A
22A
23A
24A
31A
32A
33A
34
=
0
12
−1 5
−1 −1 −1 0
11
5
5
2
´e uma matriz com 3 linhas e 4 colunas, chamada matriz 3×4
Ü
O elemento A
ijse refere ao n ´umero que est ´a na linha i coluna j
Matriz em Python
Ü Em Python, uma matriz ´e representada por um array de 2 dimens ˜oes
Ü Algumas maneiras de criar um array de duas dimens ˜oes, p. ex. 3 × 2 m criando todos os elementos com zeros
>>> from numpy import array, zeros, empty >>> a = zeros([3,2]) >>> print (a) [[0. 0.] [0. 0.] [0. 0.]] m ... ou vazios
>>> from numpy import array, zeros
>>> b = empty([3,2]) #cont´em algum lixo na mem´oria >>> print (b)
[[0. 0.] [1. 0.] [0. 12.345]]
Matriz em Python
Ü Algumas maneiras de criar um array de duas dimens ˜oes (cont.) m usando uma lista de listas (Tem que ter mesmo n ´umero de colunas
para cada linha)
>>> r = array([[1, 2],[3, 4],[10, 11]], int) >>> print(r)
[[ 1 2] [ 3 4] [10 11]]
Ü Para acessar um elemento da matriz (´ındice comec¸a de zero): >>> print (r[0,1]) 2 >>> r[1,1] = 5 >>> print (r) [[ 1 2] [ 3 5] [10 11]] >>> r[1,1] = 5 >>> print(r[2,1]*r[1,1]) 55 >>> print (a[1,2])
Traceback (most recent call last): File "<stdin>", line 1, in <module>
IndexError: index 2 is out of bounds for axis 1 with size 2
Shape
Ü Para saber o layout da matriz: >>> r.shape (3, 2) >>> r.shape[0] 3 >>> r.shape[1] 2
Ü Um loop sobre todos os elem. da matriz pode ser feito com dois loops: >>> for i in range(r.shape[0]): ... for j in range(r.shape[1]): ... r[i,j] += 1 ... >>> print (r) [[ 2 3] [ 4 6] [11 12]]
Slices
Ü
Podemos tamb ´em extrair partes da matriz, assim como foi feito com
array de uma dimens ˜ao:
#Extrair primeira coluna:
# 0:3 (todas as linhas)
0 (primeira coluna)
>>> print(r[0:3, 0])
#ou
>>> print(r[0:r.shape[0], 0])
#ou
>>> print(r[:, 0])
[ 2
4 11]
#extrair a segunda linha:
>>> print(r[1, :])
[4 6]
Inicializac¸ ˜ao de array 2D
Ü
numpy
oferece um grande n ´umero de operac¸ ˜oes com matrizes
(Voltaremos `as propriedades matem ´aticas de matrizes em outra aula)
Ü
podemos us ´a-las tamb ´em para ler os dados de um arquivo que
est ˜ao organizados em forma de tabela
m
O arquivo
densidade agua.dat
cont ´em tr ˆes colunas que
representam respectivamente a temperatura em graus Celsius, a
densidade da ´agua e suas incertezas em kg/m
3.
m
Leia esses dados para um array com a dimens ˜ao apropriada.
Sugest ˜ao: Copie seu arquivo plotPontos.py e use a func¸ ˜ao loadtxtda numpy, vista na aula 3m
separe as 3 colunas e passe-as para 3 arrays de uma
dimens ˜ao: x , y , yerror
m
fac¸a um gr ´afico da densidade × temperatura, com as incertezas
(plot density.py)Ajuste de func¸ ˜
oes
Ü Voc ˆe tem um conjunto de dados que voc ˆe cr ˆe que podem ser descritos por um dado modelo matem ´atico. Os dados n ˜ao correspondem exatamente a valores previstos pelo modelo pois cont ´em incertezas experimentais ou outras formas de ru´ıdo aleat ´orio.
Ü Ajustar este modelo aos dados ´e determinar os melhores valores dos par ˆametros do modelo que minimizam a “dist ˆancia” dos valores previstos aos dados
Ü Por exemplo, voc ˆe mede a posic¸ ˜ao x em func¸ ˜ao do tempo t de um bloco cujo movimento voc ˆe cr ˆe que seja uniformemente acelerado. Neste caso o modelo matem ´atico ´e x (t) = xo+vot + at2/2.
Ü Ajustar esta func¸ ˜ao aos dados nos permite obter a melhor estimativa dos par ˆametros xo, voe a, supondo v ´alida a sua hip ´otese de movimento uniforme.
Ü matplotlibfornece algumas funcionalidades para fazer ajuste de polin ˆomios
Ü Para func¸ ˜oes mais gerais, pesquise o m ´oduloscipy.optimize
Ajuste de func¸ ˜
oes (cont.)
Ü
a func¸ ˜ao np.polyfit(x, y, ngrau) ajusta um polin ˆomio de
grau ngrau ao conjunto de pontos y(x) e retorna uma lista com
os coeficientes do ajuste. O primeiro coeficiente da lista ´e o do
termo de maior grau
Ü
O m ´etodo do ajuste ´e dos m´ınimos quadrados. Por exemplo, para
um ajuste de uma reta ax + b a n pontos, os coeficientes s ˜ao
escolhidos de forma a minimizar a soma das dist ˆancias de cada
ponto `a curva, dada pela express ˜ao
χ
2=
n−1
X
j=0
(y
j− (ax
j+
b))
2Ü
Inclua no seu programa anterior
(antes de plt.show())# Obt´
em os coeficientes do ajuste de uma reta
coeff = np.polyfit(x, y, 1)
Ajuste de func¸ ˜
oes (cont.)
Ü a func¸ ˜ao np.poly1d(coeff) recebe a lista de coeficientes e transforma em uma func¸ ˜ao:
p = np.poly1d(coeff) print(p)
Ü Podemos superpor essa reta ajustada aos pontos
plt.plot( x, p(x), ’g-’, label = ’primeiro grau’ ) plt.legend()
Ü Outra func¸ ˜ao ´util ´e a np.polyval(p, x) que retorna o valor da func¸ ˜ao p no ponto x
print(np.polyval(p,20))
Ü Exerc´ıcio: Use esta func¸ ˜ao e a np.sum( express˜ao )para calcular o valor de χ2.
Ü acrescente os c ´alculos para um polin ˆomio de segundo grau
Ü para uma melhor comparac¸ ˜ao, devemos dividir o χ2pelo n ´umero de graus de liberdade que ´e o ( n ´um. de pontos – n ´um. par ˆametros da func¸ ˜ao).Lembre-se da func¸ ˜ao que retorna o n ´umero de pontos de um array