Mostrando postagens com marcador Python. Mostrar todas as postagens
Mostrando postagens com marcador Python. Mostrar todas as postagens

sexta-feira, 16 de agosto de 2019

Divulgando: XVII Pylestras


O Pylestras é um evento sem fins lucrativo que consiste em um​ dia de palestras de tecnologia no qual palestrante e os convidados e/ou selecionados por votação compartilham sua experiência com estudantes e profissionais da área. Os assuntos das palestras são variados, contudo, orbitam o ecossistema da linguagem de programação​ Python. Estrategicamente, procuramos manter um slot​ ​ de palestra para uma linguagem de​ programação convidada, que varia entre os eventos, visando integrar o PugCE com outras comunidades de tecnologia do estado.

*** Mais informações e inscrições aqui.

quinta-feira, 25 de outubro de 2018

Divulgando: XVI Pylestras



Os palestrantes e seus respectivos temas são:

  • Gabriela Bezerra - Introdução a OpenCV
  • Julio Oliveira - O modelo de computação do Python
  • Glairton Santos - GraphQL - uma alternativa a arquiteturas REST
  • Tiago Guimarães - Realidade aumentada e o futuro: como isso irá impactar nossas vidas hoje e amanhã
  • Rudy Matela - Programação funcional em haskell para pythonistas
Sinta-se livre para participar, pois o evento é aberto a todos, incluindo iniciantes em programação. Mais informações aqui.

Link para as inscrições:xvi-pylestras.

Obs: "O Pylestras é um evento focado em Python, não tem fins comerciais e o dinheiro do ingresso é convertido todo em Coffe break (pizza)."

segunda-feira, 20 de novembro de 2017

Divulgando: 12º CocoaHeads Fortaleza e PyLadies - Aracati


12º CocoaHeads Fortaleza
Capítulo: CocoaHeads Fortaleza
Data do evento: 23/11/2017
Horário: 13h30min
Local: Uni7 (Antiga Fa7)
Endereço: Av. Alm. Maximiano da Fonseca, 1395 Eng. Luciano Cavalcante - CEP 60811-020 Fortaleza - CE - Brasil.

Mais informações aqui!



O campus de Aracati vai promover mais uma ação para incentivar a participação de meninas na área de tecnologia e computação. Isso vai ser possível graças ao início das atividades, aqui no campus, do PyLadies, uma comunidade mundial que já existe em vários estados brasileiros justamente com o propósito de atrair mais mulheres para a área tecnológica.

O primeiro encontro do grupo acontece no dia 24 de novembro, das 13h30 às 17h, no auditório do novo campus do IFCE, com uma programação aberta ao público. Em Aracati, o Pyladies vai reunir atividades que vinham sendo realizadas em dois projetos que já funcionam no campus: o Divas, voltado para a promoção da presença de mulheres na computação; e o Propython, que atua na divulgação da linguagem de programação Python.

quinta-feira, 14 de setembro de 2017

Calculando o volume numericamente: computação científica com Python

Exemplo de uma figura 3D.
Uma tarefa importante é o cálculo de volumes de figuras definidas por alguma função $z = f(x,y)$. Para alguns casos, é possível calcularmos analiticamente o volume desejado, mas em vários outros esse cálculo analítico não é possível. Nesses casos, podemos tentar fazer uma estimativa numérica do problema. Podemos "fatiar" esse volume em pequenos prismas de base retangulares e altura dada pelo valor da função $f(x,y)$ na posição $(x_n,y_m)$ selecionada. Então, teremos vários prismas com volume $dV_{nm} = f(x_n,y_m) dx dy$ e volume pode ser estimado pela soma ponderada do volume desses prismas: $$V_{estimado} \cong h_x h_y \sum_{n}\sum_{m} p(n,m)f(x_n,y_m) $$ onde $p(n,m)$ é peso na posição $(x_n,y_m)$. Esses pesos podem ser obtidos, por exemplo, pela aplicação da primeira ou segunda regra de Simpson repetida. Por exemplo, para uma integral na área de $X$ de 0 a 1 e $Y$ também de 0 a 1, se o eixo $X$ for dividido em 5 pontos (0, 1/4, 2/4, 3/4, 1) e o eixo $Y$ em 4 pontos (0, 1/3, 2/3, 1), podemos usar os pesos mostrados na tabela abaixo:

