積分一個簡單函式
這是一個用來介紹 Monte Carlo 積分概念的簡單練習。
我們要計算一個簡單的定積分 $ \int_0^1 x e^{x} dx$。我們知道精確解是 $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 積分處理定積分的基本框架。
本練習屬於課程
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})$)。
- 最後,使用 lambda 函式將
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))