百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分析 > 正文

MATLAB蒙特卡洛方法编程实例加程序

liebian365 2025-03-02 17:59 10 浏览 0 评论

蒙特卡洛方法是一种利用计算机的随机数理论模拟实际的情况的一种方法。今天主要是以实例讲解蒙特卡洛方法的MATLAB编程实现。


实例1

程序

clc;%清除命令行窗口命令
clear all;%清除工作区变量
close all;%关闭图形窗口
L = 1;%正方形长度
n = 100000;%计算随机生成的10万点数 科学计数法
%随机生成[0,1]范围内的随机数
x = unifrnd(0,L,[1 n]);%%unifrnd 连续均匀分布的随机数生成器
y = unifrnd(0,L,[1 n]);
pinshu = sum((x.^2+y.^2<=L));%判断点是否在单位圆内
ix = find(x.^2+y.^2<=L);
%绘图
figure;
plot([0 L L 0],[0 0 L L],'k-');
hold on;
plot(x(ix),y(ix),'r.');
Pai = 4*pinshu/n;
%输出结果
fprintf('蒙特卡洛算法求解圆周率:%.20f\n',Pai);
xlim([0 L*1.2]);
ylim([0 L*1.2]);
legend('正方形区域','单位圆内的点');

运行结果


实例2

程序

clc;
clear all;
close all;
syms x y 
f1 = x.^4+2.*y.^4-81;
f2 = x.^2-y.^2-4;
figure;
ezplot(f1);
hold on;
ezplot(f2);
n = 1e6;
x = unifrnd(-6,6,[1 n]);%unifrnd 连续均匀分布的随机数生成器 
y = unifrnd(-6,6,[1 n]);
pinshu = sum((x.^4+2.*y.^4<=81)&(x.^2-y.^2<=4));
area = 12*12*pinshu/n
count = 0;
for i = 1:n
    if (x(i)^4+2*y(i)^4)<=81&(x(i)^2-y(i)^2<=4)
        count = count +1;
        x1(count) = x(i);
        y1(count) = y(i);
    end
end
hold on;
plot(x1,y1,'r*');
title('面积区域')
%结果area =22.7863

运行结果


实例3

模拟抛硬币,计算正面出现的频率,并画出随着试验次数n的增大,频率和概率的关系图。(unidrnd(N):生成最大值为N的随机正整数。)

程序

clc;
clear all;
close all;
%模拟抛硬币
n = 100:1:1000;
for i = 1:length(n)
    num = n(i);
    x = rand(1, num);%rand(size) 随机生成0到1之间均匀分布的浮点数
    % 假设大于0.5为硬币向上
    index = find(x>0.5);
    count(i) = length(index);
    p(i) = count(i)/num;
end
figure;
plot(n,p,'r-');
xlabel('次数n');
ylabel('正面向上的频率')
grid on;
ylim([0 1]);
disp('随着n不断增大,频率稳定在概率0.5。')

运行结果


实例4

程序

clc;
clear all;
close all;
a = 0;
b = 1;
f =@(x) 4./(1+x.^2);
n = [100 1000 10000 100000]
for i = 1:length(n)
    t = rand(1,n(i));%rand(size) 随机生成0到1之间均匀分布的浮点数
    x = a+(b-a)*t;
    s = sum(f(x));
    S(i) = s*(b-a)/n(i);
end
S
error = pi-S

运行结果



n =


         100        1000       10000      100000




S =


    3.1996    3.1227    3.1372    3.1419




error =


   -0.0580    0.0189    0.0043   -0.0003


>>

网络上其他蒙特卡洛计算程序

程序

