機雷がなんだ! 全速前進!

SEというかプログラマというか、日々のエンジニア生活の中で体験したことなどを中心に書き残しています。

生成AIで誰でも簡単に物理シミュレーションできる時代

時々 Google Colaboratory を使って遊んでいます。Webブラウザだけで簡単に計算したりシミュレーション結果を可視化したりできて非常に便利です。しかも基本的に無料で利用できます。以前の記事で紹介した通り、生成AI(Google Gemini)を使うことでサクッとプログラムの修正ができてしまうことを知ってからは、試してみたいけどちょっと面倒だと思ったことを、生成AIで簡単に試せることを知りました。

例えば、以下のような事がものの数分で簡単に試せてしまいます。なんて恵まれた時代だ。

例1:特殊相対性理論の可視化

プロンプト:

アインシュタインの特殊相対性理論の一般式(速度がゼロでない場合)
を光速は秒速30万km/sとして二次元のグラフで可視化してください。
縦軸を質量、横軸を速度としてください。また、グラフのラベルは英語表記としてください。

実行結果:

import numpy as np
import matplotlib.pyplot as plt

# Speed of light in km/s
c = 299792.458

# Rest mass (arbitrary value for demonstration)
m0 = 1.0  # Assume a rest mass of 1 unit

# Define a range of velocities from 0 up to (but not including) the speed of light
# We'll use a small epsilon value to avoid division by zero at v = c
v = np.linspace(0, c * 0.995, 500)  # velocities from 0 to 99.5% of c

# Calculate the relativistic mass
# The formula is m = m0 / sqrt(1 - (v^2 / c^2))
mass = m0 / np.sqrt(1 - (v**2 / c**2))

# Create the plot
plt.figure(figsize=(10, 6))
plt.plot(v, mass)

# Set labels and title
plt.xlabel('Velocity (km/s)')
plt.ylabel('Relativistic Mass (arbitrary units)')
plt.title('Relativistic Mass vs. Velocity')
plt.grid(True)

# Show the plot
plt.show()

この結果から、例えば、物体が光速の99.5%に達した場合、質量が約10倍程度になることが分かります。 また、さらにそれ以上に速度を上げようとすると質量は急激に増加してしまい、結局は光速に到達できないことも一目で分かります。 ブルーバックスなんかを読んでいると、本に記載されている内容を無性に試したり、確認してみたいという衝動に駆られた事が何度もありました。 しかし、その度に、それだけのためにいちいコード書いて試すのが面倒で思いとどまる事が多かったですが、今ではこんなに簡単にできてしまいます。

例2:プログラムの解説(要約)

もちろん解説や要約やレビューも生成AIにはお手の物です。

プロンプト:

このプログラムを解説してください。

実行結果:

このコードは、Albert Einstein特殊相対性理論(Special Relativity) における「相対論的質量」の式を使って、速度と質量の関係をグラフ化するものです。順番に解説します。

① 使っている理論式

特殊相対性理論では、物体が光速に近づくと質量が増加すると表されます(※現在の物理では“相対論的質量”よりも“エネルギー増加”で説明するのが主流ですが、この式は教育目的でよく使われます)。

相対論的質量の式

  • ( m_0 ):静止質量(rest mass)
  • ( v ):物体の速度
  • ( c ):光速
  • 分母の部分を ローレンツ因子(Lorentz factor) と呼びます

② コードの各部分の意味

1️⃣ ライブラリの読み込み

import numpy as np
import matplotlib.pyplot as plt
  • numpy → 数値計算
  • matplotlib → グラフ描画

2️⃣ 光速の設定

c = 299792.458

3️⃣ 静止質量

m0 = 1.0

デモ用に「1」としています。 単位は任意(arbitrary units)。

4️⃣ 速度の範囲

v = np.linspace(0, c * 0.995, 500)
  • 0 から 99.5% の光速まで
  • 500点で分割

なぜ 100% にしない?

だと

になり、ゼロ割りで無限大になるからです。

5️⃣ 相対論的質量の計算

mass = m0 / np.sqrt(1 - (v**2 / c**2))

式そのままです。

  • 低速ではほぼ m0
  • 光速に近づくと急激に増加
  • c に近づくと無限大へ発散

6️⃣ グラフ描画

plt.plot(v, mass)
横軸

Velocity (km/s)

縦軸

Relativistic Mass

③ グラフの物理的意味

このグラフは次の性質を示します:

🔹 低速領域
  • 質量はほぼ一定
  • ニュートン力学とほぼ同じ
🔹 中速領域
  • 少しずつ増加
🔹 光速に近づくと
  • 急激に上昇(ほぼ垂直に立ち上がる)

つまり:

物体は光速に到達できない

なぜなら、 到達するには「無限大のエネルギー」が必要だからです。

④ このコードの物理的ポイント

✔ 特殊相対性理論の一般式を使用 ✔ 速度がゼロでない場合を含む ✔ ローレンツ因子を利用 ✔ 発散(infinite behavior)を数値的に確認できる

⑤ 現代物理での注意

現在の物理では、

「質量が増える」という言い方よりも、

として

  • 質量は不変
  • エネルギーが増加する

と説明するのが一般的です。

⑥ まとめ

このコードは:

✔ 特殊相対性理論の相対論的質量を ✔ 数値的に計算し ✔ 光速に近づくと発散する様子を ✔ 英語ラベル付きで可視化する

教育用として非常にわかりやすい例です。


(↑↑↑ 生成AIの実行結果はここまで ↑↑↑)


こんな感じで壁打ち的に生成AIと会話しながら、次はこれ、その次は... と、どんどん試していけるのがいいですよね。

おまけ

(当たり前ですが)数学の数値シミュレーションも簡単に試せます。

プロンプト:

マンデルブロ集合を数値計算して可視化してください。

実行結果:

pip install numpy pandas matplotlib seaborn scikit-learn
import numpy as np
import matplotlib.pyplot as plt

def mandelbrot(c, max_iter):
    z = 0
    for n in range(max_iter):
        z = z*z + c
        if abs(z) > 2:
            return n
    return max_iter

width, height = 512, 512
max_iter = 256

x, y = np.linspace(-2, 1, width), np.linspace(-1.5, 1.5, height)
c = x[np.newaxis, :] + y[:, np.newaxis] * 1j

mandelbrot_set = np.vectorize(mandelbrot)(c, max_iter)

plt.figure(figsize=(12, 12))
plt.imshow(mandelbrot_set, extent=[-2, 1, -1.5, 1.5], cmap='viridis')
plt.xlabel("Re(c)")
plt.ylabel("Im(c)")
plt.title("Mandelbrot Set")
plt.colorbar()
plt.show()

コラッツ予想のシミュレーションなんかさせるのも楽しいですね(もちろん解決はできませんが...)。

参考

github.com