蒙特卡洛模擬入門筆記:從原理到代碼實踐
一、什么是蒙特卡洛模擬?
蒙特卡洛模擬是一種通過大量隨機實驗來解決復雜問題的方法。簡單說,就是用電腦模擬成千上萬次隨機事件,然后統計結果,以此估算一個問題的答案。
舉個生活中的例子:想知道 "擲 100 次骰子,總和在 300 到 400 之間的概率",不需要真的擲 100 次骰子,而是用電腦模擬這個過程 10000 次,最后統計總和在 300-400 之間的次數占比 —— 這就是蒙特卡洛模擬的核心思路。
二、蒙特卡洛模擬的基本步驟
- 確定問題的范圍(比如骰子的點數范圍是 1-6)
- 生成大量隨機樣本(比如模擬擲 10000 次骰子)
- 計算每個樣本的結果(比如每次擲骰子的總和)
- 統計分析結果(比如計算平均值、概率等)
三、用 Python 實現蒙特卡洛模擬
下面我們用一個簡單的例子來實踐蒙特卡洛模擬,目標是估算函數y = sin(x) + 0.5x
在x=0
到x=10
范圍內的平均輸出值。
步驟 1:導入需要的工具庫
首先需要導入兩個常用的 Python 庫:numpy
用于數值計算和生成隨機數,matplotlib
用于畫圖展示結果。
# 導入工具庫
import numpy as np # 用于生成隨機數和數學計算
import matplotlib.pyplot as plt # 用于繪制結果圖表
步驟 2:定義要模擬的函數
我們需要一個 "目標函數",這里選擇簡單的y = sin(x) + 0.5x
(sin 是正弦函數,不用深究數學原理,只需要知道輸入 x 會輸出對應的 y 即可)。
# 定義目標函數:輸入x,輸出對應的y值
def target_function(x):return np.sin(x) + 0.5 * x # 函數公式:y = sin(x) + 0.5x
步驟 3:編寫蒙特卡洛模擬函數
這個函數的作用是:在指定范圍內隨機生成大量 x 值,計算對應的 y 值,然后把所有結果存起來。
def monte_carlo_simulation(func, min_x, max_x, num_samples):"""func:要模擬的函數min_x:x的最小值(范圍起點)max_x:x的最大值(范圍終點)num_samples:模擬次數(樣本數量)"""results = [] # 用列表存儲所有模擬結果# 重復num_samples次模擬for i in range(num_samples):# 生成一個在[min_x, max_x]之間的隨機x值x = np.random.uniform(min_x, max_x)# 計算這個x對應的函數值yy = func(x)# 把結果存入列表results.append(y)# 打印進度(每完成10%顯示一次)if (i + 1) % (num_samples // 10) == 0:print(f"已完成 {i + 1}/{num_samples} 次模擬")return results # 返回所有模擬結果
步驟 4:設置參數并運行模擬
我們設定 x 的范圍是 0 到 10,模擬 1000 次(可以自己修改次數看看效果)。
# 設置模擬參數
x_min = 0 # x的最小值
x_max = 10 # x的最大值
sample_count = 1000 # 模擬次數(樣本數量)# 運行蒙特卡洛模擬
print("開始模擬...")
simulation_results = monte_carlo_simulation(func=target_function,min_x=x_min,max_x=x_max,num_samples=sample_count
)
print("模擬完成!")
運行后會看到進度提示:
開始模擬...
已完成 100/1000 次模擬
已完成 200/1000 次模擬
...
已完成 1000/1000 次模擬
模擬完成!
步驟 5:分析模擬結果
模擬得到大量 y 值后,我們可以計算它們的平均值(估算函數的平均輸出)和方差(估算結果的波動程度)。
# 計算統計指標
mean_value = np.mean(simulation_results) # 平均值(期望值)
variance_value = np.var(simulation_results) # 方差(波動程度)# 打印結果
print(f"\n統計結果:")
print(f"函數的平均輸出值:{mean_value:.2f}") # .2f表示保留兩位小數
print(f"結果的方差(波動):{variance_value:.2f}")
運行后會得到類似這樣的結果:
統計結果:
函數的平均輸出值:2.63
結果的方差(波動):2.32
步驟 6:可視化模擬結果
用直方圖可以更直觀地看到所有 y 值的分布情況(哪些 y 值出現得更多)。
# 繪制直方圖
plt.figure(figsize=(10, 6)) # 設置圖表大小
plt.hist(simulation_results, # 要展示的數據bins=30, # 柱子的數量(越多越精細)edgecolor='black', # 柱子邊緣顏色alpha=0.7 # 透明度(0-1)
)# 設置圖表標題和坐標軸標簽
plt.title('蒙特卡洛模擬結果分布', fontsize=15)
plt.xlabel('函數輸出值(y)', fontsize=12)
plt.ylabel('出現次數', fontsize=12)
plt.grid(alpha=0.3) # 顯示網格線(alpha控制透明度)# 顯示圖表
plt.show()
運行后會看到一個直方圖,橫軸是函數的輸出值 y,縱軸是這個 y 值出現的次數。從圖中可以清晰地看到:大部分結果集中在 2-3 之間,和我們計算的平均值(2.63)一致。
四、嘗試修改參數,觀察變化
為了更好地理解蒙特卡洛模擬,可以嘗試修改以下參數,看看結果會發生什么變化:
- 改變
sample_count
(比如改成 100 或 10000):模擬次數越多,結果通常越穩定。 - 調整
x_min
和x_max
(比如改成 0 到 20):x 的范圍變了,函數的輸出范圍也會變化。 - 修改
target_function
(比如改成return x**2
計算平方函數):不同的函數會有不同的結果分布。
五、總結
蒙特卡洛模擬的核心就是:用大量隨機實驗代替復雜計算。它不需要我們推導復雜的數學公式,只需要設定好范圍,讓電腦重復足夠多次實驗,就能估算出問題的答案。這種方法在金融、天氣預測、游戲設計等很多領域都有廣泛應用,掌握它能幫你解決很多看似復雜的問題!