【特殊相対性理論を実験したい】「時間の遅れ」をPythonで再現する

# ローレンツ因子を推定するシミュレーション実験

## 1. 記事の目的
この記事では、特殊相対性理論の核心である「ローレンツ因子」を実験的に推定するシミュレーションを紹介します。宇宙線ミューオンの観測データをシミュレーションし、ローレンツ因子を推定することで、「特殊相対性理論の効果」、つまり、**時間の遅れ**の実在を直感的に理解することを目指します。

---

## 2. 実験の概要
ミューオンは、地球の大気圏上部で生成される素粒子で、静止状態での平均寿命は約2.2マイクロ秒（μs）です。しかし、ミューオンは光速に近い速度で移動するため、時間の遅れによって地上で観測される数が増加します。この現象を利用して、ローレンツ因子を推定します。

### 実験の手順
1. ミューオンの速度と大気圏の高さを仮定します。
2. ミューオンの崩壊をランダムにシミュレーションし、地上で観測されるミューオンの数を計算します。
3. 観測データから、ローレンツ因子を逆算します。

---

## 3. 実験に登場する専門用語の解説

### ローレンツ因子（γ）
ローレンツ因子は、特殊相対性理論において時間の遅れや長さの収縮を表す重要な因子です。速度が光速に近づくほど大きくなり、以下の式で定義されます。

$$
\gamma = \frac{1}{\sqrt{1 - \frac{v^2}{c^2}}}
$$

### ミューオン
ミューオンは、素粒子の一種で、電子に似た性質を持ちますが、質量は約200倍大きいです。宇宙線が大気圏と相互作用することで生成されます。

### 時間の遅れ
高速で移動する物体の時間は、静止している観測者から見ると遅れて進みます。この現象は、ローレンツ因子によって説明されます。

---

## 4. コードの概要
このシミュレーションでは、以下のステップでローレンツ因子を推定します。

1. **ミューオンの崩壊シミュレーション**:
   - ミューオンの崩壊時間を指数分布に従ってランダムに生成します。
   - ローレンツ因子を仮定し、時間の遅れを考慮してミューオンの寿命を延ばします。

2. **ローレンツ因子の推定**:
   - 観測されたミューオン数に基づいて、ローレンツ因子を逆算します。
   - シミュレーション結果と観測データを比較し、最も近いローレンツ因子を選択します。

3. **可視化**:
   - ローレンツ因子と地上で観測されるミューオン数の関係をグラフ化します。

---

