• Nenhum resultado encontrado

Me todos Computacionais em Fı sica I

N/A
N/A
Protected

Academic year: 2021

Share "Me todos Computacionais em Fı sica I"

Copied!
75
0
0

Texto

(1)

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

(2)

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.

(3)

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

(4)

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

(5)

Embelezando

(6)
(7)

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

(8)

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)

(9)

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

(10)

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)

(11)

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

(12)

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

(13)

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

(14)

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

(15)

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

(16)

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

(17)

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

(18)

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

(19)

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

(20)

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

(21)

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

(22)

Ü 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

(23)

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.

(24)

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.

(25)

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.

(26)

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

i

e x

i

+ ∆x .

N(x

i

)

depende da escolha da largura ∆x .

(27)

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

(28)

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

i

e x

i

+ ∆x .

N(x

i

)

depende da escolha da largura ∆x .

(29)

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 0

(30)

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 0

Observe que, para melhor visualizac¸ ˜ao, o gr ´afico cobre uma faixa um pouco maior que a faixa de valores de x

(31)

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

(32)

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

(33)

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

(34)

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

(35)

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

(36)

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

(37)

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

(38)

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

(39)

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

(40)

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

(41)

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

(42)

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

(43)

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

(44)

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

(45)

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

(46)
(47)

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:

(48)

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

(49)

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:

(50)

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

...

(51)

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

(52)

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

(53)
(54)

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)

(55)

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

(56)

maisDeUmPlot-2.py

(57)

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:

(58)

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

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

(59)

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

(60)

seno anim.py

import numpy as np

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

(61)

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

(62)

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

(63)

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)

(64)

Inic. de um Array c/ valores lidos de arquivo

Ü Uma outra forma de criar um array ´e atrav ´es da leitura dos valores

armazenados 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

(65)

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]

(66)

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

11

A

12

A

13

A

14

A

21

A

22

A

23

A

24

A

31

A

32

A

33

A

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

ij

se refere ao n ´umero que est ´a na linha i coluna j

(67)

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

(68)

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

(69)

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

(70)

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]

(71)

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 3

m

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)

(72)

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

(73)

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)

(74)

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

(75)

Referências

Documentos relacionados

Ao acessar a opção &#34;Alteração'' é possível ver o oferecimento do botão &#34;(Des)carrega CEST&#34; onde é possível executar carga ou descarga das informações relativas ao

■ Uma camada de diamantes braçados a vácuo, que proporcionam ao disco um desempenho de corte extraordinário, adequado para cortar a maioria dos materiais que possam ocorrer

Ü Atenc¸ ˜ao: A escolha da largura dos intervalos pode distorcer o comportamento dos dados que estamos analisando. 20 bins

A instalação deste item é obrigatória a fim de evitar erros com as alterações no esquema de banco de dados ao atualizar o Acelerador do PMO de versões anteriores do

Ü Uma outra forma de fazer loop no Python ´e a instruc¸ ˜ao for Ü ela ´e mais conveniente para trabalhar com listas (e arrays como.

Apresentac¸ ˜ao Computador Algoritmos Python Operac¸ ˜ oes Vari ´aveis Programas Repres..

Atualmente aluno no Programa de doutoramento em Ciência da Informação, especialidade Sistemas, Tecnologias e Gestão da Informação, na Universidade Fernando Pessoa (UFP),

• Considerando que o custo máximo admissível não tinha sido alcançado no primeiro momento, foi possível, através da aplicação da revisão da estrutura de custos, otimiza-la,