Pesos para o cálculo de $dV$:
x/y| 0 & 1/4 & 2/4 & 3/4 & 1
------------------------------------------
0  | 1 & 4 &   2 &   4 &   1
1/3| 3 & 12 &  6 &   12 &  3
2/3| 3 & 12 &  6 &   12 &  3
1  | 1 & 4 &   2 &   4 &   1 

O código abaixo é um exemplo de programa Python que calcula o volume da função $f(x,y) = \sin(3e^{(x^2 + y^2)/4})$ (ver figura inicial desta postagem).

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.ticker import LinearLocator, FormatStrFormatter
import numpy as np

dx = 0.25 
dy = 0.25
X = np.arange(-5, 5+dx, dx)
Y = np.arange(-5, 5+dy, dy)
X, Y = np.meshgrid(X, Y)
R = np.exp((-X**2 - Y**2)/4.0)
Z = np.sin(3*R);
Zp = Z;


fig = plt.figure()
ax = fig.gca(projection='3d')

# Plotando a surperfície.

surf = ax.plot_surface(X, Y, Z, cmap=cm.coolwarm,linewidth=0, antialiased=False)
plt.title('Função: $\sin(3e^{(x² + y²)/4})$');


# Adicionando cores e uma barra de cores

fig.colorbar(surf, shrink=0.5, aspect=5)

plt.show()

P = np.arange(-5, 5+dx, dx)
fim=len(P)-1print('tam = ',fim)
P[0] = 1;
n=1;
m = 0;

while fim>n:
    P[n] = 4;
    P[n+1]=2;
    n=n+2;

P[fim] = 1;
print(P)
n=0; m = 0; kk=1;
fim=fim+1
while fim>n:
    n=n+1;
    m=1;
    while fim>m:
        kk = P[n]*P[m]
        Zp[n,m] = Z[n,m]*kk
        m=m+1 
Zpsum = dx*dy*np.sum(np.sum(Zp))/9;
print('Volume = ',Zpsum)

sábado, 15 de abril de 2017

Abrindo e filtrando arquivos de som do tipo "wav" - em Scilab e Python

Uma das frases que eu acho interessantes no filme 2001: Uma Odisseia no Espaço. O áudio apresenta algum ruído.

O objetivo desta postagem é mostrar como um arquivo de som do tipo "wav" pode ser aberto e manipulado em Python e em Scilab, mas é bom deixar claro que sou bem mais fluente em Scilab. Sobre arquivo no formato "wav" ver aqui. Os arquivos de teste foram escolhidos do filme 2001: Uma Odisseia no Espaço - ver aqui.

O que fazem os códigos? Basicamente, abrem um arquivo se som, mostram o sinal no tempo e na frequência (espectro - uso da fft), filtram o sinal com um filtro do tipo passa-baixa Butterworth e mostram o resultado. No código Scilab, o trecho final cria e salva um tom senoidal com um pouco de ruído.

Principais comandos Python usados:

  • convolve - realiza a operação de convolução - ver aqui
  • fft - calcula a transformada rápida de Fourier - ver aqui
  • wave - biblioteca para manipular arquivos wav - ver aqui.  


Código Scilab:

///////////////////////////////////////////////////////////////
// Ler um arquivo .wav e mostrar no     //
// tempo e na frequência, filtrar depois //
///////////////////////////////////////////////////////////////
// Prof. Francisco J. A. de Aquino        //
// ver. 1.0   -   15/04/2017,  Fortaleza  //
//////////////////////////////////////////////////////////////

clc; xdel(winsid()); // fechando as janelas.

// Frases:
frase = 'This conversation can serve no purpose anymore. Goodbye.';
//frase = "We are all – by any practical definition of the words – foolproof and incapable of error."
//frase = 'Tom de teste';
//frase = "I am a HAL 9000 computer.";
//frase = "My mind is going... I can feel it.";

// Arquivos de som:
wavfile = 'C:\Users\Silvestre\Downloads\goodbye1.wav';
//wavfile = 'C:\Users\Silvestre\Downloads\foolproof.wav';
//wavfile = 'C:\Users\Silvestre\Downloads\testeff.wav';
//wavfile="C:\Users\Silvestre\Downloads\hal_9000.wav";
//wavfile="C:\Users\Silvestre\Downloads\mind_is_going.wav";

