【Matlab】数学建模_蒙特卡罗模拟法

1.基本思想

蒙特卡罗模拟法是一种利用随机数和概率统计的方法来求解数学问题的数值近似解的方法,常用于求解复杂的、难以用解析方法求解的问题。它的应用领域非常广泛,包括但不限于以下几个方面:

  1. 概率与统计分析:如计算随机事件的概率、模拟统计分布、估计统计参数等。
  2. 金融领域:如期权定价、风险度量、投资组合优化等。
  3. 工程应用:如可靠性分析、优化设计、仿真验证等。
  4. 物理学:如粒子物理学、统计物理学、量子物理学等。
  5. 生物学和医学:如药物筛选、分子模拟、生态系统模拟等。

蒙特卡罗模拟法的基本思想是通过随机抽样来模拟问题的不确定性,并根据所得样本的概率分布特征来估计问题的数值解。由于它不需要对问题进行严格的数学求解,只需要对问题建立合理的数学模型,并利用计算机程序进行模拟计算,因此在处理复杂问题时具有较大的优势。
蒙特卡罗模拟法是一种数值计算方法,其基本思想是通过随机抽样来模拟复杂系统的行为,进而估计某些未知量的值。其名称来自于蒙特卡罗赌场,因为它类似于赌博中随机抽取结果的过程。

蒙特卡罗模拟法适用于各种不确定性因素影响下的问题,例如金融风险评估、物理系统建模、工程设计等领域。其基本步骤包括:

  1. 定义问题,确定待求解的未知量和模型。
  2. 建立模型,确定模型参数和变量,并生成一组随机样本。
  3. 对每个样本,根据模型计算相应的输出。
  4. 统计所有样本的输出结果,得到待求解的未知量的估计值。
  5. 对结果进行分析和验证,评估模型的可靠性和精度。

蒙特卡罗模拟法的主要优点是能够处理各种复杂问题,不受随机性和不确定性的影响。但其缺点是需要大量的计算资源和时间,并且对模型的准确性和随机样本的质量要求较高。

2.数据集介绍

鸢尾花(Iris)数据集是一个经典的数据集,用于机器学习和统计学习中的分类和聚类问题。该数据集包含了三种不同类型的鸢尾花(山鸢尾、变色鸢尾和维吉尼亚鸢尾)的测量数据,每种花各有50个样本。每个样本包含四个特征,即萼片长度、萼片宽度、花瓣长度和花瓣宽度,以及它所属的鸢尾花类型。

该数据集最早由英国统计学家和生物学家Ronald Fisher在1936年的一篇论文中介绍,并一直被广泛用于分类和聚类问题的研究中。由于其简单性和广泛应用性,鸢尾花数据集已成为了机器学习和统计学习中的标准数据集之一。

本文采用的数据是.xlsx格式,前四列为样本的特征值,最后一列为样本的标签,标签值为1,2,3

3.文件结构

在这里插入图片描述

iris.xlsx						% 鸢尾花数据集,具体格式参考第2部分
Main.m							% 主函数

4.详细代码及注释

% 清空环境变量
warning off             % 关闭报警信息
close all               % 关闭开启的图窗
clear                   % 清空变量
clc                     % 清空命令行

% 读取数据
data = xlsread('iris.xlsx');

cv = cvpartition(size(data,1),'HoldOut',0.3); % 划分训练集和测试集
idx_train = cv.training;
idx_test = cv.test;
X_train = data(idx_train,1:4);
y_train = data(idx_train,5);
X_test = data(idx_test,1:4);
y_test = data(idx_test,5);
tree = fitctree(X_train,y_train); % 构建决策树分类模型
y_pred = predict(tree,X_test); % 对测试集进行预测
accuracy = sum(y_pred==y_test)/length(y_test); % 计算模型准确率

n = 100; % 设置重复实验次数
accuracy_list = zeros(n,1);
for i=1:n
    cv = cvpartition(size(data,1),'HoldOut',0.3);
    idx_train = cv.training;
    idx_test = cv.test;
    X_train = data(idx_train,1:4);
    y_train = data(idx_train,5);
    X_test = data(idx_test,1:4);
    y_test = data(idx_test,5);
    tree = fitctree(X_train,y_train);
    y_pred = predict(tree,X_test);
    accuracy_list(i) = sum(y_pred==y_test)/length(y_test);
end
mean_accuracy = mean(accuracy_list); % 计算平均准确率
std_accuracy = std(accuracy_list); % 计算准确率标准差

disp(['平均准确率', num2str(mean_accuracy)]);
disp(['准确率标准差', num2str(std_accuracy)]);

5.运行结果

在这里插入图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
蒙特卡洛模拟法是一利用随机抽样和统计试验的方法,通过产生随机变量并带入模型来计算结果。在寻求最优解方面,只要模拟次数足够多,就可以找到最优解或接近最优解。 在Matlab中,蒙特卡洛模拟法可以用于估算定积分或求近似圆周率。例如,通过生成随机点,并计算落在某个区域内的点的比例,可以估算定积分的值。下面是一个用蒙特卡洛法估算定积分的Matlab程序示例: ```matlab clc; clear; close all; num = 0:500:10^6; s = ones(1, length(num)); for j = 1:length(num) n = num(j); a = 0; b = 1; d = max(a, b); m = 0; for i = 1:n x = a + rand * (b - a); y = d * rand; if y <= x^2 m = m + 1; end end s(j) = m / n * d * (b - a); end plot(s) hold on line([0, length(num)*1.1], [1/3, 1/3], 'color', 'r') text(0, pi, '1/3', 'color', 'r', 'fontsize', 16) legend('模拟', '实际1/3') grid minor ``` 另外,通过生成随机点,并计算落在单位圆内的点的比例,可以用于求近似圆周率。下面是一个用蒙特卡洛法求近似圆周率的Matlab程序示例: ```matlab clc; clear; close all num = 0:10:200000; mypi = ones(1, length(num)); for j = 1:length(num) n = num(j); m = 0; for i = 1:n if (-1 + 2*rand)^2 + (-1 + 2*rand)^2 <= 1 m = m + 1; end end mypi(j) = 4 * m / n; end plot(mypi) hold on line([0, length(num)*1.1], [pi, pi], 'color', 'r') text(0, pi, '\pi', 'color', 'r', 'fontsize', 16) legend('模拟\pi', '实际\pi') grid minor ``` 这些程序通过生成随机数来模拟实际情况,并进行统计计算,最后进行图形绘制来比较模拟结果与实际值。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [蒙特卡罗模拟法 —— matlab](https://blog.csdn.net/qq_25990967/article/details/122875888)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

敲代码两年半的练习生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值