はじめに
本記事では、ポケモンの「色違い確率」の例を通して、
微分や指数関数の概念を直感的に理解できるような Python コードを紹介します。
確率関数の傾き(微分)を求め、**「色違いが出る確率がどのように変化するか」**を
コードで示します。
参考リンクまとめ
Pythonコード
import numpy as np
import matplotlib.pyplot as plt
from sympy import symbols, diff, simplify, lambdify
# -------------------------------
# Symbolic calculation with calculus / 微積分を使って記号計算
# -------------------------------
# 定義 / Define symbolic variable
N = symbols('N', real=True, positive=True)
# P(N) = 1 - (1 - 1/N)^N
P = 1 - (1 - 1/N)**N
# 微分 / Derivative dP/dN
dP_dN = diff(P, N)
dP_dN_simplified = simplify(dP_dN)
# 数値関数に変換 / Convert to numerical functions
P_func = lambdify(N, P, 'numpy')
dP_func = lambdify(N, dP_dN_simplified, 'numpy')
# -------------------------------
# Evaluate and plot / 数値評価とプロット
# -------------------------------
# Nの範囲 / Range of N
N_vals = np.linspace(1, 1000, 500)
P_vals = P_func(N_vals)
dP_vals = dP_func(N_vals)
# プロット: 確率 / Plot probability
plt.figure(figsize=(10, 5))
plt.subplot(1, 2, 1)
plt.plot(N_vals, P_vals, label='P(N)')
plt.xlabel('N')
plt.ylabel('Probability')
plt.title('Shiny Probability vs N')
plt.grid(True)
plt.legend()
# プロット: 微分値 / Plot derivative
plt.subplot(1, 2, 2)
plt.plot(N_vals, dP_vals, color='orange', label="dP/dN")
plt.xlabel('N')
plt.ylabel('dP/dN')
plt.title('Rate of Change of Shiny Probability')
plt.grid(True)
plt.legend()
plt.tight_layout()
plt.show()
# 結果の表示 / Show simplified derivative
dP_dN_simplified
final_N, final_P