// Lendo e mostrando o arquivo de som:
[y,Fs,bits]=wavread(wavfile);
fg0=figure();
h0=uicontrol(fg0,"style","pushbutton","string","|>",'callback','sound(y,Fs)');
plot(y);  title(frase);

// Espectro do sinal:
tx = round(max(size(y))/2 - 1);
f = 1:max(size(y)); f = f - 1; f = f/max(f); f = f*Fs;
yf = abs(fft(y));
figure; plot(f(1:tx),yf(1:tx)); title('Espectro');

// Filtro passa-baixa:
[p,z,g]=iir(4,'lp','butt',[.20 .40],[.08 .03]);
n1 = convol([1 -z(1)],[1, -z(2)]);
n2 = convol([1 -z(3)],[1, -z(4)]);
nz = convol(n1,n2);

p1 = convol([1 -p(1)],[1, -p(2)]);
p2 = convol([1 -p(3)],[1, -p(4)]);
pp = real(convol(p1,p2));

// Sinal filtrado:
yff = g*filter(nz,pp,y);
yff = yff/max(abs(yff));

fg=figure();
h=uicontrol(fg,"style","pushbutton","string","Som",'callback','sound(yff,Fs)');
plot(yff); title(frase);

yfx = abs(fft(yff));
figure; plot(f(1:tx),yfx(1:tx));

/////// Gerando um tom:
p2 = 2*%pi;
frq = Fs; dt = 1/frq;
t=0:dt:2;
msom = sin(p2*t/2);
som = sin(p2*t*440) + cos(p2*t*880);
som = som.*msom;
som = som + 0.03*rand(1,max(size(som)),'n');
som = som/max(abs(som));
figure; plot(t,som); title('Teste');
wavfiles = 'C:\Users\Silvestre\Downloads\testeff.wav';
wavwrite(som, Fs, 16, wavfiles);

Código Python:

###########################################
## Lendo um arquivo .wav                  #
## Vendo o sinal no tempo e na frequência #
## Filtrando por um filtro passa-baixa    #
###########################################
## Prof. Francisco J. A. de Aquino        #
## Ver. 1.0 - 15/04/2017, Fortaleza - Ce  #
###########################################
import matplotlib.pyplot as plt
import numpy as np
import wave as fw
import winsound

arqff = 'C:/Users/Silvestre/Downloads/hal_9000.wav';
#arqff = 'C:/Users/Silvestre/Downloads/goodbye1.wav';
#arqff = 'C:/Users\Silvestre/Downloads/foolproof.wav';
#arqff = 'C:/Users\Silvestre/Downloads/testeff.wav';
#arqff = 'C:/Users/Silvestre/Downloads/hal_9000.wav';
#arqff = 'C:/Users/Silvestre/Downloads/mind_is_going.wav';
arquivoWav = fw.open(arqff, 'r');

print("Número canais: ", arquivoWav.getnchannels());
print("Número bytes: ", arquivoWav.getsampwidth());
print("Taxa de amostragem: ", arquivoWav.getframerate());
print("Número de frames: ", arquivoWav.getnframes());
print("Compactação: ", arquivoWav.getcompname());

tipos = np.uint8;
Damp = 256;
if arquivoWav.getsampwidth()>1:
    tipos = np.int16;
    Damp = 32760;

#frames = arquivoWav.readframes(arquivoWav.getnframes());
frames = arquivoWav.readframes(-1);
Amplitude = np.fromstring(frames, tipos)/Damp;
fim = np.size(Amplitude);
fim2 = round(fim/2 - 1);

dt = 1.0 / arquivoWav.getframerate();
tempo = np.arange(0, arquivoWav.getnframes() * dt, dt);
ffq = np.arange(0,arquivoWav.getnframes());
ffq = arquivoWav.getframerate()*ffq/max(ffq);
winsound.PlaySound(arqff, winsound.SND_FILENAME);
arquivoWav.close();

plt.plot(tempo, Amplitude); plt.grid();
plt.title(arqff);

Ampf = abs(np.fft.fft(Amplitude));
plt.figure(); plt.plot(ffq[1:fim2],Ampf[1:fim2]);

