相対性理論とかよく分からないけどPythonしてみた　〜投げたボールの行方〜

#概要
光の速さで爆進する宇宙船からボールを投げたらどうなるかを、pythonの助けを借りて理解したいと思います。

#相対性理論
有名な相対性理論の話に

>ロケットが光の速度に近づくほど時間の流れが遅くなる

というのがありますよね。
浦島効果とかいうんでしたっけ。

では、光の速さに近いロケットからボールを前に投げるとどうなるのか？
時間の流れが遅いのだから、大谷翔平投手の豪速球でもかなり遅くなるはずですね。

#ガリレイ変換
さて、ガリレイ変換というのがあります。

```math
u = v + w
```
宗教裁判で有名なガリレオ・ガリレイ先生が400年も前に考えた式で、速度wで移動している馬車の窓から前方にリンゴを速度vで投げると、v＋wの速度で通行人に当たるよ、という意味です。危ないからやめましょうね。

#ローレンツ変換
実はガリレイ変換は100%正しいという訳ではなかった。
ホントはこうだよ、というのが300年後の1905年にアインシュタイン先生によって示されました。これはローレンツ変換という式から導かれます。

```math
u = \frac{v + w}{1 + \frac{v  w}{c^2}}
```
ガリレイ先生の式よりかなり複雑になっていますね。
式に出てくるcは光の速度です。

#Python
では、アインシュタイン先生の式をpythonにぶち込んで大谷投手のボールがどうなるのか見てみましょう。
その前に環境。

#環境
Mac
Jupyter Notebook
Python3

#計算
光の速さに近いロケットから投球する前に、まずは歩きながらボールを投げてもらいましょう。
歩く速度を秒速1メートルとします。大谷投手のボールの速さは時速165km、秒速では45.83メートルです。速いですね。

```python
import math

# 光速　約30万キロメートル/s (メートルで計算)
speedOfLight = 299792458

#ローレンツ変換の関数（変換式から元の速度を引いたもの）
def convertSpeed(baseSpeed, throwSpeed):
    return (baseSpeed + throwSpeed) / (1 + baseSpeed * throwSpeed / speedOfLight ** 2) - baseSpeed

#歩きながらボールを投げる
speed = convertSpeed(1, 45.83)
print(speed)
```
計算では簡単にするためにボールの速度から歩く速度を引きました。
相対性理論によれば動いていると時間の流れは遅くなるので、球の速さは45.83メートルより遅くなっているはずです。

結果は、
>45.82999999999998 m/s

でした。
ほとんど変わっていません。

実はガリレイ変換の誤りに300年間も誰も気づかなかったのは、日常的なスピードではローレンツ変換とほとんど差がないからなのです。

#一体どのくらいのスピードで移動すれば時間が遅くなったことを体感できるのか？

次は新幹線に乗って投球してもらいましょう。
新幹線は最高時速320km、秒速では88.88メートルです。

```python
#新幹線に乗ってボールを投げる
speed = convertSpeed(88.88, 45.83)
print(speed)
```
>45.82999999999387 m/s

ボールの速度は小数点12桁目でようやく遅くなりました。
これではどうみても誤差の範囲内にされるレベルです。

次は月ロケットに乗ってボールを投げてもらいましょう。
地球を脱出するのに必要な月ロケットの速度は時速40,300km、秒速11,194.44メートルです。ムチャクチャ速いです。
これなら流石に分かるくらい時間の流れが遅くなるでしょう。

```python
#ロケットに乗ってボールを投げる
speed = convertSpeed(11194.44, 45.83)
print(speed)
```
>45.829999935836895 m/s

なんだ、全然変わらないぞ？
月ロケットでも相対性理論による時間の流れの変化は全く体感できません。

ここから先はSFの世界です。
スターウォーズのミレニアムファルコンに登場してもらいましょう。

#銀河系最速の宇宙船からボールを投げる

光速の20%のスピードで爆走する宇宙船を用意します。
凄まじいスピードですがファルコン号なら余裕でしょう。

```python
#光速の20％で移動する宇宙船に乗ってボールを投げる
speed = convertSpeed(60000000, 45.83)
print(speed)
```
>43.99425957351923 m/s

やりました！
ついに秒速２mくらい大谷投手のボールが遅くなりました。
でも思ったほどではないですね。光速の20％も出しているのに・・・
もっとファルコン号のスピードを上げてみましょう。次は光速の40％です。

```python
#光速の40％で移動する宇宙船に乗ってボールを投げる
speed = convertSpeed(120000000, 45.83)
print(speed)
```
>38.48704135417938 m/s

光速の40％という猛烈なスピードで移動してようやくボールを体感できるくらい遅くすることができました。
ちなみに光速の60%ではボールは秒速29メートルくらいまで遅くなってしまいます。時速にして104kmですね。それでも速いですが。

#100％光速で移動する宇宙船からボールを投げると・・・

では光速で移動しながらボールを投げるとどうなるのでしょう。

```python
#光速の10０％で移動するロケットに乗ってボールを投げる
speed = convertSpeed(speedOfLight, 45.83)
print(speed)
```
>0 m/s

結果は0メートルです。これはつまりボールは大谷投手の手を離れていない、ということを意味しています。光速で移動した場合、時間は止まってしまい誰も動けなくなる、ということですね。不思議ですね。

#グラフ
今までの実験結果をグラフにしてみましょう。
ファルコン号の初速を秒速１万kmにして、1000kmずつスピードを上げていきましょう。
スピードアップごとにボールを投げてどのくらい遅くなっているか計測します。
これを光の速さに到達するまで続けます。

```python
import math
# matplotlib をインラインで使用
%matplotlib inline
# ライブラリの読み込み
import matplotlib.pyplot as plt
from matplotlib.ticker import ScalarFormatter

# 光速　約30万キロメートル/s (メートルで計算)
speedOfLight = 299792458

#ローレンツ変換の関数（変換式から元の速度を引いたもの）
def convertSpeed(baseSpeed, throwSpeed):
    return (baseSpeed + throwSpeed) / (1 + baseSpeed * throwSpeed / speedOfLight ** 2) - baseSpeed

baseSpeedList = list()
convSpeedList = list()

#宇宙船の初速
baseSpeed = 10000000
#追加する速度
addSpeed = 100000
#ボールの速度
ballSpeed = 45.83

#宇宙船が光速に到達するまで速度を追加
while baseSpeed < speedOfLight:
    baseSpeedList.append(baseSpeed)
    convSpeedList.append(convertSpeed(baseSpeed, ballSpeed))
    baseSpeed += addSpeed

#グラフ
plt.xlabel("speed of millennium falcon (m/s)")
plt.ylabel("speed of Otani's ball (m/s)")
plt.plot(baseSpeedList, convSpeedList)
ax = plt.gca()
ax.yaxis.set_major_formatter(ScalarFormatter(useMathText=True))
ax.xaxis.set_major_formatter(ScalarFormatter(useMathText=True))
plt.show() 
```
結果のグラフです。
縦軸が大谷投手のボールの速度、横軸がファルコン号の速度です。
>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1641177/812b2869-baea-b662-1aec-1542e91f3341.png)

滑らかな曲線を描いていますね。
ファルコン号の速度に反比例する形で大谷投手のボールが遅くなっているのが分かります。
ただし一様に遅くなるのではなくて、光速に近づくほど遅くなる割合が大きくなるようです。

#分かったこと

- 月ロケットに乗っても時間の流れはほとんど変わらない
- ミレニアムファルコン号なら時間が遅くなったと体感できる（光速の４０％くらいで飛行時）
- 100%光速で移動すると時間は止まる

それではまた次回〜