5강: 배열에 적용하는 공식
Python으로 “진자 파동” 패턴을 만들면서 배워요:
- 배열 전체에 적용하는 물리 공식
- 빠른 확인을 위한 np.round와 print
- plt.subplots로 나란히 놓는 그래프 여러 개
- f-문자열
- 위상: 진자가 왕복의 어디쯤에 있는지
먼저 보기
클릭하면 YouTube에서 재생돼요.
"""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에서 실행할 수 있어요. 노트북은 영어로 되어 있어요.
한 줄씩
n = np.arange(51, 75)1분당 왕복 횟수 24개: 51, 52, … 74.
period = cycle / n각 진자의 주기: 60초를 왕복 횟수로 나눈 값이에요.
length = g * (period / (2 * np.pi)) ** 2흔들림이 작을 때의 진자 공식 T = 2π√(L / g)를 길이 L에 대해 푼 식이에요.
fig, axes = plt.subplots(1, 4, figsize=(12, 4), sharey=True)그래프 네 개를 나란히 놓은 그림 하나예요. 반복문이 순간마다 그래프를 하나씩 채워요.
swing = np.cos(2 * np.pi * t / period)시간 t에 각 추가 있는 자리로, −1부터 1까지예요. t / period번 왕복한 뒤이므로, 그만큼의 바퀴 수에 대한 코사인이에요.
ax.set_title(f"t = {t} s")f-문자열이 t의 값을 제목에 넣어요.
직접 해 보기
가장 긴 진자와 가장 짧은 진자의 길이는 얼마일까요?
힌트
스크립트가 길이를 출력해요.
정답
1분에 51번 왕복하는 진자는 34.4 cm, 74번 왕복하는 진자는 16.3 cm예요.
순간 t = 12 s를 더해 보세요. 줄이 몇 무리로 나뉘나요?
힌트
다섯 번째 그래프가 필요해요: plt.subplots(1, 5)와 [0, 12, 15, 20, 30].
정답
다섯 무리예요. 1분의 5분의 1인 12초에는 이웃끼리 5분의 1 왕복 차이가 나요.
진자를 30개로 만들어 보세요.
힌트
np.arange의 끝값을 바꾸세요.
정답
n = np.arange(51, 81)은 51부터 80까지 왕복 횟수 30개를 만들어요.
퀴즈
플래시카드
앞면을 읽고, 뒷면의 내용을 스스로 말해 본 다음 카드를 펼쳐 보세요.
plt.subplots(1, 4)
그림 하나와 한 행에 놓인 그래프(axes) 네 개. 하나씩 그려 넣어요.
f"t = {t} s"
f-문자열: {t} 자리에 t의 값이 들어가요.
진자의 주기
흔들림이 작을 때 T = 2π√(L / g): 네 배 길면 두 배 느려요.
위상
진자가 왕복의 어디쯤에 있는지. 여기서는 2π·t / T의 코사인이에요.
np.round(x, 1)
배열의 모든 수를 소수 첫째 자리까지 반올림해요.