開始使用免費開始

積分一個簡單函式

這是一個用來介紹 Monte Carlo 積分概念的簡單練習。

我們要計算一個簡單的定積分 $ \int_0^1 x e^{x} dx$。我們知道精確解是 $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 積分處理定積分的基本框架。

本練習屬於課程

Python 的統計模擬

檢視課程

練習說明

  • sim_integrate() 函式中,產生介於 xminxmax 之間的均勻亂數,指派給 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))
編輯並執行程式碼