Conheça as tecnologias e referências educacionais que a Ufes indica para professores, estudantes e mediadores em
Força de Coriolis
Alguns filmes sobre esse efeito.
O primeiro é antigo mas muito ilustrativo.
Outro bem ilustrativo, esse do MIT;
Para fechar, uma resportagem de 2014 da National Geographic sobre o efeito.
Motor Boxer e a Física
Olá a todos,
hoje vamos mostrar o Motor Boxer e como podemos entender vários conceitos físicos estudando esse motor. Centro de Gravidade (igual ao Centro de Massa nesse caso), Vibrações entre outros conceitos;
O vídeo apesar de ser em inglês, é muito ilustrativo e auto explicativo;
Disciplinas do semestre 2015/1
Notícias para os alunos:
Em breve notícia sobre o motor boxer e seu desempenho campeão.
Horário de Atendimento aos alunos (inclusive Colegiado do Curso de Física) :
Semana do 6 a 10 de Julho:
Quarta – Feiras: 9:30h – 11:00h;
Quarta – Feira: 14:30h-16:30h;
Quintas – Feiras: 12:30h – 15:30h;
Sexta – Feira: 9h – 11h;
Acompanhe o blog semanalmente, pois em virtude de reuniões os dias e horários de atendimento pode sofrer alterações em algumas semanas.
Nada te impede de me procurar em outros dias e horários, mas nestes eu estou a disposição para tende-los.
Contato por email:
ramon.campos(arroba)ufes.br
troque o (arroba) pelo @, essa é uma medida para evitar os robozinhos que enviam mensagens aleatórias para meu email de trabalho.
Disciplinas do semestre 2015/1:
Veja abaixo a data da última atualização.
Eletromagnetismo 1 – 03 de Julho
Física Básica – 03 de Julho
E + abaixo temos notícias…
Transmissão de motocicletas
Esse aqui é para entender as diferenças de funcionamento, vantagens e desvantagem dos diferentes tipos de transmissão das motocicletas.
Vídeo do Youtube sobre o assunto.
Algumas motos para pensar no assunto dos custos de aquisição, e ver que não é só a transmissão que manda aqui, motor, acessórios e sistemas como ABS fazem muita diferença.
Yamaha – XT 660 – Motor 48 cv por R$ 28.870,00, ou um BMW G 650 motor de 50 cv por R$29.000,00. Mas poderia-se pagar R$33.680 em uma Ténéré 660 (Com ABS) ou R$ 30.990,00 na XL 700V Transalp (sem ABS) mas com motor 60 cv – Todas elas com corrente.
Por usa vez Hoda Shadow 750 – Motor 45,5 cv – sai a R$29.900,00 (Sem abs), mas com eixo cardan;
Finalmente se pode comprar uma Harley Davison Iron 883 – motor de ~51cv por exatos R$34.900,00 e ela vem com correia dentada, mas é uma Harley e no geral sempre vem com esse sistema .
Python – Aula 4
Computação Simbólica no IPython Notebook usando sympy
Disciplina “Computação no Ensino de Física” (CEF) da UFES/Alegre
Curso de Licenciatura em Física – Turma 2014/2
Autoria : Prof. Ramón Giostri Campos – 2014/2.
Veremos abaixo como usar o IPython notebook e o pacote matplotlib para fazer gráficos profissionais
Carregar o IPyhon notebook e os pacotes iniciais:
Digite $ipython notebook
no terminal do seu sistema operacional (shell no linux e prompt no windowns);
Abaixo vamos chamar os principais pacotes, separando eles por contexto
In [1]: %pylab inline
Populating the interactive namespace from numpy and matplotlib
%pylab inline = chama o pylab e coloca os graficos embutidos;
Exercício 1
Escreva um comentário ilustrativo sobre cada uma das linhas de input, assim como foi feito abaixo da primeira (e na ultima) linha da sequência de comandos;
# %pylab inline = chama o pylab e coloca os graficos embutidos;
(...)
#ion() #isso liga o modo interativo do matplotlib, usamos so se o inline nao for usado no primeiro comando!
Pintando curvas, pontos, e figuras geométricas;
Um gráfico bruto de uma reta, dado as coordenadas;
A ideia do matplotlib é usar uma interpolação linear dos pontos para gerar os gráficos, isso para retas não tem problema, mas para curvas…
x1=np.arange(-2,3) #domínio y1=(x1)**2 #Imagem plt.plot(x1,y1)
Claramente temos de almentar o número de pontos no intervalo para ter uma melhor interpolação…+ é bom não exagerar! Além disso podemos fazer uma coisa sistematizada mais elegante!
xi=-2. # limite inferior do domínio xf=2. #liminte superior do domínio numd=100. #número de divisões dx=(xf-xi)/numd #intervalo das divisões x1=np.arange(xi,xf+dx,dx) # Gera o vetor domínio y1=(x1)**2 # Gera o vetor imagem plt.plot(x1,y1)
Poderíamos encurtar a coisa usando o comando…
linspace
Vamos aprender mais um pouco sobre esse comando…
numpy.core.function_base: linspace(start, stop, num=50, endpoint=True, retstep=False) Return evenly spaced numbers over a specified interval. Returns `num` evenly spaced samples, calculated over the interval [`start`, `stop` ]. The endpoint of the interval can optionally be excluded. Parameters ---------- start : scalar The starting value of the sequence. stop : scalar The end value of the sequence, unless `endpoint` is set to False. In that case, the sequence consists of all but the last of ``num + 1`` evenly spaced samples, so that `stop` is excluded. Note that the step size changes when `endpoint` is False. num : int, optional Number of samples to generate. Default is 50. endpoint : bool, optional If True, `stop` is the last sample. Otherwise, it is not included. Default is True. retstep : bool, optional If True, return (`samples`, `step`), where `step` is the spacing between samples. Returns ------- samples : ndarray There are `num` equally spaced samples in the closed interval ``[start, stop]`` or the half-open interval ``[start, stop)`` (depending on whether `endpoint` is True or False). step : float (only if `retstep` is True) Size of spacing between samples. See Also -------- arange : Similar to `linspace`, but uses a step size (instead of the number of samples). logspace : Samples uniformly distributed in log space. Examples -------- >>> np.linspace(2.0, 3.0, num=5) array([ 2. , 2.25, 2.5 , 2.75, 3. ]) >>> np.linspace(2.0, 3.0, num=5, endpoint=False) array([ 2. , 2.2, 2.4, 2.6, 2.8]) >>> np.linspace(2.0, 3.0, num=5, retstep=True) (array([ 2. , 2.25, 2.5 , 2.75, 3. ]), 0.25) Graphical illustration: >>> import matplotlib.pyplot as plt >>> N = 8 >>> y = np.zeros(N) >>> x1 = np.linspace(0, 10, N, endpoint=True) >>> x2 = np.linspace(0, 10, N, endpoint=False) >>> plt.plot(x1, y, 'o') [<matplotlib.lines.Line2D object at 0x...>] >>> plt.plot(x2, y + 0.5, 'o') [<matplotlib.lines.Line2D object at 0x...>] >>> plt.ylim([-0.5, 1]) (-0.5, 1) >>> plt.show()
De qualquer forma isso é uma questão de gosto!
Vamos voltar aos nosso gráficos e tentar ver os pontos de um e do outro para enteder melhor o que se passa!
#Código para gerar os gráficos sobrepostos # xi=-2. # limite inferior do domínio xf=2. #liminte superior do domínio # # 5 Pontos, a subdivisão e os vetores de pontos correspondente # numd=5. #número de divisões dx=(xf-xi)/numd #intervalo das divisões x1=np.arange(xi,xf+dx,dx) y1=(x1)**2 # # 20 Pontos a subdivisão e vetor de pontos correspondente # numd=10. #número de divisões dx=(xf-xi)/numd #intervalo das divisões x2=np.arange(xi,xf+dx,dx) y2=(x2)**2 plt.plot(x1,y1,'r-',x2,y2,'go',x2,y2,'b-') #Isso sim é código mastigado!!!
[<matplotlib.lines.Line2D at 0x4a05ed0>, <matplotlib.lines.Line2D at 0x4a093d0>, <matplotlib.lines.Line2D at 0x4a09890>]
Exercício 2:
Tente descobri o que significam as opções ‘r-‘, ‘go’ e ‘b-‘ no gráfico acima.
Vamos as figuras geométricas agora:
Triângulos:
Você provavelmente notou que a sintax do python é diferente do que estamos acostumados lá da Geometria Analítica:
Em GA temos pares (x,y) e com 3 desses pares (não colineares) fazemos o triângulo.
No Matplotlib é fornecido duas listas, uma com todos os x’s e outra com todos os y’s;
Mas com um pouco de programação podemos tornar o matplotlib mais intuitivo.
#Script para fazer triângulos usandos os pares ordenados. # #Escreva os pares ordenados abaixo: pares=([-1,0],[0.5,2],[1,1]) print pares pares_f=pares+(pares[0],) # essa operação inclui um termo adicional igual ao primeiro termo na ultima posição; print pares_f pares_t=np.transpose(pares_f) # essa operação é a transposição da matriz (uma tupla do python que se comporta como matriz; print pares_t plt.plot(*pares_t)
([-1, 0], [0.5, 2], [1, 1]) ([-1, 0], [0.5, 2], [1, 1], [-1, 0]) [[-1. 0.5 1. -1. ] [ 0. 2. 1. 0. ]]
#Script para fazer triângulos usandos os pares ordenados. # #Escreva os pares ordenados abaixo: pares=([-1,0],[0.5,2],[1,1],[2,1]) print pares pares_f=pares+(pares[0],) # essa operação inclui um termo adicional igual ao primeiro termo na ultima posição; print pares_f pares_t=np.transpose(pares_f) # essa operação é a transposição da matriz (uma tupla do python que se comporta como matriz; print pares_t plt.plot(*pares_t)
([-1, 0], [0.5, 2], [1, 1], [2, 1]) ([-1, 0], [0.5, 2], [1, 1], [2, 1], [-1, 0]) [[-1. 0.5 1. 2. -1. ] [ 0. 2. 1. 1. 0. ]]
Aqui também podemos tentar algo mais elaborado, com cores e legenda.
from __future__ import unicode_literals # isso permite incluir acentos nos gráficos. E era um exercício em outra aula.
#Script para fazer triângulos usandos os pares ordenados e com legendas. # #Escreva os pares ordenados abaixo: pares=([-1,0],[0.5,2],[1,1]) # # pares_f=pares+(pares[0],) # essa operacao inclui um termo adicional igual ao primeiro termo na ultima posicao; pares_t=np.transpose(pares_f) # essa operacao e a transposicao da matriz (uma tupla do python que se comporta como matriz; plt.plot(pares_t[0],pares_t[1],'ro', label='Vértices') plt.plot(pares_t[0],pares_t[1],label='Lados') plt.title('Triângulo') plt.ylim((-0.1,2.1)) #expande a area visivel do eixo y plt.xlim((-1.1,1.1)) #expande a area visivel do eixo y plt.legend(loc='upper left') # legenda inclusive especificando a posição na figura plt.show()
Pintando pontos, e outros símbolos;
Se você passou por isso tudo, acredito que já tenha entendido como plotar pontos.
Vamos resumir para facilitar:
1 – Tome as duas listas de mesmo tamanho, uma representando os valores x’dos pontos e outra para os y’dos pontos (evidente que só pode ter número na lista).
2 – Insira as duas listas em sequência no comando PLOT (no nosso CONTEXTO plt.plot).
3 – Acrescente ‘o’ para o estilo de marcação de pontos, “-” para linha e “–” para linha tracejada.
Vamos mais exemplos;
Pontos aleatórios:
num_p=100 #total de pontos x=np.random.random_sample(num_p) #faz uma amostragem aleatório dos pontos para o x y= np.random.random_sample(num_p) #idem para o y plt.plot(x,y,'o')
Exercício 3:
Se em lugar de bolinhas azuis, tivéssemos sinais ‘+’ vermelhos, como faríamos isso?
Pontos de figuras regulares:
num=15 #numero de lados da figura dt= 2*np.pi/num #usamos a matriz de rotação sobre o vetor (1,1) para gerar os pares x e y lista_x=map(lambda t:(np.cos(t)+np.sin(t)),arange(0,2*pi+dt,dt)) lista_xf=append(lista_x,lista_x[0]) lista_y=map(lambda t:(-np.sin(t)+np.cos(t)),arange(0,2*pi+dt,dt)) lista_yf=append(lista_y,lista_x[0]) #expande a area visivel do eixo y plt.ylim((-1.5,1.5)) #usamos o valor de 1.5, pois o maior valor que pode ser alcançado aqui é raiz de 2; plt.xlim((-1.5,1.5)) # plt.plot(lista_x,lista_y) #linhas plt.plot(lista_x,lista_y,'o',label='Vértices') # vertices plt.legend(loc='upper left') # acerta a proporção dos eixos, você lembra que isso foi um problema na aula passada usando SymPy! plt.axes().set_aspect('equal')
num=5#numero de lados da figura dt= 2*np.pi/num #usamos a matriz de rotação sobre o vetor (1,1) para gerar os pares x e y lista_x=map(lambda t:(np.cos(t)+np.sin(t)),arange(0,2*pi+dt,dt)) lista_xf=append(lista_x,lista_x[0]) lista_y=map(lambda t:(-np.sin(t)+np.cos(t)),arange(0,2*pi+dt,dt)) lista_yf=append(lista_y,lista_x[0]) #expande a area visivel do eixo y plt.ylim((-1.5,1.5)) #usamos o valor de 1.5, pois o maior valor que pode ser alcançado aqui é raiz de 2; plt.xlim((-1.5,1.5)) # plt.plot(lista_x,lista_y) # acerta a proporção dos eixos, você lembra que isso foi um problema na aula passada usando SymPy! plt.axes().set_aspect('equal')
Movimento Browniano – Caminho aletório – Andar do Bêbado. Usando Scatter Plot;
Comecemos com um caso unidimensional que não precisa de gráfico.
num_p= 1000 #número de passos pa=0 lista_p=[0] for i in range(num_p-1): pn = 1.0*random_integers(0,1) # isso indica que ele pode dar um passo a frente(1) ou ficar parado (0) #alternativamente pode-se colocar -1 no lugar do ZERO, assim dizemos que o bêbado pode voltar um passo; pa=pn+pa lista_p=append(lista_p,pa) print 'A fração do caminho percorrido ao final de', +len(lista_p), 'passos foi',+ lista_p[-1]/len(lista_p)
A fração do caminho percorrido ao final de 1000 passos foi 0.499
Agora vamos construir duas listas usando esse procedimento e fazer o problema bidimensional;
num_p= 200 #número de passos pax=0 pay=0 lista_px=[0] lista_py=[0] for i in range(num_p-1): pnx = 1.0*random_integers(0,1) # isso indica que ele pode dar um passo a frente(1) ou ficar parado (0) #alternativamente pode-se colocar -1 no lugar do ZERO, assim dizemos que o bêbado pode voltar um passo; pax=pnx+pax lista_px=append(lista_px,pax) pny = 1.0*random_integers(-1,1) pay=pny+pay lista_py=append(lista_py,pay) plt.scatter(lista_px,lista_py)
<matplotlib.collections.PathCollection at 0x7201350>
Note que o código é muito parecido com o anterior, apenas duplicamos as funções do loop e no lugar de mostrar o print, fazemos o gráfico, no caso usando um scatter plot (genuino gráfico de pontinhos);
num_p= 10000 #número de passos pax=0 pay=0 lista_px=[0] lista_py=[0] lista=[0] for i in range(num_p-1): lista=append(lista,i) pnx = 1.0*random_integers(-1,1) # isso indica que ele pode dar um passo a frente(1) ou ficar parado (0) #alternativamente pode-se colocar -1 no lugar do ZERO, assim dizemos que o bêbado pode voltar um passo; pax=pnx+pax lista_px=append(lista_px,pax) pny = 1.0*random_integers(-1,1) pay=pny+pay lista_py=append(lista_py,pay) plt.scatter(lista_px,lista_py,s=50,c=lista) #pinta todos os pontos seguindo a distribuição do "i" para as cores; plt.scatter(lista_px[0],lista_py[0],s=120, c= 'g') #pinta o ultimo ponto maior e em vermelho plt.scatter(lista_px[-1],lista_py[-1],s=120, c= 'r') #pinta o ultimo ponto maior e em vermelho plt.show()
Gráficos de funções, de uma ou mais variáveis
Como vimos acima, tudo gira em torno de criar as listas corretas, uma de domínio (x) e uma para a imagem (f(x));
Usar em sequência para plotar os gráficos, vamos ver alguns exemplos:
Funções trigonométricas
xi=-2*pi # limite inferior do domínio xf=2*pi #liminte superior do domínio # numd=500. #número de divisões dx=(xf-xi)/numd x_lista=np.arange(xi,xf+dx,dx)
Seno e cosseno
y_sen=np.sin(x_lista) y_cos=np.cos(x_lista) plt.plot(x_lista,y_cos,'r--', label='Cos(x)') plt.plot(x_lista,y_sen,'b-',label='Sen(x)') plt.title('Trigonometria') plt.xlabel('x') plt.ylabel('f (x)') plt.legend(loc='upper right') # legenda inclusive especificando a posição na figura plt.show()
y_sen=np.sin(10.0*x_lista)*np.cos(x_lista) y_cos=np.cos(x_lista) plt.plot(x_lista,y_cos,'r--', label='+ - Sen(x)') plt.plot(x_lista,y_sen,'b-',label='Sen(10x)*Cos(x)') plt.plot(x_lista,-y_sen,'b-') # sem o label = sem aparecer na legenda! plt.title('Trigonometria') plt.xlabel('x') plt.ylabel('f (x)') plt.legend(loc='upper right') # legenda inclusive especificando a posição na figura plt.show()
Gráficos paramétricos
Curiosamente, dada a forma como os gráficos são feitos em Python isso se torna trivial…
ti=0 # limite inferior do parâmetro tf=10*pi #liminte superior do parâmetro # numd=500. #número de divisões dt=(tf-ti)/numd t_lista=np.arange(ti,tf+dt,dt) #Lista dos pontos do parâmetro x_cost=t_lista*np.cos(t_lista) #como x se relaciona com o parâmetro y_sent=t_lista*np.sin(t_lista) #como y se relaciona com o parâmetro plt.plot(x_cost,y_sent) plt.axes().set_aspect('equal')
[<matplotlib.lines.Line2D at 0x7228f90>]
# Usando teoria de coordenadas polares; ti=0 # limite inferior do parâmetro tf=10*pi #liminte superior do parâmetro # numd=1000. #número de divisões dt=(tf-ti)/numd t_lista=np.arange(ti,tf+dt,dt) #Lista dos pontos do parâmetro r_polar = cos(3*t_lista) #Raio das coordenadas pelares x_cost=r_polar*np.cos(t_lista) # x em termos de r e t y_sent=r_polar*np.sin(t_lista) # y em termosde r e t plt.plot(x_cost,y_sent) plt.axes().set_aspect('equal')
[<matplotlib.lines.Line2D at 0x88e4b50>]
# Usando teoria de coordenadas polares; ti=0 # limite inferior do parâmetro tf=10*pi #liminte superior do parâmetro # numd=1000. #número de divisões dt=(tf-ti)/numd t_lista=np.arange(ti,tf+dt,dt) #Lista dos pontos do parâmetro r_polar = cos(t_lista)*sin(t_lista) #Raio das coordenadas pelares x_cost=r_polar*np.cos(t_lista) # x em termos de r e t y_sent=r_polar*np.sin(t_lista) # y em termosde r e t plt.plot(x_cost,y_sent) plt.axes().set_aspect('equal')
[<matplotlib.lines.Line2D at 0x923e110>]
Outros gráficos 2D interessantes:
Regiões:
x = np.linspace(0, 4,100) y = np.sin(4*np.pi*x) * np.exp(-0.5 * x) plt.fill(x,y, 'b') plt.show()
Podemos inclusive misturar as coisas…
x = np.linspace(0, 6,100) y = np.sin(4*np.pi*x) * np.exp(-0.5 * x) plt.fill(x,y, 'r', label='Oscilação') y_e= np.exp(-0.5 * x) plt.plot(x,y_e, 'b', label='+ - Envoltória') plt.plot(x,-y_e,'b') plt.legend(loc='upper right') plt.show()
Histograma:
mu = 100 # media da disbribuicao sigma = 15 # desvio padrao x = mu + sigma * np.random.randn(10000) # amostra de 10 mil numeros num_bins = 50 # esse comando gera 3 resutados; n, bins, patches = plt.hist(x, num_bins, normed=1, facecolor='green', alpha=0.4) # fazendo o ajuste da curva normal ao histograma y = mlab.normpdf(bins, mu, sigma) plt.plot(bins, y, 'r--') #Titulos plt.xlabel('Valores Prováveis') plt.ylabel('Probabilidade') plt.title(r'Histograma de IQ: $\mu=100$, $\sigma=15$') # chega os graficos para o lado plt.subplots_adjust(left=0.15) plt.show()
Visualização de figuras de mais variáveis;
from mpl_toolkits.mplot3d import Axes3D #para fazer gráficos 3D
mpl.rcParams['legend.fontsize'] = 10 fig = plt.figure() ax = fig.gca(projection='3d') theta = np.linspace(-4 * np.pi, 4 * np.pi, 100) z = np.linspace(-2, 2, 100) x = np.sin(theta) y = np.cos(theta) ax.plot(x, y, z, label='Curva Espiral') ax.legend() plt.show()
mpl.rcParams['legend.fontsize'] = 10 fig = plt.figure() ax = fig.gca(projection='3d') theta = np.linspace(0, 4 * np.pi, 200) r = theta x = r*np.sin(4*theta) y = r*np.cos(4*theta) z = theta**0.5 ax.plot(x, y, z, label='Tornado') ax.legend() plt.show()
mpl.rcParams['legend.fontsize'] = 10 fig = plt.figure() ax = fig.gca(projection='3d') theta = np.linspace(0, 4 * np.pi, 200) r = theta x = r*np.sin(4*theta) y = r*np.cos(4*theta) z = theta ax.plot(x, y, z, label='Tornado') ax.plot(0.5*x, 0.5*y, 3*z, label='Outro Tornado') ax.legend() plt.show()
mpl.rcParams['legend.fontsize'] = 10 fig = plt.figure() ax = fig.gca(projection='3d') theta = np.linspace(0, 4 * np.pi, 200) r = theta x = r*np.sin(4*theta) y = r*np.cos(4*theta) z = theta ax.plot(x, y, z, label='Tornado') plt.plot(x, y, label='Sombra do Tornado') ax.plot(x,0.*y+15,z, label='Outra Sombra do Tornado') #ax.legend() plt.show()
Campo Vetorial
Y, X = np.mgrid[-3:3:100j, -3:3:100j] U = -1 - X**2 + Y V = 1 + X - Y**2 speed = np.sqrt(U*U + V*V) plt.streamplot(X, Y, U, V, color=U, linewidth=2, cmap=plt.cm.autumn) plt.colorbar() f, (ax1, ax2) = plt.subplots(ncols=2) ax1.streamplot(X, Y, U, V, density=[0.5, 1]) lw = 5*speed/speed.max() ax2.streamplot(X, Y, U, V, density=0.6, color='k', linewidth=lw) plt.show()
#Campo elétrico da carga elétrica pontual! Y, X = np.mgrid[-3:3:100j, -3:3:100j] #Pontos do vetor r U = X/(X**2 +Y**2)**1.5 # Coordenada X do Campo V = Y/(X**2 +Y**2)**1.5 # Coordenada Y do Campo plt.streamplot(X, Y,U,V, color=U, linewidth=2, cmap=plt.cm.autumn) plt.show()
#Campo magnético do fio retilíneo Y, X = np.mgrid[-3:3:100j, -3:3:100j] #Pontos do vetor r U = -Y/(X**2 +Y**2)**1.5 # Coordenada X do Campo V = X/(X +Y**2)**1.5 # Coordenada Y do Campo plt.streamplot(X, Y,U,V, color=U, linewidth=2, cmap=plt.cm.autumn) plt.show()
Animação
As vezes é importante rodar as coisas em um script separado, abaixo temos um exemplo!
#Retire os comentarios das linhas 2 abaixo apenas nos scripts. Nao coloque acentos no comentario do script. #import numpy as np #import matplotlib.pyplot as plt import matplotlib.animation as animation fig = plt.figure() def f(x, y): return np.sin(x) + np.cos(y) x = np.linspace(0, 2 * np.pi, 120) y = np.linspace(0, 2 * np.pi, 100).reshape(-1, 1) im = plt.imshow(f(x, y), cmap=plt.get_cmap('jet')) def updatefig(*args): global x,y x += np.pi / 15. y += np.pi / 20. im.set_array(f(x,y)) return im, ani = animation.FuncAnimation(fig, updatefig, interval=50, blit=True) plt.show()
Outra coisa que pode ficar melhor de ver com script separado…
# Retire os comentarios das linhas 3 abaixo apenas nos scripts. #import numpy as np #from mpl_toolkits.mplot3d import Axes3D #import matplotlib.pyplot as plt # Nao coloque acentos no comentario do script. fig = plt.figure() ax = fig.gca(projection='3d') num_p= 1000 #numero de passos pax=0 pay=0 paz=0 lista_px=[0] lista_py=[0] lista_pz=[0] lista=[0] for i in range(num_p-1): lista=np.append(lista,i) #Numeros do x pnx = 1.0*np.random.random_integers(-1,1) # isso indica que ele pode dar um passo a frente(1) ou ficar parado (0) #alternativamente pode-se colocar -1 no lugar do ZERO, assim dizemos que o bebado pode voltar um passo; pax=pnx+pax lista_px=np.append(lista_px,pax) #Numeros do y pny = 1.0*np.random.random_integers(-1,1) pay=pny+pay lista_py=np.append(lista_py,pay) #Numeros do z pnz = 1.0*np.random.random_integers(-1,1) paz=pnz+paz lista_pz=np.append(lista_pz,paz) ax.scatter(lista_px,lista_py,lista_pz,s=15,c=lista,marker='+') #pinta todos os pontos seguindo a distribuicao do "i" para as cores; ax.scatter(lista_px[0],lista_py[0],lista_pz[0],s=400, c= 'g') #pinta o ultimo ponto maior e em vermelho ax.scatter(lista_px[-1],lista_py[-1],lista_pz[-1],s=400, c= 'r') #pinta o ultimo ponto maior e em vermelho plt.show()
:
Python – Aula 3
Computação Simbólica no IPython Notebook usando sympy
Disciplina “Computação no Ensino de Física” (CEF) da UFES/Alegre
Curso de Licenciatura em Física – Turma 2013/2
Autoria : Prof. Ramón Giostri Campos – 2014/1.
Veremos abaixo como usar o IPython notebook para realizar cálculos simbólicos, usando o pacote sympy, no processo vamos exercitar a definição de funções (def) em python e gráficos usando o próprio sympy.
Carregar o IPyhon notebook e os pacotes iniciais:
Digite $ipython notebook
no terminal do seu sistema operacional (shell no linux e prompt no windowns);
Abaixo vamos chamar os principais pacotes
%pylab inline
Populating the interactive namespace from numpy and matplotlib
É importante usar os pacotes compatíveis, como estamos usando o ipython novo, devemos usar o sympy novo.
No ubuntu uma solução é fazer download do sympy mais novo no sítio:
http://sympy.org/pt/download.html
Dai descompactamos e colocamos o arquivo que queremos executar (file.ipynb) dentro do diretório do recém descompactado.
import sympy as sym # importa as funções do sympy em um contexto diferenciado (no caso sym) from sympy import *
A mudança de contexto presente na primeira linha é importante para não sobrepor as funções vindas do sympy com as funções nativas do python e do pylab.
Executamos agora um comando para ver qual a versão do sympy, se tudo foi feito corretamente, o número que aparece aqui é o mesmo que está no pacote baixado do site e descompactado posteriormente;
from sympy import __version__ __version__
'0.7.4.1'
Primeiro estágio: Operações básicas e considerações iniciais
3*pi/2 + exp(I*x) / (x**2 + y)
--------------------------------------------------------------------------- NameError Traceback (most recent call last) <ipython-input-4-057106a93d7b> in <module>() ----> 1 3*pi/2 + exp(I*x) / (x**2 + y) NameError: name 'x' is not defined
É importante dizer para o sympy quais as objetos são SÍMBOLOS;
x, y, z, t = symbols("x y z t") # Define símbolos para variáveis genericas
k, m, n = symbols("k m n", integer=True) # Define símbolos para variáveis inteiras
f, g, h = map(Function, 'fgh') # define símbolos para funções
3*pi/2 + sym.exp(I*x) / (x**2 + y)
3*pi/2 + exp(I*x)/(x**2 + y)
Agora o Python entendeu o que fazer, pois x e y são símbolos.
Mas essa forma 1D é difícil de ler e muito feia…vamos melhorar isso.
Para isso devemos carregar o comando abaixo:
init_printing()
Vamos repetir o nosso teste;
3*pi/2 + sym.exp(I*x) / (x**2 + y) #Muito mais bonito!
Algumas ações que podem ser feitas com expressões simbólicas: expandir (expand), simplificar(simplify) e resolver(solve);
eq = ((x+y)**2 * (x+1)) eq
expand(eq)
a = 1/x + (x*sin(x) - 1)/x print(a) #assim fica feito display(a) #assim fica bonito
simplify(a)
eq2 = Eq(x**3 - 3*x**2 + 4*x + 8., 0) display(eq2)
Notem que a equação gerada usa o comando “Eq”, para definir a igualdade;
solve(eq2,x)
Exercícios 1: Tente resolver equações de ordem maior que 3 e equações transcendentais com o solve para ver o que ocorre;
Terceiro esstágio: Física B;
Vamos começar com o sistema massa mola: F=-kx; A segunda lei de Newtom para ele nos gera ma+k*x=0, que em termo de derivadas e já dividindo pela massa fica:
w0=symbols("w_0",real=True)
Atentem para a Flag “real”, isso significa que o símbolo w0 é REAL;
eqn = Eq(Derivative(x(t),t,t) + w0**2*x(t), 0) # já trocamos k/m por w0**2 display(eqn) dsolve(eqn, x(t))
E se houvesse atrito, como ficaria.
b=symbols("b",real=True)
eqn2 = Eq(Derivative(x(t),t,t) +b*Derivative(x(t),t)+ w0**2*x(t), 0) # já trocamos k/m por w0**2 display(eqn2) dsolve(eqn2, x(t))
Não se assunste, isso é feio assim pois o sympy não sabe quem é maior, b ou w0
Se b e w0 forem conhecidos teremoss algo relativamente simples;
eqn2_crit = Eq(Derivative(x(t),t,t) +4*Derivative(x(t),t)+ (2**2)*x(t), 0) # já trocamos w0=2 e b=4 display(eqn2_crit) dsolve(eqn2_crit, x(t))
eqn2_super = Eq(Derivative(x(t),t,t) +5*Derivative(x(t),t)+ (2**2)*x(t), 0) # já trocamos w0=2 e b=5 display(eqn2_super) dsolve(eqn2_super, x(t))
eqn2_sub = Eq(Derivative(x(t),t,t) +3*Derivative(x(t),t)+ (2**2)*x(t), 0) # já trocamos w0=2 e b=3 display(eqn2_sub) dsolve(eqn2_sub, x(t))
E se houvesse uma força externa, por exemplo senoidal!
wp, A=symbols("w_p A",real=True)
eqn3 = Eq(Derivative(x(t),t,t) + w0**2*x(t)-A*sin(wp*t), 0) # já trocamos k/m por w0**2 display(eqn3) sol3=dsolve(eqn3, x(t)) display(sol3)
Exercício 2: Descubra se é possível reaproveitar o que é gerado do solve e do dsolve sem necessariamente digitar as equações manualmente;
Terceiro estágio: Cálculo B;
Primeiro vejamos uma derivada, já usamos ela acima nas equações diferencias.
Usamos os comandos “Derivative” para escrever a derivada e o comando “diff” para realizar a derivação;
Derivative(cos(m*x**k)**10,x)
diff(cos(m*x**k)**10,x)
Note que o comando “Derivative” é esperto, e se tivermos uma expressão com duas VARIÁVEIS, ele imprime na tela uma derivada parcial em lugar da derivada ordinária;
Derivative(cos(y*x**k),x)
Agora vamos a integral, não necessariamente uma simples.
Usamos o comando “Integral” para escrever a INTEGRAL sem resolve-la e o comando “integrate” para INTEGRAR e ver o resultado;
Integral(sin(k*x)*sin(m*x),(x,-pi/2,pi/2))
integrate(sin(k*x)*sin(m*x),(x,-pi/2,pi/2))
Essa é uma das integrais da base da Série de Fourier, usada nas séries de Fourier, muito importante para resolver problemas de MECÂNICA CLÁSSICA e ELETROMAGNETISMO.
Exercício 3: Pesquise quais as outras integrais dessa base e use o sympy para resolve-las;
Vamos a um exemplo mais trabalhoso, vamos investigar as Séries de Taylor:
Séries de Taylor (e outros tipos) são uma formas de aproximar funções ao redor de um ponto de avaliação.
series(f(x),x,0,6)
Ainda é possível fazer de outra forma…
f(x).series(x,0,6)
Adiantes vamos estudar graficamente a questão da aproximação das seríes de Taylor.
Tendo o SYMPY em funcionamento, é possivel fazer gráficos nele usando um comando tipo PLOT, porém o sym.plot é menos rico que o plt.plot (do MATPLOTLIB) que usamos na aula passada. Mas ele quebra bem o galho e tem uma sintax super simples;
Plot do sympy básico
sym.plot(cos(x))
<sympy.plotting.plot.Plot at 0x5d261d0>
Note que não houve necessidade de gerar o dois vetores de números (usando NUMPY ARANGE) para gerar o gráfico (na verdade essa sintax é absurdamente simples).
sym.plot(cos(x),sin(x),log(x)) # vários gráficos
<sympy.plotting.plot.Plot at 0x61eb810>
sym.plot(cos(x),log(x),(x,0.1,2*pi)) # gráficos com intervalos semelhantes definidos
<sympy.plotting.plot.Plot at 0x6203490>
sym.plot((cos(x),(x,-pi,2*pi)),(log(x),(x,0.1,2*pi))) # gráficos com intervalos diferentes definidos
<sympy.plotting.plot.Plot at 0x6478950>
Para inspecionar coisas simples, esse comando funciona muito bem, para gráficos realmente profissionais devemos usar o MATPLOTLIB. A a sintax simples é muito limitada e mesmo ações simples como mudar a cor dos gráficos já deixa deixa a simplicidade de lado;
p=sym.plot((cos(x),(x,-pi,2*pi)),(log(x),(x,0.1,2*pi)), show=False) p[0].line_color = 'red' p[1].line_color = 'green' p.title = 'Figuras Coloridass' p.show()
p=sym.plot((cos(x),(x,-pi,2*pi)),(log(x),(x,0.1,2*pi)), show=False) p[0].line_color = (0.5,1,1) #aqui usando RGB; p[1].line_color = lambda a : log(a) # Aqui usando uma função para mapear a cor; p.title = 'Figuras Coloridass' p.show()
Exercício 4: Pesquise se é possível colocar o nome dos eixos nos gráficos do sympy; Se sim, mostre um exemplo;
Quarto estágio: O que você não faria facilmente;
Vamos agora fazer uma função que faça a comparação da função e da séries;
def f_taylor_ordem(func, var=x, ordem=5): ftaylor = func.series(var,0,ordem).removeO() return ftaylor
Definimos uma função que faz a série de Taylor de uma função genérica (variável func), expandida na variável específica (var), que por omissão é escolhida variável x (var=x) e na ordem que quisermos (ordem), que por omissão é a ordem 5 (ordem=5);
Atente para o remove0() do final, ele serve para transformar a sérei em polinômio.
f_taylor_ordem(sinh(x*cos(t))) #tudo funcionando por omissão
f_taylor_ordem(sinh(x*cos(t)),t,5)#aqui espeficicando a variável e a ordem
Vamos agora unir essa função a estrutura que gera gráficos do sympy;
def plot_taylor_compara(func, var=x, rang=(-1,1),yrang=(-1.2,1.2),ordem=[1,5]): xrang = (var,)+rang arg_plot=(func,)+tuple(map(lambda num:f_taylor_ordem(func,var,num),ordem))+(xrang,) display(arg_plot) sym.plot(*arg_plot,ylim=yrang)
Existem 4 soluções importantes usadas aqui que merecem destaque:
1 – Operações com TUPLAS: Note que a forma de definir o intervalo do plot é uma tupla, fazermos uma operação de soma com duas tuplas para gerar o formato esperado pelo plot;
2 – Uso do MAP, map mapeia em uma função os elementos listados;
map(f(x),[1,2,3]) = [f(1),f(2),f(3)]
Mas o map mapeia em uma função e devemos avisar para ele qual é a variável que ele deve mapear, para isso usamos…
3 – Função LAMBDA, essa função basicamente deixa aberto o espaço da variável declarada na função em que está aplicada. O map mapeará nesse espaço aberto;
O MAP + LAMBDA poderiam ser substituidos por um loop, mas em geral o loop é mais lento que o MAP + LAMBDA;
4 – Usar o “” para aplicar uma tupla como argumento de uma função do python; Apenas substituir a tupla não funciona, umando nome_da_tupla, os n elementos são aplicados um após o outro como argumentos da função;
Exercício 5: Como verificamos que a forma de definir intervalo no sym.plot é uma tupla?
Exercício 6: Faça o loop correspondente ao MAP abaixo;
map(lambda x:sin(pi*x/8),range(10))
Vamos testar nossa criação: plot_taylor_compara
plot_taylor_compara(tan(x)) # com omissão dos parâmetros
plot_taylor_compara(tan(x),x,(-1.5,1.5),(-3,3),[1,3,5,7,9]) # especificando tudo
Fica uma confusão para ler essses gráficos;
Vamos incluir cores:
def plot_taylor_compara_color(func, var=x, rang=(-3.14,3.14),yrang=(-1.2,1.2),ordem=[1,5]): xrang = (var,)+rang arg_plot=(func,)+tuple(map(lambda num:f_taylor_ordem(func,var,num),ordem))+(xrang,) gr=sym.plot(*arg_plot,ylim=yrang,title= "Grafico "+string0(func) + "e suas expansoes nas ordens "+string0(ordem),show=False) for i in range(1,len(ordem)+1): rgb=((1./random_integers(1,15)),(1./random_integers(1,15)),(1./random_integers(5,15))) gr[i].line_color = rgb gr.show() print 'A função ' + string0(func) + ' sempre é azul!'
Exercício 7: Qual a serventia do random_integers?
Vamos ver o resultado do nosso trabalho…
plot_taylor_compara_color(exp(x)) # isso não ajudou muito!
A função exp(x) sempre é azul!
plot_taylor_compara_color(exp(x),x,(-8,20),(-10,200),range(1,8,1)) # especificando tudo
A função exp(x) sempre é azul!
plot_taylor_compara_color(exp(x),x,(-8,20),(155,165),range(1,8,1)) # Vamos mexer no yrange para ver melhor o que ocorre x=5;
A função exp(x) sempre é azul!
plot_taylor_compara_color(log(x+1),x,(0,2),(-0.75,1.5),range(2,15,1)) # Só está aqui pq é legal!
A função log(x + 1) sempre é azul!
Um pouco mais sobre gráficos do sympy
Como dissemos antes, para gráficos realmente profissionais devemos usar o MATPLOTLIB.
Mas mesmo com suas limitações, os gráficos do sympy são bastante versátis e com eles é possível esboçar muita coisa;
Gráficos implícitos;
sym.plot_implicit(Eq(x**2 + y**2, 4))
<sympy.plotting.plot.Plot at 0x69da0d0>
plot_implicit(y > x**2 ,(x,-1,1)) # podemos pintar áreas
<sympy.plotting.plot.Plot at 0x79d1390>
plot_implicit(And(y > x**2 , y < sqrt(x)),(x,-1,1.5),(y,-1,2),title='Intersecao de duas curvas') # podemos fazer algumas operações lógicas
<sympy.plotting.plot.Plot at 0x6729750>
plot_implicit(Or(And(y > x**2 , y < sqrt(x)),And(y < -x**2 , y > -sqrt(-x))),(x,-1,1.5),(y,-1,2)) # Um pouco mais de operações lógicas
<sympy.plotting.plot.Plot at 0x7d442d0>
Gráficos paramétricos
from sympy.plotting import plot_parametric
plot_parametric(cos(x), sin(x), (x, 0, 2*pi))
<sympy.plotting.plot.Plot at 0x79d1110>
plot_parametric(x*cos(x), x*sin(x), (x, 0, 10*pi))
<sympy.plotting.plot.Plot at 0x6217390>
plot_parametric(cos(x)*cos(x), cos(x)*sin(x), (x, 0, 2*pi))
<sympy.plotting.plot.Plot at 0x7a6bf90>
plot_parametric(cos(20*x)*cos(x), cos(10*x)*sin(x), (x, 0, 2*pi),axis=False) # Até um pouco de arte da para fazer!
<sympy.plotting.plot.Plot at 0xb155e50>
pl=plot_parametric(cos(20*x)*cos(x), cos(10*x)*sin(x), (x, 0, 2*pi),axis=False,show=False) pl[0].line_color= lambda a: log(0.001*a) pl.show()
Exercício 8 : Descubra se sympy faz gráficos 3D, em caso afirmativo mostre exemplos.
Python – Aula 2
Primeiros Passos no IPython Notebook
Disciplina “Computação no Ensino de Física” (CEF) da UFES/Alegre
Curso de Licenciatura em Física – Turma 2013/2
Autoria : Prof. Ramón Giostri Campos – 2014/1.
Veremos abaixo como usar o IPython notebook como calculadora inteligente, como manipular strings, como criar estruturas (testes, loop, funçoes e et cetera), vamos tentar fazer alguns gráficos mais simples.
Depois veremos como misturar essas coisas;
Carregar o IPyhon notebook:
Digite $ipython notebook –pylab inline
A primeira parte “ipython notebook” é comum. A segunda parte ” –pylab inline” é opcional, porém ela é muito interessante pois permite que incluir os gráficos do matplotlib feitos aqui diretamente no corpo deste documento; Inclusive isso carrega automaticamente o PyLab (numpy e matplotlib);
Exercício 1
Pesquise outra forma de carregar o Pylab, para o caso de não usarmos o comando “–pylab inline” (isso as vezes é conveniente);
Usando como uma calculadora:
Note que apertar “enter”, apenas pula de linha (isso será útil mais tarde) e para executar a linha damos “shift+enter”
1+1
2
In [2]:
(50-5*6)/4
5
5/2
2
Opa!!! Tem algo estranho aqui … sabemos que 5/2 = 2,5 . Mas o Python, assim como Fortran, C, Pascal, divisão de INTEIROS é truncada e com resultado INTEIRO;
Resolvemos o impasse simplismente enfiando um número REAL (tipo float) na conta;
5/float(2)
2.5
Ou de forma mais simples, coloque um ponto em algum dos números!
5/2.
2.5
5./2
2.5
Note que claramente 2 não é igual a 2. (pelo menos no contexto de programação), por outro lado em termos de quantidade eles representam a mesma coisa.
2 is 2.
Out[7]:
False
2==2.
True
Falaremos mais sobre testes em outro momento. Agora vamos continuar com a calculadora.
sqrt(2)
1.4142135623730951
exp(1)
2.7182818284590451
log(1.1)
0.095310179804324935
pi
3.141592653589793
In [13]:
sin(pi/4)
0.70710678118654746
tan(pi/2)
16331239353195370.0
Note que por ser tratar de um cálculo numérico, a tangente de pi/2 é calculada (só que dá um número muito grante). Sabemos que isso não é verdade.
Vamos definir algumas variáveis agora,
comprimento =10
largura = 20
area = comprimento * largura
area
200
altura = 5
volume = area * altura
volume
1000
Apesar do PyLab carregar muitas funções matemáticas, algumas ainda estão de fora, uma delas é o fatorial.
n! = n (n-1)(n-2)(n-3)…432*1
Corrigimos isso importando a seguinte função do pacote matemático MATH;
from math import factorial
factorial(12)
479001600
Agora vamos manipular algumas STRINGS
'Assim pintamos strings'
'Assim pintamos strings'
saldacao = ' Como vai?'
complemento = ' E ai Fulano!'
complemento + saldacao
' E ai Fulano! Como vai?'
"Funciona com duas aspas"
'Funciona com duas aspas'
"Mas os acentos não funcionam"
'Mas os acentos n\xc3\xa3o funcionam'
Para esses casos use o PRINT
print complemento + saldacao, " não está bem!"
E ai Fulano! Como vai? não está bem!
Listas
Isso é natural no Python
dias_da_semana = ["domingo","segunda","terça","quarta", "quinta", "sexta", "sábado"]
dias_da_semana[2]
'ter\xc3\xa7a'
print dias_da_semana[-1]
sábado
len(dias_da_semana)
Out[29]:
7
Exercício 2
Pesquise como descobrir mais informações sobre esse comando “len”?
Listas numéricas agora.
Usamos o RANGE (significa série ou variação em inglês)
?range
range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
range(5,10)
[5, 6, 7, 8, 9]
range(1,10,2)
[1, 3, 5, 7, 9]
range(1,10,0.2)
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-35-cab7b13a5a94> in <module>() ----> 1 range(1,10,0.2) TypeError: range() integer step argument expected, got float.
Usamos para isso o arange, que é uma rotina do NumPy
lista_float=arange(1,10,0.2)
print lista_float
type(lista_float)
[ 1. 1.2 1.4 1.6 1.8 2. 2.2 2.4 2.6 2.8 3. 3.2 3.4 3.6 3.8 4. 4.2 4.4 4.6 4.8 5. 5.2 5.4 5.6 5.8 6. 6.2 6.4 6.6 6.8 7. 7.2 7.4 7.6 7.8 8. 8.2 8.4 8.6 8.8 9. 9.2 9.4 9.6 9.8]
numpy.ndarray
lista_float
array([ 1. , 1.2, 1.4, 1.6, 1.8, 2. , 2.2, 2.4, 2.6, 2.8, 3. , 3.2, 3.4, 3.6, 3.8, 4. , 4.2, 4.4, 4.6, 4.8, 5. , 5.2, 5.4, 5.6, 5.8, 6. , 6.2, 6.4, 6.6, 6.8, 7. , 7.2, 7.4, 7.6, 7.8, 8. , 8.2, 8.4, 8.6, 8.8, 9. , 9.2, 9.4, 9.6, 9.8])
Listas MISTAS
mista = [1, "lista", "estranha", 100.]
mista
[1, 'lista', 'estranha', 100.0]
type(mista)
list
?list
Cuidado, pois dependendo de como você gera uma “lista”, ela pode não ser defato uma lista (seja ela mista ou não).
tupla_mista = (1, "lista", "estranha", 100.)
type(tupla_mista)
tuple
?tuple
set_mista = {1, "lista", "estranha", 100.}
type(set_mista)
set
?set
Vamos as estruturas:
Loop
Exercício 3 – Tente ler o comando abaixo:
for i in range(len(mista)): tipo = type(mista[i]) print tipo
<type 'int'> <type 'str'> <type 'str'> <type 'float'>
Teste verdadeiro ou falso:
Teste de Igual
2==2.
True
O duplo igual (==) é usado para o teste, pois tradicionalmente o igual simples (=) é usado para atribuição de valor;
v=2
v==float(2)
--------------------------------------------------------------------------- NameError Traceback (most recent call last) <ipython-input-50-1fafca712b6d> in <module>() ----> 1 v==float(2) NameError: name 'v' is not defined
Outros testes:
2!=2.0
False
2<1.01
False
2<=1.01
False
2>1.01
True
2>=1.01
True
for dia in dias_da_semana: qual_dia = "Hoje é " + dia print qual_dia if dia == "domingo": print " Durmi até tarde" elif dia == "sábado": print " Dia de tormir tarde..." else: print " Vou ao trabalho"
Hoje é domingo Durmi até tarde Hoje é segunda Vou ao trabalho Hoje é terça Vou ao trabalho Hoje é quarta Vou ao trabalho Hoje é quinta Vou ao trabalho Hoje é sexta Vou ao trabalho Hoje é sábado Dia de tormir tarde...
Definindo funções
Vamos voltar ao tal do fatorial(n!), poderíamos fazer um no lugar de pegar um pronto.
Construindo a função Fatorial (Exercício 4 -> pesquisar outra forma de fazer o fatorial)
def fatorial(m): # aqui dizemos quem é a função j = 1 # n = m if n > 1: # Faz o teste se o número é maior que um; for i in range(1, n + 1): # Loop para fazer as multiplicações j = j * i # Interação return j # Retorno o resultado else: return 1 #Cuidado com a identação ela pode gerar erros!
fatorial(12)
479001600
fatorial(12.11)
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-58-408a4ad43407> in <module>() ----> 1 fatorial(12.11) <ipython-input-56-477990fc6bce> in fatorial(m) 3 n = m 4 if n > 1: # Faz o teste se o número é maior que um; ----> 5 for i in range(1, n + 1): # Loop para fazer as multiplicações 6 j = j * i # Interação 7 return j # Retorno o resultado TypeError: range() integer end argument expected, got float.
factorial(12.1)
--------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-59-c8a524155186> in <module>() ----> 1 factorial(12.1) ValueError: factorial() only accepts integral values
Exercício 5 – Tente bolar um filtro para números interios no nosso fatorial construído;
Soma da PA (Progressão Aritmética)
def somapa(a1,n,r): an = a1 + (n-1)*r #n-ésimo termo; sn = n*(a1+an)/2 #soma dos n primeiros termos return sn
somapa(1,10,2)
100
Soma da PG (Progressão Geométrica)
def somapg(a1,n,q): sn = a1*(1-q**n)/(1-q) #soma dos n primeiros termos return sn
somapg(1,10,2)
1023
Um pouco de gráficos (só para sentir o gostinho)
Primeiro vamos carregar o módulo gráfico
import matplotlib.pyplot as plt
Essa forma de carregar acrescente o prefixo plt nas funções carregadas pelo módulo. Funções com essa característica estão num CONTEXTO específico (nesse caso plt);
Digite os comandos help(plt) e dir(plt), para ver respectivamente o HELP do pacote e a LISTA de funções carregadas
x=arange(2,10,0.1) print x
[ 2. 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 3. 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 4. 4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 4.9 5. 5.1 5.2 5.3 5.4 5.5 5.6 5.7 5.8 5.9 6. 6.1 6.2 6.3 6.4 6.5 6.6 6.7 6.8 6.9 7. 7.1 7.2 7.3 7.4 7.5 7.6 7.7 7.8 7.9 8. 8.1 8.2 8.3 8.4 8.5 8.6 8.7 8.8 8.9 9. 9.1 9.2 9.3 9.4 9.5 9.6 9.7 9.8 9.9]
É importante usar o ARANGE, no lugar do RANGE, para gerar uma lista passivel de ser usada pela função;
ypa=somapa(1,x,2) print ypa
[ 4. 4.41 4.84 5.29 5.76 6.25 6.76 7.29 7.84 8.41 9. 9.61 10.24 10.89 11.56 12.25 12.96 13.69 14.44 15.21 16. 16.81 17.64 18.49 19.36 20.25 21.16 22.09 23.04 24.01 25. 26.01 27.04 28.09 29.16 30.25 31.36 32.49 33.64 34.81 36. 37.21 38.44 39.69 40.96 42.25 43.56 44.89 46.24 47.61 49. 50.41 51.84 53.29 54.76 56.25 57.76 59.29 60.84 62.41 64. 65.61 67.24 68.89 70.56 72.25 73.96 75.69 77.44 79.21 81. 82.81 84.64 86.49 88.36 90.25 92.16 94.09 96.04 98.01]
ypg=somapg(1,x,2) print ypg
[ 3. 3.28709385 3.59479342 3.92457765 4.27803164 4.65685425 5.06286627 5.49801917 5.96440451 6.46426393 7. 7.5741877 8.18958684 8.84915531 9.55606329 10.3137085 11.12573253 11.99603834 12.92880901 13.92852786 15. 16.1483754 17.37917368 18.69831061 20.11212657 21.627417 23.25146506 24.99207668 26.85761803 28.85705573 31. 33.2967508 35.75834736 38.39662123 41.22425314 44.254834 47.50293013 50.98415337 54.71523605 58.71411146 63. 67.5935016 72.51669472 77.79324245 83.44850629 89.50966799 96.00586026 102.96830673 110.4304721 118.42822292 127. 136.1870032 146.03338944 156.58648491 167.89701258 180.01933598 193.01172051 206.93661347 221.8609442 237.85644583 255. 273.37400641 293.06677888 314.17296982 336.79402516 361.03867197 387.02344103 414.87322693 444.72188841 476.71289167 511. 547.74801282 587.13355776 629.34593963 674.58805032 723.07734394 775.04688205 830.74645387 890.44377682 954.42578333]
plt.plot(x,ypa,x,ypg)
[<matplotlib.lines.Line2D at 0x44ba790>, <matplotlib.lines.Line2D at 0x44ba610>]
Primeiros Passos no IPython Notebook
Disciplina “Computação no Ensino de Física” (CEF) da UFES/Alegre
Curso de Licenciatura em Física – Turma 2013/2
Autoria : Prof. Ramón Giostri Campos – 2014/1.
Veremos abaixo como usar o IPython notebook como calculadora inteligente, como manipular strings, como criar estruturas (testes, loop, funçoes e et cetera), vamos tentar fazer alguns gráficos mais simples.
Depois veremos como misturar essas coisas;
Carregar o IPyhon notebook:
Digite $ipython notebook –pylab inline
A primeira parte “ipython notebook” é comum. A segunda parte “–pylab inline” é opcional, porém ela é muito interessante pois permite que incluir os gráficos do matplotlib feitos aqui diretamente no corpo deste documento; Inclusive isso carrega automaticamente o PyLab (numpy e matplotlib);
Exercício 1
Pesquise outra forma de carregar o Pylab, para o caso de não usarmos o comando “–pylab inline” (isso as vezes é conveniente);
Usando como uma calculadora:
Note que apertar “enter”, apenas pula de linha (isso será útil mais tarde) e para executar a linha damos “shift+enter”
1+1
2
In [2]:
(50-5*6)/4
5
5/2
2
Opa!!! Tem algo estranho aqui … sabemos que 5/2 = 2,5 . Mas o Python, assim como Fortran, C, Pascal, divisão de INTEIROS é truncada e com resultado INTEIRO;
Resolvemos o impasse simplismente enfiando um número REAL (tipo float) na conta;
5/float(2)
2.5
Ou de forma mais simples, coloque um ponto em algum dos números!
5/2.
2.5
5./2
2.5
Note que claramente 2 não é igual a 2. (pelo menos no contexto de programação), por outro lado em termos de quantidade eles representam a mesma coisa.
2 is 2.
Out[7]:
False
2==2.
True
Falaremos mais sobre testes em outro momento. Agora vamos continuar com a calculadora.
sqrt(2)
1.4142135623730951
exp(1)
2.7182818284590451
log(1.1)
0.095310179804324935
pi
3.141592653589793
In [13]:
sin(pi/4)
0.70710678118654746
tan(pi/2)
16331239353195370.0
Note que por ser tratar de um cálculo numérico, a tangente de pi/2 é calculada (só que dá um número muito grante). Sabemos que isso não é verdade.
Vamos definir algumas variáveis agora,
comprimento =10
largura = 20
area = comprimento * largura
area
200
altura = 5
volume = area * altura
volume
1000
Apesar do PyLab carregar muitas funções matemáticas, algumas ainda estão de fora, uma delas é o fatorial.
n! = n (n-1)(n-2)(n-3)…432*1
Corrigimos isso importando a seguinte função do pacote matemático MATH;
from math import factorial
factorial(12)
479001600
Agora vamos manipular algumas STRINGS
'Assim pintamos strings'
'Assim pintamos strings'
saldacao = ' Como vai?'
complemento = ' E ai Fulano!'
complemento + saldacao
' E ai Fulano! Como vai?'
"Funciona com duas aspas"
'Funciona com duas aspas'
"Mas os acentos não funcionam"
'Mas os acentos n\xc3\xa3o funcionam'
Para esses casos use o PRINT
print complemento + saldacao, " não está bem!"
E ai Fulano! Como vai? não está bem!
Listas
Isso é natural no Python
dias_da_semana = ["domingo","segunda","terça","quarta", "quinta", "sexta", "sábado"]
dias_da_semana[2]
'ter\xc3\xa7a'
print dias_da_semana[-1]
sábado
len(dias_da_semana)
Out[29]:
7
Exercício 2
Pesquise como descobrir mais informações sobre esse comando “len”?
Listas numéricas agora.
Usamos o RANGE (significa série ou variação em inglês)
?range
range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
range(5,10)
[5, 6, 7, 8, 9]
range(1,10,2)
[1, 3, 5, 7, 9]
range(1,10,0.2)
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-35-cab7b13a5a94> in <module>() ----> 1 range(1,10,0.2) TypeError: range() integer step argument expected, got float.
Usamos para isso o arange, que é uma rotina do NumPy
lista_float=arange(1,10,0.2)
print lista_float
type(lista_float)
[ 1. 1.2 1.4 1.6 1.8 2. 2.2 2.4 2.6 2.8 3. 3.2 3.4 3.6 3.8 4. 4.2 4.4 4.6 4.8 5. 5.2 5.4 5.6 5.8 6. 6.2 6.4 6.6 6.8 7. 7.2 7.4 7.6 7.8 8. 8.2 8.4 8.6 8.8 9. 9.2 9.4 9.6 9.8]
numpy.ndarray
lista_float
array([ 1. , 1.2, 1.4, 1.6, 1.8, 2. , 2.2, 2.4, 2.6, 2.8, 3. , 3.2, 3.4, 3.6, 3.8, 4. , 4.2, 4.4, 4.6, 4.8, 5. , 5.2, 5.4, 5.6, 5.8, 6. , 6.2, 6.4, 6.6, 6.8, 7. , 7.2, 7.4, 7.6, 7.8, 8. , 8.2, 8.4, 8.6, 8.8, 9. , 9.2, 9.4, 9.6, 9.8])
Listas MISTAS
mista = [1, "lista", "estranha", 100.]
mista
[1, 'lista', 'estranha', 100.0]
type(mista)
list
?list
Cuidado, pois dependendo de como você gera uma “lista”, ela pode não ser defato uma lista (seja ela mista ou não).
tupla_mista = (1, "lista", "estranha", 100.)
type(tupla_mista)
tuple
?tuple
set_mista = {1, "lista", "estranha", 100.}
type(set_mista)
set
?set
Vamos as estruturas:
Loop
Exercício 3 – Tente ler o comando abaixo:
for i in range(len(mista)): tipo = type(mista[i]) print tipo
<type 'int'> <type 'str'> <type 'str'> <type 'float'>
Teste verdadeiro ou falso:
Teste de Igual
2==2.
True
O duplo igual (==) é usado para o teste, pois tradicionalmente o igual simples (=) é usado para atribuição de valor;
v=2
v==float(2)
--------------------------------------------------------------------------- NameError Traceback (most recent call last) <ipython-input-50-1fafca712b6d> in <module>() ----> 1 v==float(2) NameError: name 'v' is not defined
Outros testes:
2!=2.0
False
2<1.01
False
2<=1.01
False
2>1.01
True
2>=1.01
True
for dia in dias_da_semana: qual_dia = "Hoje é " + dia print qual_dia if dia == "domingo": print " Durmi até tarde" elif dia == "sábado": print " Dia de tormir tarde..." else: print " Vou ao trabalho"
Hoje é domingo Durmi até tarde Hoje é segunda Vou ao trabalho Hoje é terça Vou ao trabalho Hoje é quarta Vou ao trabalho Hoje é quinta Vou ao trabalho Hoje é sexta Vou ao trabalho Hoje é sábado Dia de tormir tarde...
Definindo funções
Vamos voltar ao tal do fatorial(n!), poderíamos fazer um no lugar de pegar um pronto.
Construindo a função Fatorial (Exercício 4 -> pesquisar outra forma de fazer o fatorial)
def fatorial(m): # aqui dizemos quem é a função j = 1 # n = m if n > 1: # Faz o teste se o número é maior que um; for i in range(1, n + 1): # Loop para fazer as multiplicações j = j * i # Interação return j # Retorno o resultado else: return 1 #Cuidado com a identação ela pode gerar erros!
fatorial(12)
479001600
fatorial(12.11)
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-58-408a4ad43407> in <module>() ----> 1 fatorial(12.11) <ipython-input-56-477990fc6bce> in fatorial(m) 3 n = m 4 if n > 1: # Faz o teste se o número é maior que um; ----> 5 for i in range(1, n + 1): # Loop para fazer as multiplicações 6 j = j * i # Interação 7 return j # Retorno o resultado TypeError: range() integer end argument expected, got float.
factorial(12.1)
--------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-59-c8a524155186> in <module>() ----> 1 factorial(12.1) ValueError: factorial() only accepts integral values
Exercício 5 – Tente bolar um filtro para números interios no nosso fatorial construído;
Soma da PA (Progressão Aritmética)
def somapa(a1,n,r): an = a1 + (n-1)*r #n-ésimo termo; sn = n*(a1+an)/2 #soma dos n primeiros termos return sn
somapa(1,10,2)
100
Soma da PG (Progressão Geométrica)
def somapg(a1,n,q): sn = a1*(1-q**n)/(1-q) #soma dos n primeiros termos return sn
somapg(1,10,2)
1023
Um pouco de gráficos (só para sentir o gostinho)
Primeiro vamos carregar o módulo gráfico
import matplotlib.pyplot as plt
Essa forma de carregar acrescente o prefixo plt nas funções carregadas pelo módulo. Funções com essa característica estão num CONTEXTO específico (nesse caso plt);
Digite os comandos help(plt) e dir(plt), para ver respectivamente o HELP do pacote e a LISTA de funções carregadas
x=arange(2,10,0.1) print x
[ 2. 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 3. 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 4. 4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 4.9 5. 5.1 5.2 5.3 5.4 5.5 5.6 5.7 5.8 5.9 6. 6.1 6.2 6.3 6.4 6.5 6.6 6.7 6.8 6.9 7. 7.1 7.2 7.3 7.4 7.5 7.6 7.7 7.8 7.9 8. 8.1 8.2 8.3 8.4 8.5 8.6 8.7 8.8 8.9 9. 9.1 9.2 9.3 9.4 9.5 9.6 9.7 9.8 9.9]
É importante usar o ARANGE, no lugar do RANGE, para gerar uma lista passivel de ser usada pela função;
ypa=somapa(1,x,2) print ypa
[ 4. 4.41 4.84 5.29 5.76 6.25 6.76 7.29 7.84 8.41 9. 9.61 10.24 10.89 11.56 12.25 12.96 13.69 14.44 15.21 16. 16.81 17.64 18.49 19.36 20.25 21.16 22.09 23.04 24.01 25. 26.01 27.04 28.09 29.16 30.25 31.36 32.49 33.64 34.81 36. 37.21 38.44 39.69 40.96 42.25 43.56 44.89 46.24 47.61 49. 50.41 51.84 53.29 54.76 56.25 57.76 59.29 60.84 62.41 64. 65.61 67.24 68.89 70.56 72.25 73.96 75.69 77.44 79.21 81. 82.81 84.64 86.49 88.36 90.25 92.16 94.09 96.04 98.01]
ypg=somapg(1,x,2) print ypg
[ 3. 3.28709385 3.59479342 3.92457765 4.27803164 4.65685425 5.06286627 5.49801917 5.96440451 6.46426393 7. 7.5741877 8.18958684 8.84915531 9.55606329 10.3137085 11.12573253 11.99603834 12.92880901 13.92852786 15. 16.1483754 17.37917368 18.69831061 20.11212657 21.627417 23.25146506 24.99207668 26.85761803 28.85705573 31. 33.2967508 35.75834736 38.39662123 41.22425314 44.254834 47.50293013 50.98415337 54.71523605 58.71411146 63. 67.5935016 72.51669472 77.79324245 83.44850629 89.50966799 96.00586026 102.96830673 110.4304721 118.42822292 127. 136.1870032 146.03338944 156.58648491 167.89701258 180.01933598 193.01172051 206.93661347 221.8609442 237.85644583 255. 273.37400641 293.06677888 314.17296982 336.79402516 361.03867197 387.02344103 414.87322693 444.72188841 476.71289167 511. 547.74801282 587.13355776 629.34593963 674.58805032 723.07734394 775.04688205 830.74645387 890.44377682 954.42578333]
plt.plot(x,ypa,x,ypg)
[<matplotlib.lines.Line2D at 0x44ba790>, <matplotlib.lines.Line2D at 0x44ba610>]
plt.plot(x,ypa,x,ypg) plt.xlabel('Numero de Termos') # Abaixo inserimos os nomes dos eixos plt.ylabel('Soma dos termos') plt.title('Evolucao da soma da PA e PG') # Isso acrescenta o título (sem acentos por hora)! plt.show() # Isso mostra
plt.plot(x,ypa,x,ypg) plt.xlabel('Numero de Termos') # Abaixo inserimos os nomes dos eixos plt.ylabel('Soma dos termos') plt.title('Evolucao da soma da PA e PG') # Isso acrescenta o título (sem acentos por hora)! plt.legend(["PA", "PG"],loc=2) # Essa linha coloca a Legenda; plt.show() # Isso mostra
Exercício 6 – Colocar acentos nos gráficos do matplotlib
Videos sobre Referencias Não Inerciais
Seguem dois vídeos para os curiosos sobre as tais forças de inércia que ocorrem em referencias não inerciais;
Uma demonstração sobre força centrífuga
http://www.youtube.com/watch?v=VUVcHgXvIxI
Um jogo com força de Coriolis
http://www.youtube.com/watch?v=_36MiCUS1ro
Nossos agradecimentos aos autores dos vídeos.
Apresentação
Destacado
Notícias para os alunos:
Horário de Atendimento aos alunos:
Via chat do Google Class Room, mande uma mensagem pública ou privada, o aluno decide.
Você também pode enviar um email.
Contato por email:
ramon.campos(arroba)ufes.br
troque o (arroba) pelo @, essa é uma medida para evitar os robozinhos que enviam mensagens aleatórias para meu email de trabalho.
Disciplinas do semestre 2020/1 – ESPECIAL
Veja abaixo a data da última atualização.
Mecânica Clássica – 01 de Fevereiro;
E + abaixo temos notícias…