始める無料で始める

単純な関数の積分

この演習では、Monte Carlo Integration(モンテカルロ積分)の考え方をシンプルな例で体験します。

ここでは、単純な積分 \( \int_0^1 x e^{x} dx\) を評価します。厳密解は \(1\) ですが、シミュレーションでは近似解になるため、\(1\) に近い値が得られるはずです。動画で見たように、手順はシンプルです。1変数関数 \(f(x)\) の場合は次のように進めます。

  1. x軸の範囲 \((x_{min}, x_{max})\) と、y軸の範囲 \((\max(f(x)), \min(\min(f(x)), 0))\) を取得します。
  2. この長方形領域内に一様分布の点を複数生成します。
  3. 箱の面積($(\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))
コードを編集して実行