光速の測定の歴史を可視化する - Pythonで学ぶ特殊相対論の入り口

# はじめに

Pythonと物理学や相対論が好きな方へ向けて、特殊相対論の入り口として、光速の測定の歴史について紹介します。この記事では、光速度の歴史的な測定値をPythonを使ってグラフに描画し、それぞれの測定方法の違いとその歴史を理解する手助けをしつつ、相対論を歴史の中で理解できることを目指してみます。

---

# 光速の測定の歴史

## 測定データの詳細

まずは、簡単に歴史を概説します。1600年頃から、ガリレオやケプラーによる望遠鏡や天体観測が進み、地球以外の惑星、具体的には木星の周りを回る衛星が発見されました。それにより、地球が太陽を周りを30km/sで公転しており、(当時はまだ無限大の速度と思われていましたが)光速30万km/sの約0.01%程度で運動する地球という実験舞台を手に入れました。それを活用したのが 1676年のレーマの木星の衛星イオをもちいた食の実験です。

しかし、宇宙が謎の存在のため、科学者は地球上で光速を測定する必要がありました。1850年ごろ、フィゾーによる高速に回転する歯車(1879年 エジソンが発熱電球発明なので、それより前)を用いて、今の30万km/sに近い値を得ました。

以下、測定データの各実験についての簡潔に説明します。

