Sobre Ramon Giostri Campos

Ramón Giostri Campos, é professor de Física no Campos de Alegre da UFES. Trabalha com modelagem computacional de problemas físicos, cosmologia, gravitação, estatística aplicada e divulgação científica. É atualmente o coordenador do projeto Seminários Abertos do CCA, coordenador do Laboratório de Mecânica e Termodinâmica (Laboratório 1), coordenador de gestão em processos educacionais do PIBID UFES em Alegre e colaborador do projeto PIBID - Física em Alegre.

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;

In [2]:  import numpy as np
In [3]:  import scipy as sp
In [4]:  import matplotlib as mpl
In [5]:  import matplotlib.pyplot as plt
In [6]:  #ion() #isso liga o modo interativo do matplotlib, usamos só se o inline nao for usado no primeiro comando!

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;

In [7]:   plt.plot([1.0,3.4],[4.7,5.9])
Out[7]:  [<matplotlib.lines.Line2D at 0x3dd5ad0>]

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…

In [8]:
x1=np.arange(-2,3) #domínio
y1=(x1)**2 #Imagem
plt.plot(x1,y1)
Out[8]:  [<matplotlib.lines.Line2D at 0x41241d0>]

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!

In [9]:
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)
Out[9]:  [<matplotlib.lines.Line2D at 0x433d550>]

Poderíamos encurtar a coisa usando o comando…

linspace

 

Vamos aprender mais um pouco sobre esse comando…

In [13]:  help(linspace)
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!

In [12]:
#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!!!
Out[12]:
[<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:

In [13]:  plt.plot([-1,0.5,1,-1],[0,2,1,0])
Out[13]: <matplotlib.lines.Line2D at 0x4c33390>]

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.

In [21]:
#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. ]]
Out[21]: [<matplotlib.lines.Line2D at 0x599a390>]
In [22]:
#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. ]]
Out[22]:  [<matplotlib.lines.Line2D at 0x5b76a50>]

Aqui também podemos tentar algo mais elaborado, com cores e legenda.

In [23]:
from __future__ import unicode_literals # isso permite incluir acentos nos gráficos. E era um exercício em outra aula.
In [24]:
#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:

In [29]:
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')
Out[29]: [<matplotlib.lines.Line2D at 0x6583e50>]

Exercício 3:

Se em lugar de bolinhas azuis, tivéssemos sinais ‘+’ vermelhos, como faríamos isso?

Pontos de figuras regulares:

In [35]:
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')
In [21]:
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.

In [41]:
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;
In [47]:
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)
Out[47]:
<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);

In [52]:
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

In [53]:
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

In [54]:
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()
In [55]:
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…

In [56]:
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')
Out[56]:
[<matplotlib.lines.Line2D at 0x7228f90>]
In [64]:
# 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')
Out[64]:
[<matplotlib.lines.Line2D at 0x88e4b50>]
In [68]:
# 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')
Out[68]:
[<matplotlib.lines.Line2D at 0x923e110>]

Outros gráficos 2D interessantes:

Regiões:

In [69]:
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…

In [70]:
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:

In [71]:
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;

 

In [72]:
from mpl_toolkits.mplot3d import Axes3D
#para fazer gráficos 3D
In [74]:
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()
In [77]:
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()
In [79]:
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()
In [91]:
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

In [99]:
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()

 

In [39]:
#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()
In [94]:
#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!

In [95]:
#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()
In [ ]:

Outra coisa que pode ficar melhor de ver com script separado…

In [111]:
# 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 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”

In [1]:
1+1
Out[1]:
2

In [2]:

(50-5*6)/4
Out[2]:
5
In [3]:
5/2
Out[3]:
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;

In [4]:
5/float(2)
Out[4]:
2.5

Ou de forma mais simples, coloque um ponto em algum dos números!

In [5]:
5/2.
Out[5]:
2.5
In [6]:
5./2
Out[6]:
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.

In [7]:
2 is 2.

Out[7]:

False
In [8]:
2==2.
Out[8]:
True

Falaremos mais sobre testes em outro momento. Agora vamos continuar com a calculadora.

In [9]:
sqrt(2)
Out[9]:
1.4142135623730951
In [10]:
exp(1)
Out[10]:
2.7182818284590451
In [11]:
log(1.1)
Out[11]:
0.095310179804324935
In [12]:
pi
Out[12]:
3.141592653589793

In [13]:

sin(pi/4)
Out[13]:
0.70710678118654746
In [14]:
tan(pi/2)
Out[14]:
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,

In [15]:
comprimento =10
largura = 20
area = comprimento * largura
area
Out[15]:
200
In [16]:
altura = 5
volume = area * altura
volume
Out[16]:
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;

In [17]:
from math import factorial
In [18]:
factorial(12)
Out[18]:
479001600

Agora vamos manipular algumas STRINGS

In [19]:
'Assim pintamos strings'
Out[19]:
'Assim pintamos strings'
In [20]:
saldacao = ' Como vai?'
In [21]:
complemento = ' E ai Fulano!'
In [22]:
complemento + saldacao
Out[22]:
' E ai Fulano! Como vai?'
In [23]:
"Funciona com duas aspas"
Out[23]:
'Funciona com duas aspas'
In [24]:
"Mas os acentos não funcionam"
Out[24]:
'Mas os acentos n\xc3\xa3o funcionam'

Para esses casos use o PRINT

In [25]:
print complemento + saldacao, " não está bem!"
 E ai Fulano! Como vai?  não está bem!

Listas

Isso é natural no Python

In [26]:
dias_da_semana = ["domingo","segunda","terça","quarta", "quinta", "sexta", "sábado"]
In [27]:
dias_da_semana[2]
Out[27]:
'ter\xc3\xa7a'
In [28]:
print dias_da_semana[-1]
sábado
In [29]:
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)

In [157]:
?range
In [32]:
range(10)
Out[32]:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
In [33]:
range(5,10)
Out[33]:
[5, 6, 7, 8, 9]
In [34]:
range(1,10,2)
Out[34]:
[1, 3, 5, 7, 9]
In [35]:
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

In [36]:
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]
Out[36]:
numpy.ndarray
In [37]:
lista_float
Out[37]:
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

In [38]:
mista = [1, "lista", "estranha", 100.]
mista
Out[38]:
[1, 'lista', 'estranha', 100.0]
In [39]:
type(mista)
Out[39]:
list
In [40]:
?list

Cuidado, pois dependendo de como você gera uma “lista”, ela pode não ser defato uma lista (seja ela mista ou não).

In [41]:
tupla_mista = (1, "lista", "estranha", 100.)
In [42]:
type(tupla_mista)
Out[42]:
tuple
In [43]:
?tuple
In [44]:
set_mista = {1, "lista", "estranha", 100.}
In [45]:
type(set_mista)
Out[45]:
set
In [46]:
?set

Vamos as estruturas:

Loop

Exercício 3 – Tente ler o comando abaixo:

In [47]:
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

In [49]:
2==2.
Out[49]:
True

O duplo igual (==) é usado para o teste, pois tradicionalmente o igual simples (=) é usado para atribuição de valor;

In [16]:
v=2
In [50]:
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:

In [19]:
2!=2.0
Out[19]:
False
In [51]:
2<1.01
Out[51]:
False
In [52]:
2<=1.01
Out[52]:
False
In [53]:
2>1.01
Out[53]:
True
In [54]:
2>=1.01
Out[54]:
True
In [55]:
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)

In [56]:
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!
In [57]:
fatorial(12)
Out[57]:
479001600
In [58]:
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.
In [59]:
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)

In [60]:
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
In [75]:
somapa(1,10,2)
Out[75]:
100

Soma da PG (Progressão Geométrica)

In [62]:
def somapg(a1,n,q):
    sn = a1*(1-q**n)/(1-q) #soma dos n primeiros termos
    return sn
In [63]:
somapg(1,10,2)
Out[63]:
1023

Um pouco de gráficos (só para sentir o gostinho)

Primeiro vamos carregar o módulo gráfico

In [64]:
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

In [122]:
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;