# filtragem com filtro do tipo FIR:
hh = [1.0, 4.7820952, 9.0600752, 8.0167949, 1.952694, -2.4130316, -2.0234161,
0.1735586, 1.0120036, 0.3765159, -0.3010215, -0.3118091, -0.0008764, 0.1450086,  
0.0661129, - 0.0376649, -0.0478969,  -0.0041389, 0.0204601];
Ampc = 0.0465829*np.convolve(hh,Amplitude,'same');
plt.figure(); plt.plot(tempo,Ampc); plt.title('Sinal filtrado'); plt.grid();

Ampfc = abs(np.fft.fft(Ampc));
plt.figure();
plt.plot(ffq[1:fim2],Ampfc[1:fim2]);
plt.title('Espectro do sinal filtrado'); plt.grid();

plt.show();

Exemplo de filtragem:

Sinal original com ruído e espectro; sinal filtrado e espectro.


quinta-feira, 23 de fevereiro de 2017

Python: integração numérica com a regra de Simpson composta


Na biblioteca Numpy existe a função "trapz" para o cálculo numérico de uma integral definida usando o método dos trapézios. Esse método é bom, mas a regra dos 3/8 de Simpson (ver aqui) composta resulta em um erro menor. O código abaixo implementa essa regra e compara o resultado para algumas funções.
Regra dos trapézios composta:
$$I_T = \frac{h}{2} (y_0 + 2y_1 + 2y_2 + ... + 2y_{m-1} + y_m) $$
Regra dos 3/8 de Simpson composta:
$$ I_T = \frac{3h}{8} (y_0 + 3y_1 + 3y_2 + 2y_3 + ... + y_m) $$ com $m$ múltiplo de 3.

Funções de teste escolhidas: $e^{-x}$, $xe^{-x}$, $x^{1/2}$, no intervalo $\{0, 6\}$, com passo $h = 0,5$.


import numpy as np

dt = 0.5;
x = np.arange(0, 6.01, dt);

y1 = x*np.exp(-x);
y2 = np.sqrt(x);
y3 = np.exp(-x);

# Regra dos trapézios: 
y1t = np.trapz(y1, x);
y2t = np.trapz(y2, x);
y3t = np.trapz(y3, x);

# Valores teóricos: 
ytt1 = 1 - (6 + 1)*np.exp(-6);
ytt2 = 2*(6**(3/2))/3;
ytt3 = 1 - np.exp(-6);

erro1 = y1t - ytt1;
erro2 = y2t - ytt2;
erro3 = y3t - ytt3;

# Regra dos 3/8 de Simpson: 
soma1 = y1[0];
soma2 = y2[0];
soma3 = y3[0];
n = 1;
tam = len(x);
while n
    soma1 = soma1 + 3*y1[n] + 3*y1[n+1] + 2*y1[n+2];
    soma2 = soma2 + 3*y2[n] + 3*y2[n+1] + 2*y2[n+2];
    soma3 = soma3 + 3*y3[n] + 3*y3[n+1] + 2*y3[n+2];
    n = n + 3
 
# foi considerado a mais no laço acima: 
# integral pela regra de Simpson composta:
soma1 = soma1 - y1[tam-1];  
soma1 = 3*soma1 * dt/8; 
soma2 = soma2 - y2[tam-1];  
soma2 = 3*soma2 * dt/8; 
soma3 = soma3 - y3[tam-1]; 
soma3 = 3*soma3 * dt/8

erros1 = ytt1 - soma1;
erros2 = ytt2 - soma2;
erros3 = ytt3 - soma3;

# print(x); print(y);print('Rg. Trap., Rg. Simpson, Erro Trap, Erro Simpson:')
print("%1.6f" % y1t, "  %1.6f" % soma1, "   %1.6f" % erro1, "  %1.6f" % erros1);
print("%1.6f" % y2t, "  %1.6f" % soma2, "   %1.6f" % erro2, "  %1.6f" % erros2);
print("%1.6f" % y3t, "  %1.6f" % soma3, "   %1.6f" % erro3, "  %1.6f" % erros3); 


Resultados:

Rg. Trap., Rg. Simpson, Erro Trap, Erro Simpson:
0.961816   0.980515    -0.020833   0.002134
9.728712   9.763015    -0.069247   0.034944
1.018217   0.998257    0.020696   -0.000735

Pode ser percebido que o erro absoluto obtido com a Regra de Simpson é menor que usando a Regra dos Trapézios.