【數學建模學習筆記】啟發式算法:蒙特卡洛算法

蒙特卡洛模擬入門筆記:從原理到代碼實踐

一、什么是蒙特卡洛模擬?

蒙特卡洛模擬是一種通過大量隨機實驗來解決復雜問題的方法。簡單說,就是用電腦模擬成千上萬次隨機事件,然后統計結果,以此估算一個問題的答案。

舉個生活中的例子:想知道 "擲 100 次骰子,總和在 300 到 400 之間的概率",不需要真的擲 100 次骰子,而是用電腦模擬這個過程 10000 次,最后統計總和在 300-400 之間的次數占比 —— 這就是蒙特卡洛模擬的核心思路。

二、蒙特卡洛模擬的基本步驟

  1. 確定問題的范圍(比如骰子的點數范圍是 1-6)
  2. 生成大量隨機樣本(比如模擬擲 10000 次骰子)
  3. 計算每個樣本的結果(比如每次擲骰子的總和)
  4. 統計分析結果(比如計算平均值、概率等)

三、用 Python 實現蒙特卡洛模擬

下面我們用一個簡單的例子來實踐蒙特卡洛模擬,目標是估算函數y = sin(x) + 0.5xx=0x=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)一致。

四、嘗試修改參數,觀察變化

為了更好地理解蒙特卡洛模擬,可以嘗試修改以下參數,看看結果會發生什么變化:

  1. 改變sample_count(比如改成 100 或 10000):模擬次數越多,結果通常越穩定。
  2. 調整x_minx_max(比如改成 0 到 20):x 的范圍變了,函數的輸出范圍也會變化。
  3. 修改target_function(比如改成return x**2計算平方函數):不同的函數會有不同的結果分布。

五、總結

蒙特卡洛模擬的核心就是:用大量隨機實驗代替復雜計算。它不需要我們推導復雜的數學公式,只需要設定好范圍,讓電腦重復足夠多次實驗,就能估算出問題的答案。這種方法在金融、天氣預測、游戲設計等很多領域都有廣泛應用,掌握它能幫你解決很多看似復雜的問題!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/95604.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/95604.shtml
英文地址,請注明出處:http://en.pswp.cn/web/95604.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

20250904的學習筆記

一、封包與拆包1. 封包(Packet Encapsulation)封包 是指在發送數據時,將數據從高層協議封裝到低層協議的過程。每經過一層協議,數據都會被加上相應的協議頭(有時也會加上協議尾),形成一個新的數…

STM32F4 + RT-Thread 實戰指南:TIM10 硬件定時器驅動開發與 1 秒定時功能實現

目錄前言一、STM32定時器10是個什么定時器?二、工程創建、環境配置三、程序代碼四、運行前言 在rtthread中,STM32F4的定時器10有些驅動并不完整,對比與其它定時器在使用時需要手動的添加一些代碼,我在使用上拆踩了一些坑&#xf…

echarts圖庫

環形圖// 指定圖表的配置項和數據this.option {// tooltip: {// trigger: item// },color: [#FFB32F, #FF5757, #57D5FF, #2FA8FF, #95FFF1], // 扇形區域以及列表顏色legend: {orient:vertical,//文字橫向排itemGap:20,left: left,textStyle:{color: #F3F9FF,// fontSi…

進程(Process)全面概述

進程(Process)全面概述 本文檔擴展了進程的定義、屬性、生命周期、管理機制及示例,涵蓋 task_struct 結構、進程鏈表、狀態與優先級、fork 函數及其寫時復制示例。 一、進程基本概念 進程:系統進行資源分配和調度的基本單位&#…

Java并發編程:sleep()與wait()核心區別詳解

今天完成了實驗室納新網站的工作,大體功能都已經完善,也和前端測試過了,費了點時間,而且今天大部分時間在看langchain4j的東西,就簡單復習一下八股,等會再復習一下算法題吧在Java并發編程中,sle…

AR眼鏡在智能制造的應用方向和場景用例|阿法龍XR云平臺

AR巡檢在制造業的應用已形成覆蓋設備維護、質量檢測、安全監控和遠程協作四大類別的成熟場景,不同制造領域的實踐各具特色,為行業提供了寶貴參考。在汽車制造領域,AR 巡檢主要應用于生產線設備維護和焊接質量檢測。在汽車廠總裝車間部署 AR 系…

【Linux系統】線程同步

在上一章節中,我們使用互斥量之后,確實解決了數據競爭問題,但出現了新的問題:只有一個線程(thread 1)在處理所有售票任務。這展示了互斥量的一個局限性:它確保了線程安全,但不保證公…

代碼隨想錄訓練營第三十一天|LeetCode56.合并區間、LeetCode738.單調遞增的數字

56.合并區間 思路:先讓二維數組進行排序; 遍歷數組,定義一個min表示重合區間的左邊界,max表示重合區間的右邊界; 如果當前區間左邊大于max,就證明重合區間斷了,就要對它進行加入ArrayList&am…

