蒙特卡罗模拟法 —— matlab

目录

1.简介

2.实例分析

2.1 模拟求近似圆周率

2.2 估算定积分

2.3 求解整数规划


1.简介

        蒙特卡洛又称随机抽样或统计试验,就是产生随机变量,带入模型算的结果,寻优方面,只要模拟次数够多,最终是可以找到最优解或接近最优的解。

         基本思想:为了解决数学、物理、工程技术等方面的问题,首先建立一个概率模型或随机过程,使它的参数等于问题的解;然后通过对模型或过程的观察或抽样试验来计算所求参数的统计特征,最后给出所求解的近似值。

2.实例分析

2.1 模拟求近似圆周率

        绘制单位圆和外接正方形,正方形ABCD的面积为:2*2=4,圆的面积为:S=Π*1*1=Π,现在模拟产生在正方形ABCD中均匀分布的点n个,如果这n个点中有m个点在该圆内,则圆的面积与正方形ABCD的面积之比可近似为m/n

程序如下:

%%1.模拟求近似圆周率
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('模拟π','实际π')
grid minor

返回:

2.2 估算定积分

程序如下:

%%用蒙特卡罗法估算定积分
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)+1;
    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

返回:

2.3 求解整数规划

要解的方程为:

条件如下:

程序如下:

%%用蒙特卡罗法求解整数规划
clc;clear;close all;
rand('state',sum(clock));
%设置该命令是因为每次产生随机数的时候,随机数生成器触发器的状态都会翻转一次。
%matlab生成的随机数是伪随机数,因此可生成时间相关的随机数,总之和当前时间相关。
%如果计算机运算太快的话,可能会生成相同随机数
p0=0;tic
%计时开始
for i=1:10^7%只要次数够高,最后肯定是实际的最优值    
    x=randi([0,99],1,3);%产生一行五列的区间在【0,99】上的随机整数    
    f=2*x(1)+3*x(1)^2+3*x(2)+x(2)^2+x(3);%主函数    
    g=[x(1)+2*x(1)^2+x(2)+2*x(2)^2+x(3)        
        x(1)+x(1)^2+x(2)+x(2)^2-x(3)        
        2*x(1)+x(1)^2+2*x(2)+x(3)        
        x(1)+2*x(2)];%条件    
    if g(1,1)<=100&&g(2,1)<=500&&g(3,1)<=400&&g(4,1)>=10        
        if p0<f%如果求最小值,则将if p0<f中的<改成>符号            
            x0=x;            
            p0=f;%记录当前较好的解        
        end
    end
end
x0 %x0为x1,x2,x3的值
p0 %p0为函数最大值toc%计时结束

返回:

  • 24
    点赞
  • 214
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
蒙特卡洛模拟法是一种利用随机抽样和统计试验的方法,通过产生随机变量并带入模型来计算结果。在寻求最优解方面,只要模拟次数足够多,就可以找到最优解或接近最优解。 在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 ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值