- Ole Rømer (Jupiter's moons) - 1676年

Ole Rømerは、木星の衛星イオの食の観測を通じて光が有限の速度で伝わることを示しました。彼は、地球と木星との相対的な位置によって、イオの食が予測よりも早くまたは遅く起こることから、光の速度を計算しました。

- James Bradley (Aberration of light) - 1728年

James Bradleyは、「光行差」という現象を発見しました。これは、地球の公転による視線の変化から光の速さを測定する方法です。彼の観測により、光が有限の速さで伝わることがさらに確認されました。

- Hippolyte Fizeau (Toothed wheel) - 1849年

Hippolyte Fizeauは、回転する歯車を用いた方法で光速を測定しました。一束の光を歯車を通して送り、反射して戻ってくる光が隣の歯の隙間を通過するタイミングを計測することで、光速を算出しました。

- Léon Foucault (Rotating mirror) - 1862年

Léon Foucaultは、回転する鏡を使用して光速を測定しました。光を鏡に当てて反射させ、その光が往復する間に鏡が微小に回転することにより、光の速度を計測しました。

- Albert A. Michelson (Rotating mirrors) - 1907年

Albert Michelsonは、回転鏡を改良した装置を用いて、より精密な光速の測定を行いました。彼の実験は、光速の測定技術をさらに進化させたもので、特に精度の高い測定結果を得ることができました。

- Albert A. Michelson (Vacuum method) - 1926年
 
同じくAlbert Michelsonが行ったこの実験では、真空中で光速を測定しました。真空中での測定により、光速が物質の影響を受けずに測定されるため、より正確な値を得ることができました。

- Louis Essen (Cavity resonator) - 1950年

Louis Essenはマイクロ波技術を用いてキャビティ共振器内の光の速度を測定しました。この方法により、非常に高い精度で光速が測定され、その結果は現代の光速値の標準とされています。

- Evanson et al. (Standard value) - 1973年

1973年には、Evanson とそのチームによる測定が国際単位系での光速の標準値として採用されました。この値は、現在でも使用されている光速の最も精確な測定値です。

---

## 歴史上の人物

ただの偶然にしかすぎませんが、1642年は、ガリレオがなくなり、その年のクリスマスにニュートンが誕生しています。1879年にマクスウェルが亡くなり、アインシュタインが誕生しています。

アインシュタインは「私たちは巨人の肩の上に乗っている」というニュートンの言葉を引用し、しばしば科学的進歩は個々の天才によるものではなく、多くの人々の蓄積された努力の結果であると強調しています。彼は、科学的発見は集団的な努力と、過去の業績に深く依存していることを認め、自身の成功も他の多くの人々の業績によって可能になったと述べています。光速度の歴史を振り返ると、さまざまな工夫を凝らして実験をした偉人から、天体観測から地動説を唱えたガリレオやケプラーから、運動の法則を整理したニュートン、電磁気学をまとめたマクスウェルなど、さまざまな科学者が力を合わせて真実の探究を続けてきたことがわかります。

---

## Python を用いた可視化方法

グラフにプロットするデータは、以下のようになります。各要素は、測定された年、光速（km/s）、実験者名または方法、そして測定の誤差を含みます。

googlecolab　をお使いの人は、

https://colab.research.google.com/drive/1uXSvVsU8_T-ZtwoqKhyFQ2R-iGQN9PoF?usp=sharing

から確実に実行できます。下記、コードの例になります。

``` python: 
#!/usr/bin/env python

import numpy as np
import matplotlib.pyplot as plt
# Plotting Configuration
plt.rcParams['font.family'] = 'serif'

# 光速度の測定の歴史データを利用
# 各測定は（年、速度（km/s）、実験者/方法、誤差）の形式
measurements = [
    (1676, 220000, "Ole Rømer\n(Jupiter's moons)", 5000),
    (1728, 301000, "James Bradley\n(Aberration of light)", 10000),
    (1849, 315000, "Hippolyte Fizeau\n(Toothed wheel)", 5000),
    (1862, 299892, "Léon Foucault\n(Rotating mirror)", 100),
    (1907, 299776, "Albert A. Michelson\n(Rotating mirrors)", 50),
    (1926, 299796, "Albert A. Michelson\n(Vacuum method)", 10),
    (1950, 299792.5, "Louis Essen\n(Cavity resonator)", 1),
    (1973, 299792.458, "Evanson et al.\n(Standard value)", 0.001)
]

# 有名人物の略歴
# 各データは、生誕年、没年、名前、表示上のオフセットの形式
events = [
    (1564, 1642, "Galileo Galilei", 280000),    
    (1642, 1727, "Isaac Newton", 270000),    
    (1707, 1783, "Leonhard Euler", 260000),    
    (1777, 1855, "Gauss", 250000),        
    (1831, 1879, "James Clerk Maxwell", 240000),        
    (1879, 1955, "Albert Einsteinbi-", 230000)        
]

# データを分解
years = [m[0] for m in measurements]
speeds = [m[1] for m in measurements]
experiments = [m[2] for m in measurements]
errors = [m[3] for m in measurements]

# データを分解
birth = [t[0] for t in events]
death = [t[1] for t in events]
names = [t[2] for t in events]
offsets = [t[3] for t in events]

# グラフを作成
plt.figure(figsize=(13,8))
plt.errorbar(years, speeds, yerr=errors, fmt='o', capsize=5, label='Measured Speed with Error')

# 歴史上の有名人物のプロット
for birth_year, death_year, name, offset in events:    
    plt.errorbar([birth_year,death_year], [offset,offset], fmt='o-', capsize=5, label=name)

# 各点にラベルを付ける
for i, txt in enumerate(experiments):
    if i > 2:
        plt.annotate(txt, (years[i], speeds[i]), textcoords="offset points", xytext=(30,-90), ha='center', rotation=-45)
    else:
        plt.annotate(txt, (years[i], speeds[i]), textcoords="offset points", xytext=(30,35), ha='center', rotation=30)

# グラフのタイトルと軸のラベル
plt.title('History of the Measurement of the Speed of Light with Error Bars')
plt.xlabel('Year')
plt.ylabel('Speed of Light (km/s)')

# y軸のスケールを調整
plt.ylim(200000, 350000)
# y軸のスケールを調整
plt.xlim(1550, 2030)

# 凡例を追加
plt.legend(loc="best")

# グラフを表示
plt.grid(True, alpha=0.2)
plt.savefig("history_of_light.png")
plt.show()
```
---

## 光速の測定の歴史と有名人物の関係

![スクリーンショット 2024-05-01 11.53.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179652/ca079dd5-7529-c740-afa7-698b7333f0a3.png)

--- 

### 必要なツール

- Python
- NumPy
- Matplotlib

の３つのライブラリだけです。これらを用いて、光速を測定した歴史的な実験データを可視化します。まずは、必要なライブラリをインポートし、フォントの設定を行いましょう。

ソフトウェアの前提やPythonの使い方が曖昧な人は先に下記の記事などを一読ください。

https://qiita.com/yamadasuzaku/items/f4535f16ea69f1f3cc2c

---

# まとめ

このように、歴史と紐づけて特殊相対論の入り口である、光速度が一定と考えるに至る経緯を眺めてみると、相対論について楽しく学べるキッカケになるのではと思います。色々と自分で Python を使ってグラフを書いてみるキッカケにもなれば幸いです。