Fpc2024 Notes
Fpc2024 Notes
Notas de Aula
SME0332
Roberto F. Ausas
December 3, 2024
Este documento está organizado por capítulos, cada um dos quais apresenta conceitos e ferramentas
essenciais para desenvolver programas de computador na linguagem python. Os problemas e exemplos
que serão desenvolvidos terão uma ênfase nas aplicações em física e bioinformática. Em cada capítulo serão
apresentados problemas e atividades que o aluno precisará desenvolver, com as quais, este será avaliado ao
longo do curso.
RFA
Contents
Prefacio ii
Contents iii
Alphabetical Index 29
UM PRIMEIRO CONTATO À
PROGRAMAÇÃO EM python 1
1.1 Preludio . . . . . . . . . . . 1
1.1 Preludio
1.2 Noções iniciais de python 2
1.3 Lista 1: Rudimentos bási-
A principal ideia por trás de aprender uma linguagem de programação
cos de programação . . . . 6
é a de automatizar certos cálculos que surgem em física ou engenharia,
que não poderiam ser resolvidos manualmente, sem o auxilio de um
computador.
Nas primeiras aulas precisamos introduzir alguns conceitos básicos de
programação (que se aplicam a qualquer linguagem) e posteriormente
precisamos introduzir a sintaxe específica da linguagem que vamos
utilizar ao longo do curso, que é a linguagem python.
De maneira muito geral, as linguagens de programação, podem ser
divididas em duas categorias:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int i, N = 10;
double *array;
array=(double *) malloc(N*sizeof(double));
for(i=0; i < N; i++) {
array[i] = (double) i;
printf("%lf\n", array[i]);
}
free(array);
return 0;
}
import numpy as np
N = 10
array = np.arange(N)
print(array)
Números
Strings
Listas
Diccionarios
Então,
mydic{"minhauni"} é "USP"
mydic{"lista"}[2] é 1 + 1j
.
.
else:
.
.
ou em situações com mais de duas opções para decidir:
if (Expressão lógica 1):
1 UM PRIMEIRO CONTATO À PROGRAMAÇÃO EM python 4
.
.
elif (Expressão lógica 2):
.
.
else:
.
.
Notar os : no final das sentencias e a indentação dentro de cada bloco.
Advertência
A indentação é fundamental em python. Se esta não for respeitada o
interpretador não saberá quais instruções ficam dentro da estrutura e
por tanto o programa poderá ter comportamentos não esperados ou
em alguns casos parar a execução .
.
.
A segunda estrutura de repetição que iremos usar as vezes é o while (o
"enquanto" em portugués):
while (Expressão lógica):
.
.
Com elas podemos fazer qualquer tipo de cálculo em que precisamos
iterar sobre os elementos de algum objeto ou repetir uma operação várias
vezes.
1 UM PRIMEIRO CONTATO À PROGRAMAÇÃO EM python 5
1.2.4 Funções
.
.
return var1, var2, ...
Esta é uma das bibliotecas que mais serão usadas ao longo do curso.
Basicamente permite definir vetores, matrizes e tensores em geral, popu-
lados com números ou dados de um tipo homegêneo (i.e., todos números
inteiros, ou todos números de ponto flutuante, etc.). Esta biblioteca é
fundamental para poder realizar cálculos científicos com uma eficiencia
razoável, possivelmente similar à da uma linguagem compilada. Alguns
exemplos de uso na sequência:
import numpy as np
Aviso importante
𝑁
1 X
𝑥¯ = 𝑥𝑖
𝑁 𝑖=1
a · b = k a k k b k cos 𝜃
c = 𝛼a + 𝛽b
A𝑚 = A . . . A
| {z }
𝑚 vezes
𝑥 𝑛 = 𝑎 𝑥 𝑛−1 (1 − 𝑥 𝑛−1 ), 𝑛 = 1, 2, . . . , 𝑁
𝑁 𝑁
1 X 1 X
𝑥¯ = 𝑥𝑖 , 𝜎 = (𝑥 𝑖 − 𝑥)
¯2
𝑁 𝑖=0 𝑁 − 1 𝑖=0
da vida:
I Uma grade com 100 × 100 células e condições iniciais
randômicas. que dependam de dois parâmetros 𝑝 0 e 𝑝 1
sendo as probabilidades de iniciar morta ou viva, respeti-
vamente. Testar diferentes valores;
I Uma grade menor e condições iniciais como as descritas no
https://en.wikipedia.org/wiki/Conway%27s_Game_of_
Life, de forma a reproduzir alguns padrões clássicos con-
hecidos como Still lifes, Oscillators e Spaceshifts.
O programa dever estar estruturado da seguinte forma:
# Grid size
N = 100
fig, ax = plt.subplots()
img = ax.imshow(grid, interpolation=’nearest’)
ani = animation.FuncAnimation(fig, update, fargs=(img,
grid,))
plt.show()
Explicar que o que cada parte do código faz.
VARIAVEIS E CAMINHADAS
ALEATÓRIAS, CÁLCULOS
MONTE CARLO 2
2.1 Preludio . . . . . . . . . . . . 10
2.1 Preludio
2.2 Cálculo de integrais por
métodos Monte Carlo . . . . 11
Neste capítulo iremos desenvolver alguns cálculos que envolvem variáveis
2.3 Caminhadas aleatórias . . . 13
aleatórias. Em alguns casos, a abordagem determinística não é a mais
apropriada, por diversos motivos: por exemplo, quando existe incerteza
em certas variáveis ou quando a complexidade do problema é tão
grande que não conseguimos barrer de maneira exaustiva todos os
possíveis valores e combinações que as variaveis envolvidas podem
assumir. Nesses casos, a abordagem estocástica torna-se mais conveniente.
Vamos apresentar alguns exemplos de cálculos estocásticos e desenvolver
códigos em python para realizá-los, incluindo, caminhadas aleatórias e
cálculo de integrais por métodos Monte Carlo.
Para começar, vamos considerar um exemplo que já foi introduzido:
Exemplo/Exercício 1
Cálculo do número 𝜋
Prob = Nc / N
print(’The estimate for pi is:’, 4*Prob)
I Plotar as funções.
I Usando uma tabela de integrais ou algum programa para
cálculo simbólico (p.e., Mathematica) calcular a área entre as
duas curvas.
I Calcular com um método Monte Carlo a área entre as duas
2 VARIAVEIS E CAMINHADAS ALEATÓRIAS, CÁLCULOS MONTE CARLO 13
𝑑𝑚
2
(𝑡) = h(R(𝑡) − R(0)) · (R(𝑡) − R(0))i
Exercício 8 (opcional)
{𝑎 0 , 𝑎1 , . . . , 𝑎 𝑘 , . . . }
𝑎0 = 0
𝑎1 = 1
𝑎𝑘 = 𝑎 𝑘−1 + 𝑎 𝑘−2 , 𝑘 = 2 , 3 , . . .
𝑥 𝑛 = 𝑎 𝑥 𝑛−1 (1 − 𝑥 𝑛−1 ), 𝑛 = 1, 2, . . . , 𝑁
𝑥 𝑘+1 = 𝜑(𝑥 𝑘 )
lim 𝑥 𝑘 = 𝑥¯
𝑘→∞
3 PROCESSOS ITERATIVOS E RELAXAÇÕES 16
3𝑥 − 𝑦 = 2
−2 𝑥 + 4 𝑦 = 1
1
𝑥 𝑘+1 = (2 + 𝑦 𝑘 )
3
1
𝑦 𝑘+1 = (1 + 2 𝑥 𝑘 )
4
Como pode-se ver, a ideia é que em cada equação se atualiza o
valor de uma das incógnitas com os valores das outras incógnitas
na iteração anterior. O processo iterativo deve ser executado
até que os valores de 𝑥 𝑘 e 𝑦 𝑘 estão suficientemente próximo
da solução do sistema, i.e., para 𝑘 suficientemente grande, se
denotarmos por ( 𝑥,
¯ 𝑦)
¯ a solução do sistema:
| 𝑥¯ − 𝑥 𝑘 | < 𝜀, | 𝑦¯ − 𝑦 𝑘 | < 𝜀
𝑓 (𝑥 𝑘 )
𝑥 𝑘+1 = 𝑥 𝑘 −
𝑓 0(𝑥 𝑘 )
Aviso importante
Exercícios
1. Implementar em python el ejemplo (a) da sequência de Fi-
bonacci. Programar-lo armazenando os resultados num vetor
e programar-lo usando o conceito de recorrẽncia, i.e., onde a
função chama-se a si mesmo tantas vezes quanto necessário
para calcular os elementos da sequência.
2. Fazer um programa de python que executa o processo de
√
iteração de ponto fixo do exemplo (c) para a função 𝜑(𝑥) = 1/ 𝑥
e graficar o processo iterativo como mostrado na figura ao lado.
Notar que a condição inicial escolhida no exemplo é 𝑥 0 = 0.75.
3 −1 −1 𝑥 1
−1 3 −1 𝑦 = 2
Figure 3.1: Exemplo de iteração de ponto
−1 −1 3 𝑧 3 fixo.
5. Opcional Programar o método de Jacobi para um sistema geral
de equações em que a matriz 𝐴 ∈ ℝ 𝑛×𝑛 e o vetor de lado direito
b ∈ ℝ 𝑛 são dados, i.e.,
𝐴 = . , 𝑏 = .
. .
𝑎𝑛1 𝑎𝑛2 ... 𝑎 𝑛𝑛 𝑏 𝑛
Notar que neste sistema não conhecemos facilmente a solução,
justamente, a ideia do método proposto é achar ela, por tanto
não podemos avaliar a grandeza | 𝑥¯ 𝑖 − 𝑥 𝑘𝑖 | , onde o supraíndice
refere-se à 𝑖 -éssima incógnita e o subíndice à 𝑘 -éssima iteração.
Então, nesse caso como podemos saber em que momento parar
o processo iterativo? Pense alguma alternativa.
6. Implementar em python o processo iterativo de Newton do
exemplo (e), para encontrar as duas raizes no intervalo [0,2] da
função:
2
𝑓 (𝑥) = 𝑥 𝑒 −𝑥 − 0.1
Primeiro plotar a função no intervalo [-1,2]. Baseado no gráfico
da função escolher pontos iniciais 𝑥 0 que estejam próximos
das raizes procuradas. Escolher um erro 𝜀 pequeno e determi-
nar quantas iterações são necessárias para a convergência do
método.
7. Implementar o método das potencias do exemplo (f) na matriz
1 0 0
𝐴 = 0 2 0
0 0 3
3 PROCESSOS ITERATIVOS E RELAXAÇÕES 18
e na matriz
𝐴 = diag(𝑎 1 , 𝑎2 , . . . , 𝑎 𝑛 )
sendo 𝑎 𝑖 s números randômicos uniformemente distribuídos entre 0 e
1.
e
2 ℓ0 𝐿
∫ 3 ∫
𝑚0 = 𝜌(𝑥) 𝑑𝑥, 𝑚𝑛−1 = 𝜌(𝑥) 𝑑𝑥,
0 𝐿− 23 ℓ 0
𝑑2 𝑦
−𝜏 = −𝜌(𝑥)𝑔 + 𝑓 (𝑥)
𝑑𝑥 2
e aplicar um método de discretização tal como o método das difer-
enças finitas para aproximar a derivada segunda que aparece no lado
esquerdo.
Mini projeto
Uma imagem não é outra coisa que uma lista de matrizes. Por exemplo
para uma imagem RGB teriamos uma lista de 3 matrizes. Considerar o
código
> print(img.shape)
(375, 500, 3)
A = img[:, :, 0]
Exercícios
1. Considerar a imagem do exemplo anterior. Visualizar a imagem
usando o comando plt.imshow. Visualizar a imagem original
img e visualizar o canal A considerando diferentes mapas de
cores:
plt.imshow(A)
plt.imshow(A, cmap="hot")
plt.imshow(A, cmap="’nipy_spectral’")
1
𝐵 𝑖𝑗 = (𝐴 𝑖,𝑗 + 𝐴 𝑖+1,𝑗 + 𝐴 𝑖−1,𝑗 + 𝐴 𝑖,𝑗+1 + 𝐴 𝑖,𝑗−1 )
5
Aplicar o algoritmo repetidas vezes e observar o resultado
Figure 4.2: Visualização esperada da im-
como função do número de vezes que ele é aplicado. agem.
I Fazer outra versão em que matriz resultante, em cada pixel,
tenha a média dos valores das células correspondentes,
das células adjacentes em horizontal, em vertical e em
diagonal.
4 TÓPICOS VARIADOS DE PROGRAMAÇÃO EM python 23
I Superfícies em 3D;
I Curvas de nível constante;
I Campos vetoriais;
Exercícios
Considerar a função
I Usando
h a função plt.quiver, plotar o gradiente da função
i
𝜕𝑓 𝜕𝑓
|
∇𝑓 = ,
𝜕𝑥 𝜕𝑦
. Superpor o gráfico com as curvas de nível
constante e verificar visualmente que estas são ortogonais ao
gradiente.
Inicializar 𝑡 0 = 0, 𝑛 = 0
Enquanto 𝑡 𝑛 < 𝑇fin
F 𝑗→𝑖 (r1𝑛 ,r2𝑛 )
1. Calcular a aceleração: a𝑛𝑖 = 𝑚𝑖 , 𝑗 ≠ 𝑖, 𝑖 = 1 , 2
2. Atualizar a posição: r𝑛+
𝑖
1
= r𝑛𝑖 + v𝑛𝑖 Δ𝑡 + 21 a𝑛𝑖 Δ𝑡 2
F 𝑗→𝑖 (r1𝑛+1 ,r2𝑛+1 )
3. Atualizar a aceleração: a𝑛+
𝑖
1
= 𝑚𝑖 , 𝑗≠𝑖
4. Atualizar a velocidade: v𝑛+1
= v𝑛𝑖 + 1
a𝑛𝑖 + a𝑛+ 1
𝑖 2 𝑖
Δ𝑡
5. Guardar 𝑡 𝑛 , r𝑛𝑖 , v𝑛𝑖
Exercícios
Na sequência considerar:
I 𝛾 = 1, Δ𝑡 = 0.01, 𝑚1 = 1, 𝑁steps = 2000
r01 , v01 = [[0 , 0], [0 , 0]],
I
r02 , v02 = [[1 , 0], [0 , 1]]
I
4 TÓPICOS VARIADOS DE PROGRAMAÇÃO EM python 25
tn = tn + 1
n = n + 1
evolfile.close()
tn = tn + 1
n = n + 1
1 1
K(𝑡) = 𝑚1 k v1 k 2 + 𝑚2 k v2 k 2
2 2
Para isto, usar a função np.loadtxt de numpy, a qual recebe como
4 TÓPICOS VARIADOS DE PROGRAMAÇÃO EM python 26
Exercícios
Implementar um algoritmo de alagamento numa grade de 𝑁 × 𝑁
células e executa uma animação a medida que o algoritmo avança.
Para isto, considerar:
def bubble_sort(arr):
n = len(arr)
for i in range(n):
for j in range(0, n-i-1):
if arr[j] > arr[j+1]:
arr[j], arr[j+1] = arr[j+1], arr[j]
return arr
def selection_sort(arr):
n = len(arr)
for i in range(n):
min_idx = i
for j in range(i+1, n):
if arr[j] < arr[min_idx]:
min_idx = j
arr[i], arr[min_idx] = arr[min_idx], arr[i]
return arr
def quick_sort(arr):
if len(arr) <= 1:
return arr
pivot = arr[len(arr) // 2]
left = [x for x in arr if x < pivot]
middle = [x for x in arr if x == pivot]
right = [x for x in arr if x > pivot]
return quick_sort(left) + middle + quick_sort(right)
Exercício
1. Explicar como que cada algoritmo funciona.
2. Criar um exemplo simples e mostrar o funcionamento passo a
passo de cada algoritmo.
3. Criar vetores de inteiros possuindo 𝑁 componentes e aplicar os
algoritmos. Para isto, considerar 𝑁 = 100 , 200 , 400 , 800 , 1600 e
medir o tempo consumido em cada caso. Plotar o tempo como
função de 𝑁 usando a escala loglog para todos os algoritmos.
Tirar conclusões.
Alphabetical Index
preface, ii