In [123]:
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]
In [124]:
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]
In [125]:
plt.plot(x,ypa,x,ypg)
Out[125]:
[<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”

In [1]:
1+1
Out[1]:
2

In [2]:

(50-5*6)/4
Out[2]:
5
In [3]:
5/2
Out[3]:
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;

In [4]:
5/float(2)
Out[4]:
2.5

Ou de forma mais simples, coloque um ponto em algum dos números!

In [5]:
5/2.
Out[5]:
2.5
In [6]:
5./2
Out[6]:
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.

In [7]:
2 is 2.

Out[7]:

False
In [8]:
2==2.
Out[8]:
True

Falaremos mais sobre testes em outro momento. Agora vamos continuar com a calculadora.

In [9]:
sqrt(2)
Out[9]:
1.4142135623730951
In [10]:
exp(1)
Out[10]:
2.7182818284590451
In [11]:
log(1.1)
Out[11]:
0.095310179804324935
In [12]:
pi
Out[12]:
3.141592653589793

In [13]:

sin(pi/4)
Out[13]:
0.70710678118654746
In [14]:
tan(pi/2)
Out[14]:
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,

In [15]:
comprimento =10
largura = 20
area = comprimento * largura
area
Out[15]:
200
In [16]:
altura = 5
volume = area * altura
volume
Out[16]:
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;

In [17]:
from math import factorial
In [18]:
factorial(12)
Out[18]:
479001600

Agora vamos manipular algumas STRINGS

In [19]:
'Assim pintamos strings'
Out[19]:
'Assim pintamos strings'
In [20]:
saldacao = ' Como vai?'
In [21]:
complemento = ' E ai Fulano!'
In [22]:
complemento + saldacao
Out[22]:
' E ai Fulano! Como vai?'
In [23]:
"Funciona com duas aspas"
Out[23]:
'Funciona com duas aspas'
In [24]:
"Mas os acentos não funcionam"
Out[24]:
'Mas os acentos n\xc3\xa3o funcionam'

Para esses casos use o PRINT

In [25]:
print complemento + saldacao, " não está bem!"
 E ai Fulano! Como vai?  não está bem!

Listas

Isso é natural no Python

In [26]:
dias_da_semana = ["domingo","segunda","terça","quarta", "quinta", "sexta", "sábado"]
In [27]:
dias_da_semana[2]
Out[27]:
'ter\xc3\xa7a'
In [28]:
print dias_da_semana[-1]
sábado
In [29]:
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)

In [157]:
?range
In [32]:
range(10)
Out[32]:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
In [33]:
range(5,10)
Out[33]:
[5, 6, 7, 8, 9]
In [34]:
range(1,10,2)
Out[34]:
[1, 3, 5, 7, 9]
In [35]:
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

In [36]:
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]
Out[36]:
numpy.ndarray
In [37]:
lista_float
Out[37]:
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

In [38]:
mista = [1, "lista", "estranha", 100.]
mista
Out[38]:
[1, 'lista', 'estranha', 100.0]
In [39]:
type(mista)
Out[39]:
list
In [40]:
?list

Cuidado, pois dependendo de como você gera uma “lista”, ela pode não ser defato uma lista (seja ela mista ou não).

In [41]:
tupla_mista = (1, "lista", "estranha", 100.)
In [42]:
type(tupla_mista)
Out[42]:
tuple
In [43]:
?tuple
In [44]:
set_mista = {1, "lista", "estranha", 100.}
In [45]:
type(set_mista)
Out[45]:
set
In [46]:
?set

Vamos as estruturas:

Loop

Exercício 3 – Tente ler o comando abaixo:

In [47]:
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

In [49]:
2==2.
Out[49]:
True

O duplo igual (==) é usado para o teste, pois tradicionalmente o igual simples (=) é usado para atribuição de valor;

In [16]:
v=2
In [50]:
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:

In [19]:
2!=2.0
Out[19]:
False
In [51]:
2<1.01
Out[51]:
False
In [52]:
2<=1.01
Out[52]:
False
In [53]:
2>1.01
Out[53]:
True
In [54]:
2>=1.01
Out[54]:
True
In [55]:
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)

In [56]:
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!
In [57]:
fatorial(12)
Out[57]:
479001600
In [58]:
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.
In [59]:
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)

In [60]:
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
In [75]:
somapa(1,10,2)
Out[75]:
100

Soma da PG (Progressão Geométrica)

In [62]:
def somapg(a1,n,q):
    sn = a1*(1-q**n)/(1-q) #soma dos n primeiros termos
    return sn
In [63]:
somapg(1,10,2)
Out[63]:
1023

Um pouco de gráficos (só para sentir o gostinho)

Primeiro vamos carregar o módulo gráfico

In [64]:
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

In [122]:
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;

In [123]:
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]
In [124]:
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]
In [125]:
plt.plot(x,ypa,x,ypg)
Out[125]:
[<matplotlib.lines.Line2D at 0x44ba790>,
 <matplotlib.lines.Line2D at 0x44ba610>]
In [134]:
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
In [167]:
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

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…