【Unity項目經驗分享】實現左右分屏裸眼3D程序

1、實現原理左右分屏原理,左右屏內容左右方向存在些許偏差。通過左右相機,然后左側相機向左側偏移一點3cm,右側相機向右側屏偏移一定3cm,然后將左右相機渲染內容通過RenderTexture渲染到Canvas上面的左右RawImage上面。2、實現具體…

設計軟件啟動失敗?“找不到vcruntime140.dll,無法繼續執行代碼” 場景化解決方案來了

打游戲時,剛加載到登錄界面就因 “找不到 vcruntime140.dll, 無法繼續執行代碼” 閃退;寫代碼時,編譯工具突然報錯中斷工作;做設計時,PS、AE 啟動失敗彈出相同提示 —— 不同場景下的 vcruntime140.dll 錯誤&#xff0…

基于Echarts+HTML5可視化數據大屏展示-茶葉種植大數據溯源平臺

效果展示&#xff1a;代碼結構&#xff1a;主要代碼實現 index.html布局 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta n…

PLOS One圖片處理要求及處理辦法

PLOS One圖片處理&#xff1a; 要求&#xff1a;Please remove your figures from within your manuscript file, leaving only the individual TIFF/EPS image files. These will be automatically included in the reviewer’s PDF. 請從稿件文件中移除所有圖表&#xff0c;…

AutoLayout與Masonry:簡化iOS布局

Auto Layout 與 Masonry蘋果提供的自動布局&#xff08;Auto Layout&#xff09;能夠對視圖進行靈活有效的布局。但是&#xff0c;使用原生的自動布局相關的語法創建約束的過程是非常冗長的&#xff0c;可讀性也比較差。Masonry 的目標其實就是 為了解決原生自動布局語法冗長的…

從設計到落地:校園圖書館系統的面向對象實現全流程

很多小白學面向對象時總困惑&#xff1a;“類圖、用例圖我會畫&#xff0c;但怎么把這些設計變成能跑的代碼&#xff1f;” 這篇文章就用 “校園圖書館管理系統” 當例子&#xff0c;從需求分析→設計方案→代碼實現→測試驗證&#xff0c;帶你走通 “設計→實現” 的完整鏈路&…

[鴻蒙心跡]帶新人學鴻蒙的悲歡離合

2023年底&#xff0c;我和陸神&#xff0c;威哥&#xff0c;老羅一起去深圳參加了鴻蒙師資培訓正式開啟了鴻蒙之旅&#xff0c;當時和陸神拍的合照但是我把陸神打碼了 學完以后就考取了鴻蒙的高級認證 看到沒有時間是2023年11月 馬上都要到期了。 想一想時間過得真快&#xff…

MindShow AI:AI思維導圖生成工具高效解決思路混亂難題,快速搭建學習與工作大綱

你有沒有過這種時候&#xff1f;想整理一份學習大綱或者項目方案&#xff0c;腦子裡一堆想法卻散得像亂麻 —— 比如要做個 “數據分析入門規劃”&#xff0c;明明知道要學 Excel、SQL、Python&#xff0c;可怎么分階段、每個階段學哪些重點&#xff0c;對著空白文檔半天列不出…

快速搭建一個Vue+TS+Vite項目

1、在一個文件夾下通過cmd打開&#xff0c;輸入命令npm create vitelatest命名要為英文2.選擇項目框架通過上下鍵位選擇Vue框架&#xff1a;選好按回車鍵3.選擇開發語言選擇TypeScript語言&#xff0c;方便后續開發&#xff1a;創建好的項目目錄為&#xff1a;4.安裝Vite依賴接…

深度學習:ResNet 殘差神經網絡詳解

一、ResNet 殘差神經網絡的起源與核心地位ResNet&#xff08;Residual Neural Network&#xff0c;殘差神經網絡&#xff09;是 2015 年由微軟亞洲研究院的何凱明、張祥雨等研究者提出的深度神經網絡架構。在當年的 ImageNet 大規模視覺識別挑戰賽&#xff08;ILSVRC&#xff0…

Python面試題及詳細答案150道(116-125) -- 性能優化與調試篇

《前后端面試題》專欄集合了前后端各個知識模塊的面試題,包括html,javascript,css,vue,react,java,Openlayers,leaflet,cesium,mapboxGL,threejs,nodejs,mangoDB,SQL,Linux… 。 前后端面試題-專欄總目錄 文章目錄 一、本文面試題目錄 116. 如何查找Python程序的…

C++11 智能指針的使?及其原理

目錄 1. 智能指針的使?場景分析 2. RAII和智能指針的設計思路 3. C標準庫智能指針的使? 4. 智能指針的原理 5. shared_ptr和weak_ptr 5.1 shared_ptr循環引?問題 5.2 weak_ptr 6. shared_ptr的線程安全問題 7. C11和boost中智能指針的關系 8. 內存泄漏 8.1 什么是…