clear all;
clc;
close all;
dt=1/365.0;                   % 一天的年单位时间
S0=20;                       % 股票在初始时刻的价格,程序中假设
r=0.031;                      % 期望收益率
sigma=0.6;                    % 波动率=0.6
expTerm=r*dt;                 % 漂移项dt
stddev=sigma*sqrt(dt);       % 波动项o:dz(t) 
nDays1=90;                    % 要模拟的总天数
for nDays=1:nDays1            % nDays表示时刻t
nTrials=10000;                % 模拟次数
for j=1:nTrials 
n = randn(1,nDays);           %生成nDays个标准正态分布随机数
S=S0; 
for i=1:nDays 
dS = S*(expTerm+stddev*n(i));   % 模拟计算股票价格的增量
S=S+dS;                      %计算股票价格
end
S1(nDays,j)=S;               % 将每天的股票模拟价格数据记录在S1中
end
end
S2=mean(S1');                 % 计算每天模拟的股票价格的均值,作为价格的估值 
plot(S2','-o')                    % 90天期间股票价格估值的曲线图
figure(2)
hist(S1(90,:),0:0.5:65)      %第90天的股票价格模拟的直方图

运行结果

程序

clc;
clear all;
close all;
T=1;
S0=48; % underlying asset(股票为主)期初价格
r=0.05; % risk free rate 无风险利率
NStep=200; % number of steps 将时间分成200份
deltaT=T/NStep; % Time Step 
Sigma=0.1; % Strand Derivation 
Rep=20000; % Number of replication 重复试验次数
mu=( r-Sigma^2/2 )*deltaT;
sigmadelta=Sigma*sqrt(deltaT);
% 计算增量
Increments=mu+sigmadelta.*randn(NStep,Rep); %增量为(r-sigma^2/2)*(T-t)加上标准差*
%0,1正态分布的数,一共200个20000次模拟
% 计算对数价格
LogPrice=cumsum([log(S0)*ones(1,Rep); Increments]); %累加增量之后返回1到20000次的价格
PricePath=exp(LogPrice);
%对价格路径画图
plot(PricePath)
title('Simulation of Price Path')
ylabel('Stock Price');
xlabel('Time Step');
xlim([0,NStep]);

运行结果


本文内容来源于网络,仅供参考学习,如内容、图片有任何版权问题,请联系处理,24小时内删除。


作 者 | 郭志龙
编 辑 | 郭志龙
校 对 | 郭志龙

相关推荐

“版本末期”了?下周平衡补丁!国服最强5套牌!上分首选

明天,酒馆战棋就将迎来大更新,也聊了很多天战棋相关的内容了,趁此机会,给兄弟们穿插一篇构筑模式的卡组推荐!老规矩,我们先来看10职业胜率。目前10职业胜率排名与一周前基本类似,没有太多的变化。平衡补丁...

VS2017 C++ 程序报错“error C2065:“M_PI”: 未声明的标识符&quot;

首先,程序中头文件的选择,要选择头文件,在文件中是没有对M_PI的定义的。选择:项目——>”XXX属性"——>配置属性——>C/C++——>预处理器——>预处理器定义,...

东营交警实名曝光一批酒驾人员名单 88人受处罚

齐鲁网·闪电新闻5月24日讯酒后驾驶是对自己和他人生命安全极不负责的行为,为守护大家的平安出行路,东营交警一直将酒驾作为重点打击对象。5月23日,东营交警公布最新一批饮酒、醉酒名单。对以下驾驶人醉酒...

Qt界面——搭配QCustomPlot(qt platform)

这是我第一个使用QCustomPlot控件的上位机,通过串口精确的5ms发送一次数据,再将读取的数据绘制到图表中。界面方面,尝试卡片式设计,外加QSS简单的配了个色。QCustomPlot官网:Qt...

大话西游2分享赢取种族坐骑手办!PK趣闻录由你书写

老友相聚,仗剑江湖!《大话西游2》2021全民PK季4月激燃打响,各PK玩法鏖战齐开,零门槛参与热情高涨。PK季期间,不仅各种玩法奖励丰厚,参与PK趣闻录活动,投稿自己在PK季遇到的趣事,还有机会带走...

测试谷歌VS Code AI 编程插件 Gemini Code Assist

用ClaudeSonnet3.7的天气测试编码,让谷歌VSCodeAI编程插件GeminiCodeAssist自动编程。生成的文件在浏览器中的效果如下:(附源代码)VSCode...

顾爷想知道第4.5期 国服便利性到底需优化啥?

前段时间DNF国服推出了名为“阿拉德B计划”的系列改版计划,截至目前我们已经看到了两项实装。不过关于便利性上,国服似乎还有很多路要走。自从顾爷回归DNF以来,几乎每天都在跟我抱怨关于DNF里面各种各样...

掌握Visual Studio项目配置【基础篇】

1.前言VisualStudio是Windows上最常用的C++集成开发环境之一,简称VS。VS功能十分强大,对应的,其配置系统较为复杂。不管是对于初学者还是有一定开发经验的开发者来说,捋清楚VS...

还嫌LED驱动设计套路深?那就来看看这篇文章吧

随着LED在各个领域的不同应用需求,LED驱动电路也在不断进步和发展。本文从LED的特性入手,推导出适合LED的电源驱动类型,再进一步介绍各类LED驱动设计。设计必读:LED四个关键特性特性一:非线...

Visual Studio Community 2022(VS2022)安装图文方法

直接上步骤:1,首先可以下载安装一个VisualStudio安装器,叫做VisualStudioinstaller。这个安装文件很小,很快就安装完成了。2,打开VisualStudioins...

Qt添加MSVC构建套件的方法(qt添加c++11)

前言有些时候,在Windows下因为某些需求需要使用MSVC编译器对程序进行编译,假设我们安装Qt的时候又只是安装了MingW构建套件,那么此时我们该如何给现有的Qt添加一个MSVC构建套件呢?本文以...

Qt为什么站稳c++GUI的top1(qt c)

为什么现在QT越来越成为c++界面编程的第一选择,从事QT编程多年,在这之前做C++界面都是基于MFC。当时为什么会从MFC转到QT?主要原因是MFC开发界面想做得好看一些十分困难,引用第三方基于MF...

qt开发IDE应该选择VS还是qt creator

如果一个公司选择了qt来开发自己的产品,在面临IDE的选择时会出现vs或者qtcreator,选择qt的IDE需要结合产品需求、部署平台、项目定位、程序猿本身和公司战略,因为大的软件产品需要明确IDE...

Qt 5.14.2超详细安装教程,不会来打我

Qt简介Qt(官方发音[kju:t],音同cute)是一个跨平台的C++开库,主要用来开发图形用户界面(GraphicalUserInterface,GUI)程序。Qt是纯C++开...

Cygwin配置与使用(四)——VI字体和颜色的配置

简介:VI的操作模式,基本上VI可以分为三种状态,分别是命令模式(commandmode)、插入模式(Insertmode)和底行模式(lastlinemode),各模式的功能区分如下:1)...

取消回复欢迎 发表评论: