Médio · Onda de pêndulos

Lição 5: Fórmulas sobre arrays

Construa em Python o padrão “Onda de pêndulos” e aprenda pelo caminho:

  • uma fórmula de física aplicada a um array inteiro
  • np.round e print para uma verificação rápida
  • vários gráficos lado a lado com plt.subplots
  • f-strings
  • fase: em que ponto da oscilação está um pêndulo

Veja-o primeiro

É reproduzido a partir do YouTube depois de um clique.

pendulum-wave.py
"""Pendulum wave: 24 pendulums making 51, 52, ... 74 swings in 60 seconds.
Run: python pendulum-wave.py   (needs: pip install numpy matplotlib)
"""
import numpy as np
import matplotlib.pyplot as plt

plt.style.use("dark_background")

g, cycle = 9.81, 60.0  # gravity in m/s^2, seconds until they are back in step
n = np.arange(51, 75)  # swings per cycle, one more for each pendulum
period = cycle / n
length = g * (period / (2 * np.pi)) ** 2  # small swings: T = 2 pi sqrt(L / g)
print("lengths in cm:", np.round(length * 100, 1))

fig, axes = plt.subplots(1, 4, figsize=(12, 4), sharey=True)
for ax, t in zip(axes, [0, 15, 20, 30]):
    swing = np.cos(2 * np.pi * t / period)  # where each bob is, from -1 to 1
    ax.scatter(swing, np.arange(len(n)), c=swing, cmap="cool", s=40)
    ax.set_title(f"t = {t} s")
    ax.set_xlim(-1.2, 1.2)
    ax.axis("off")
plt.show()

# Try: t = 60 s (or 75, 80, 90): the same pictures again, as every count is whole

Não tem Python neste computador? O notebook executa o mesmo script, os exercícios e as respostas no navegador, no Google Colab. O notebook está em inglês.

Linha a linha

  1. n = np.arange(51, 75)

    As 24 contagens de oscilações por minuto: 51, 52, … 74.

  2. period = cycle / n

    O período de cada pêndulo: 60 segundos divididos pela sua contagem.

  3. length = g * (period / (2 * np.pi)) ** 2

    A fórmula do pêndulo para oscilações pequenas, T = 2π√(L / g), com o comprimento L isolado.

  4. fig, axes = plt.subplots(1, 4, figsize=(12, 4), sharey=True)

    Uma figura com quatro gráficos lado a lado; o loop preenche um gráfico por instante.

  5. swing = np.cos(2 * np.pi * t / period)

    Onde está cada peso no instante t, de −1 a 1: depois de t / period oscilações, o cosseno de outras tantas voltas completas.

  6. ax.set_title(f"t = {t} s")

    Uma f-string põe o valor de t no título.

Experimente

  1. Que comprimento têm o pêndulo mais comprido e o mais curto?

    Pista

    O script mostra os comprimentos.

    Resposta

    34,4 cm para 51 oscilações por minuto, 16,3 cm para 74.

  2. Acrescente o instante t = 12 s. Em quantos grupos se divide a fila?

    Pista

    É preciso um quinto gráfico: plt.subplots(1, 5) e [0, 12, 15, 20, 30].

    Resposta

    Cinco: aos 12 s, um quinto do minuto, pêndulos vizinhos estão separados por um quinto de oscilação.

  3. Passe para 30 pêndulos.

    Pista

    Mude o fim de np.arange.

    Resposta

    n = np.arange(51, 81) dá 30 contagens, de 51 a 80.

Quiz

1. Por que razão todos os pêndulos voltam a estar alinhados aos 60 s?
2. O que faz sharey=True?
3. T = 2π√(L / g), com L isolado, é…
4. Com t = 15, f"t = {t} s" dá…
5. Aos 30 s, pêndulos vizinhos estão separados por meia oscilação. O que se vê?

Flashcards

Leia a frente, tente recordar o verso e só depois abra o cartão.

  • plt.subplots(1, 4)

    Uma figura e quatro gráficos (axes) numa linha, para desenhar um a um.

  • f"t = {t} s"

    Uma f-string: o valor de t entra no lugar de {t}.

  • Período do pêndulo

    Para oscilações pequenas, T = 2π√(L / g): quatro vezes mais comprido significa duas vezes mais lento.

  • Fase

    Em que ponto da sua oscilação está um pêndulo; aqui, o cosseno de 2π·t / T.

  • np.round(x, 1)

    Arredonda cada número de um array a uma casa decimal.

Estes flashcards numa página à parte →