## 5. コード
```python
import numpy as np
import matplotlib.pyplot as plt

# 定数
c = 299792458  # 光速 (m/s)
muon_lifetime = 2.2e-6  # ミューオンの静止寿命 (秒)
atmosphere_height = 10000  # 大気圏の高さ (メートル)

# ミューオンの速度 (光速の99%)
v = 0.99 * c

# ミューオンの崩壊をシミュレーションする関数
def simulate_muons(num_muons, v, muon_lifetime, atmosphere_height, gamma):
    # ミューオンが大気圏を通過する時間
    time_to_earth = atmosphere_height / v
    
    # 時間の遅れを考慮したミューオンの寿命
    dilated_lifetime = gamma * muon_lifetime
    
    # ミューオンの崩壊をランダムにシミュレーション
    decay_times = np.random.exponential(dilated_lifetime, num_muons)
    survived_muons = np.sum(decay_times > time_to_earth)
    
    return survived_muons

# ローレンツ因子を推定する関数
def estimate_lorentz_factor(num_muons, v, muon_lifetime, atmosphere_height, observed_muons):
    # ローレンツ因子の範囲を設定
    gamma_values = np.linspace(1, 20, 1000)
    
    # 各γに対してシミュレーションを実行
    survived_muons_values = np.array([
        simulate_muons(num_muons, v, muon_lifetime, atmosphere_height, gamma) 
        for gamma in gamma_values
    ])
    
    # 観測されたミューオン数に最も近いγを選択
    gamma_estimate = gamma_values[np.argmin(np.abs(survived_muons_values - observed_muons))]
    
    return gamma_estimate

# シミュレーションのパラメータ
num_muons = 10000  # 初期のミューオン数
gamma_theoretical = 1 / np.sqrt(1 - (v**2 / c**2))  # 理論的なローレンツ因子
observed_muons = simulate_muons(num_muons, v, muon_lifetime, atmosphere_height, gamma_theoretical)  # 理論値に基づく観測数

# ローレンツ因子を推定
gamma_estimate = estimate_lorentz_factor(num_muons, v, muon_lifetime, atmosphere_height, observed_muons)

# 結果の表示
print(f"理論的なローレンツ因子: {gamma_theoretical:.2f}")
print(f"推定されたローレンツ因子: {gamma_estimate:.2f}")

# シミュレーション結果を可視化
gamma_values = np.linspace(1, 20, 1000)
survived_muons_values = np.array([
    simulate_muons(num_muons, v, muon_lifetime, atmosphere_height, gamma) 
    for gamma in gamma_values
])

plt.figure(figsize=(10, 6))
plt.plot(gamma_values, survived_muons_values, label="シミュレーション結果", color="blue")
plt.axhline(observed_muons, color="red", linestyle="--", label="観測されたミューオン数")
plt.axvline(gamma_estimate, color="green", linestyle="--", label=f"推定されたローレンツ因子: {gamma_estimate:.2f}")
plt.xlabel("ローレンツ因子 (γ)")
plt.ylabel("地上で観測されるミューオン数")
plt.title("ローレンツ因子の推定")
plt.legend()
plt.grid()
plt.show()
```
https://github.com/meta77/relativity

## 6. 実験結果と解釈
### 実行結果
出力の例（シミュレーションなので、実行ごとに結果は変わります。）
```
理論的なローレンツ因子: 7.09
推定されたローレンツ因子: 7.24
```

![ローレンツ因子実験改良.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281138/84b7cd6f-d258-4f32-958e-192db9618229.png)


* 推定されたローレンツ因子: 例えば、速度が0.99cの場合、ローレンツ因子は約7.09と推定されます。
* グラフ: ローレンツ因子が大きくなるほど、地上で観測されるミューオン数が増加する様子が確認できます。
### 結果の解釈
* 速度が0.99cのとき:
    * ローレンツ因子は約7.09と推定されます。
    * これは、理論値と一致しており、時間の遅れが正しく反映されていることを示しています。

* 観測データの重要性:
    * 観測されたミューオン数が増加すると、ローレンツ因子も大きくなります。
    * この実験は、特殊相対性理論の予測を実証するための重要な手段です。


## 7. 関連記事
いろいろな学問を楽しみための記事を投稿しています。学問や教養を自分のペースでゆったり楽しみたい。ぜひ読んでみてください。
・[知を広げ楽しむ【学問大好き】あらゆるテーマの読書記録・おすすめ本紹介](https://www.buchinuku.work/entry/2024/4/23)
・[【コンピュータは数学者になれるのか】 人工知能は数学できるか？数学の本質とは何か？](https://www.buchinuku.work/entry/2019/11/1)
・[証明＝プログラム!? 【カリーハワード同型対応】 計算と論理の奥深い関係](https://www.buchinuku.work/entry/2019/12/11)
・[【論理の哲学】 論理と数学の関係、論理と哲学の関係に迫る](https://www.buchinuku.work/entry/2019/7/28)


・[線形代数の「背景と概念」をもっとよく分かりたい【数学弱者・凡人のための線形代数入門】](https://qiita.com/kyogoku_meta/items/077e9972dcd7b08d6473)
・[なぜ完璧なバグ検出プログラムは存在しないのか？【計算理論入門】](https://qiita.com/kyogoku_meta/items/b1a71f4c12c7ef2ab352)