중급 · 진자 파동

5강: 배열에 적용하는 공식

Python으로 “진자 파동” 패턴을 만들면서 배워요:

  • 배열 전체에 적용하는 물리 공식
  • 빠른 확인을 위한 np.round와 print
  • plt.subplots로 나란히 놓는 그래프 여러 개
  • f-문자열
  • 위상: 진자가 왕복의 어디쯤에 있는지

먼저 보기

클릭하면 YouTube에서 재생돼요.

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

이 컴퓨터에 Python이 없나요? 노트북으로 같은 스크립트와 연습 문제, 정답을 브라우저의 Google Colab에서 실행할 수 있어요. 노트북은 영어로 되어 있어요.

한 줄씩

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

    1분당 왕복 횟수 24개: 51, 52, … 74.

  2. period = cycle / n

    각 진자의 주기: 60초를 왕복 횟수로 나눈 값이에요.

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

    흔들림이 작을 때의 진자 공식 T = 2π√(L / g)를 길이 L에 대해 푼 식이에요.

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

    그래프 네 개를 나란히 놓은 그림 하나예요. 반복문이 순간마다 그래프를 하나씩 채워요.

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

    시간 t에 각 추가 있는 자리로, −1부터 1까지예요. t / period번 왕복한 뒤이므로, 그만큼의 바퀴 수에 대한 코사인이에요.

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

    f-문자열이 t의 값을 제목에 넣어요.

직접 해 보기

  1. 가장 긴 진자와 가장 짧은 진자의 길이는 얼마일까요?

    힌트

    스크립트가 길이를 출력해요.

    정답

    1분에 51번 왕복하는 진자는 34.4 cm, 74번 왕복하는 진자는 16.3 cm예요.

  2. 순간 t = 12 s를 더해 보세요. 줄이 몇 무리로 나뉘나요?

    힌트

    다섯 번째 그래프가 필요해요: plt.subplots(1, 5)와 [0, 12, 15, 20, 30].

    정답

    다섯 무리예요. 1분의 5분의 1인 12초에는 이웃끼리 5분의 1 왕복 차이가 나요.

  3. 진자를 30개로 만들어 보세요.

    힌트

    np.arange의 끝값을 바꾸세요.

    정답

    n = np.arange(51, 81)은 51부터 80까지 왕복 횟수 30개를 만들어요.

퀴즈

1. 60초에 모든 진자가 다시 박자를 맞추는 이유는 무엇일까요?
2. sharey=True는 무슨 일을 할까요?
3. T = 2π√(L / g)를 L에 대해 풀면…
4. t = 15일 때 f"t = {t} s"는…
5. 30초에는 이웃끼리 반 왕복 차이가 나요. 무엇이 보일까요?

플래시카드

앞면을 읽고, 뒷면의 내용을 스스로 말해 본 다음 카드를 펼쳐 보세요.

  • plt.subplots(1, 4)

    그림 하나와 한 행에 놓인 그래프(axes) 네 개. 하나씩 그려 넣어요.

  • f"t = {t} s"

    f-문자열: {t} 자리에 t의 값이 들어가요.

  • 진자의 주기

    흔들림이 작을 때 T = 2π√(L / g): 네 배 길면 두 배 느려요.

  • 위상

    진자가 왕복의 어디쯤에 있는지. 여기서는 2π·t / T의 코사인이에요.

  • np.round(x, 1)

    배열의 모든 수를 소수 첫째 자리까지 반올림해요.

이 플래시카드만 따로 보기 →