EP1〜EP5までで覚えたことを、夏休みの自由研究にしてみよう。先生もまだ見たことがないようなプログラムが、自分で作れるよ。今回は6つのテーマを提案します。
テーマ1:振り子の周期を測ろう(理科)
振り子の周期(1往復の時間)は、ひもの長さだけで決まる、と学校で習う。本当かな?プログラムでシミュレートして、長さを変えながら周期を測ってみよう。
import mathimport matplotlib.pyplot as plt
# 振り子のシミュレーションdef simulate_pendulum(length, dt=0.01, total_time=10): g = 9.8 # 重力加速度 angle = math.radians(20) # 最初の角度(20度) angular_velocity = 0 # 最初の速さ times = [] angles = [] t = 0 while t < total_time: # 物理計算(振り子の運動方程式) angular_acceleration = -g / length * math.sin(angle) angular_velocity += angular_acceleration * dt angle += angular_velocity * dt times.append(t) angles.append(math.degrees(angle)) t += dt return times, angles
# 長さを変えて比較for length in [0.25, 1.0, 2.25]: # 25cm, 1m, 2.25m t, a = simulate_pendulum(length) plt.plot(t, a, label=f"{length}m")
plt.xlabel("時間 (秒)")plt.ylabel("角度 (度)")plt.legend()plt.title("振り子の長さで周期が変わる")plt.show()1m の振り子の周期は約2秒。25cm(1/4倍)にすると約1秒(半分)。長さが4倍になると周期は2倍に。これが「振り子の周期は√(長さ)に比例」という法則です。
テーマ2:桜の開花日を予測しよう(理科+データ)
桜は「春になって暖かくなり、合計の気温が一定値(東京なら 600°C)を超えると咲く」という性質がある。気象庁のデータで実際に予測してみよう。
import requests
# 過去の気温データを使って、累積温度から開花日を予測# (実際は2月1日からの平均気温を足していき、600°Cを超えた日が開花日)
# サンプルデータdaily_temps = [5, 6, 7, 5, 8, 10, 12, 11, 9, 13, 15, 14, 16, 18, 17, 16, 19]
cumulative = 0for day, temp in enumerate(daily_temps, start=1): cumulative += temp print(f"2/{day}日目: 平均気温 {temp}°C, 累積 {cumulative}°C") if cumulative >= 100: # 簡略化 print(f"→ 開花予測! ({day}日目)") breakテーマ3:自分の声を見える化(理科)
「あ」「い」「う」と声を出すと、波の形が違うよ。マイクで録音した声を、Pythonで描いてみよう。
# Colab でマイク録音できる準備!pip install -q sounddeviceimport sounddevice as sdimport numpy as npimport matplotlib.pyplot as plt
print("3秒、声を出してね!")duration = 3recording = sd.rec(int(duration * 44100), samplerate=44100, channels=1)sd.wait()print("録音終了!")
plt.figure(figsize=(10, 3))plt.plot(recording)plt.title("きみの声")plt.show()はクラウド上で動くので、自分のマイクを使うには少し準備が必要。実際は js を使った録音 widget が必要になります。代わりに「フリー音源 .wav」をダウンロードして波形を描く方法でもOK。
テーマ4:星の動きを再現(理科)
import matplotlib.pyplot as pltimport numpy as np
# 北極星の周りを回る星たちangles = np.linspace(0, 2 * np.pi, 12) # 12時間分fig, ax = plt.subplots(figsize=(6, 6))for r in [1, 2, 3]: # 距離が違う星 x = r * np.cos(angles) y = r * np.sin(angles) ax.plot(x, y, marker="*", markersize=15)ax.plot(0, 0, marker="*", markersize=20, color="gold", label="北極星")ax.set_aspect("equal")ax.legend()plt.title("星が北極星の周りを回る")plt.show()テーマ5:好きな町ランキング(社会)
総務省のe-Stat APIで、都道府県の人口・面積・産業データを取って、自分なりの「住みたい町ランキング」を作ろう。
テーマ6:自分だけのクイズアプリ(応用)
quizzes = [ {"q": "日本一高い山は?", "a": "富士山"}, {"q": "1+1は?", "a": "2"}, {"q": "光の3原色のうち、青と赤と何色?", "a": "緑"},]
correct = 0for i, quiz in enumerate(quizzes, 1): answer = input(f"問題{i}: {quiz['q']} ") if answer == quiz["a"]: print("⭕ 正解!") correct += 1 else: print(f"❌ ざんねん。答えは {quiz['a']} でした")
print(f"\n{correct}/{len(quizzes)} 正解!")発表のしかた
- 1Colab の 「共有」 ボタンで、リンクをクラスのみんなに送る
- 2スクリーンショットを撮って、紙の自由研究と一緒に提出
- 3実物(振り子・桜の写真) とプログラムを並べて、「両方やった」と伝えると先生に響く
- 4「Pythonで動かしてみたら〇〇が分かった」 という体験をまとめると、研究としての完成度が高い
次回予告
次回(EP.07)からは、もっと面白いことに挑戦するよ。第7回は「自分だけのチャットbot」を作ります。話しかけたら答えてくれる、簡単なロボットbotを5分で。
この記事の感想を教えてください
あなたの 1 クリックで、本当にこの記事は更新されます。「もっと詳しく」「続編希望」が一定数集まった記事は、 ふくふくが 実際に内容を拡充したり続編記事を公開 します。 送信したリアクションはお使いのブラウザに記録され、再カウントされません。