単純な関数の積分
この演習では、Monte Carlo Integration(モンテカルロ積分)の考え方をシンプルな例で体験します。
ここでは、単純な積分 \( \int_0^1 x e^{x} dx\) を評価します。厳密解は \(1\) ですが、シミュレーションでは近似解になるため、\(1\) に近い値が得られるはずです。動画で見たように、手順はシンプルです。1変数関数 \(f(x)\) の場合は次のように進めます。
- x軸の範囲 \((x_{min}, x_{max})\) と、y軸の範囲 \((\max(f(x)), \min(\min(f(x)), 0))\) を取得します。
- この長方形領域内に一様分布の点を複数生成します。
- 箱の面積($(\max(f(x) - \min(f(x))\times(x_{max}-x_{min})$)に、\(f(x)\) の下側に入った点の割合を掛けます。
これで、Monte Carlo Integration を使って定積分を処理するための基本的な枠組みが身につきます。
この演習はコースの一部です
Pythonで学ぶ統計シミュレーション
演習の手順
sim_integrate()関数内で、xminからxmaxの間の一様乱数を生成し、xに代入します。- \(\min(\min(f(x)), 0)\) から \(\max(f(x))\) の間の一様乱数を生成し、
yに代入します。 - \(f(x)\) 未満の点の割合に面積($(\max(f(x) - \min(f(x))\times(x_{max}-x_{min})$)を掛けた値を返します。
- 最後に、ラムダ関数を使って
funcを \(x e^{x}\) として定義します。
実践的なインタラクティブ演習
このサンプルコードを完成させて、この演習に挑戦してみましょう。
# Define the sim_integrate function
def sim_integrate(func, xmin, xmax, sims):
x = np.random.uniform(____, ____, sims)
y = np.random.uniform(____, ____, sims)
area = (max(y) - min(y))*(xmax-xmin)
result = area * sum(____(____) < abs(func(x)))/sims
return result
# Call the sim_integrate function and print results
result = sim_integrate(func = lambda x: ____, xmin = 0, xmax = 1, sims = 50)
print("Simulated answer = {}, Actual Answer = 1".format(result))