zoukankan      html  css  js  c++  java
  • [数学建模(一)]蒙特卡罗方法

    1.概念

    蒙特卡罗方法(随机取样法)是一种计算方法。原理是通过大量随机样本,去了解一个系统,进而得到所要计算的值。

    2.两个应用例子

    例子1:求π的值。

    正方形内部有一个相切的圆,它们的面积之比是π/4。现在,在这个正方形内部,随机产生1000000个点(即1000000个坐标对 (x, y)),计算它们与中心点的距离,从而判断是否落在圆的内部。如果这些点均匀分布,那么圆内的点应该占到所有点的 π/4,因此将这个比值乘以4,就是π的值。

     

    MATLAB实现:

    N=1000000;    %随机点的数目
    
    x=rand(N,1);  %rand 生成均匀分布的伪随机数。分布在(0~1)之间
    
    y=rand(N,1);  %矩阵的维数为N×1
    
    count=0;
    
    for i=1:N
    
       if (x(i)^2+y(i)^2<=1)
    
         count=count+1;
    
        end
    
    end
    
    PI=4*count/N

     

    例子2:计算积分

    计算函数 y = x^2 在 [0, 1] 区间的积分,就是求出红色曲线下面的面积。这个函数在 (1,1) 点的取值为1,所以整个红色区域在一个面积为1的正方形里面。在该正方形内部,产生大量随机点,可以计算出有多少点落在红色区域(判断条件 y < x^2)。这个比重就是所要求的积分值。

     

    MATLAB实现:

    clear
    
    clc
    
    N=10000;  
    
    x=rand(N,1); 
    
    y=rand(N,1);
    
    count=0;
    
    for i=1:N
    
       if (y(i)<=x(i)^2)
    
         count=count+1;
    
       end
    
    end
    
    result=count/N


     

    3. 与拉斯维加斯方法的比较

    (1)蒙特卡罗算法:假如筐里有100个苹果,让我每次闭眼拿1个,挑出最大的。于是我随机拿1个,再随机拿1个跟它比,留下大的,再随机拿1个……我每拿一次,留下的苹果都至少不比上次的小。拿的次数越多,挑出的苹果就越大,但我除非拿100次,否则无法肯定挑出了最大的。——尽量找好的,但不保证是最好的。

    特点:采样越多,越近似最优解;

    (2)拉斯维加斯方法:假如有一把锁,给我100把钥匙,只有1把是对的。于是我每次随机拿1把钥匙去试,打不开就再换1把。我试的次数越多,打开(最优解)的机会就越大,但在打开之前,那些错的钥匙都是没有用的。——尽量找最好的,但不保证能找到。

    特点:采样越多,越有机会找到最优解。

    4.利用蒙特卡罗算法求机器人的工作空间

    思想:设置机器人每个关节角的运动范围,利用蒙特卡罗算法求机器人工作空间。

    %**************************蒙特卡洛法求解机器人工作空间*********************
    
    %定义变量
    deg=pi/180;
    num=0.001;
    
    %定义关节角范围
    theta1=[-180,180]*deg;
    theta2=[-90,90]*deg;
    theta3=[-150,150]*deg;
    theta4=[-150,150]*deg;
    theta5=[-180,180]*deg;
    theta6=[-180,180]*deg;
    
    %定义连杆变量
    a2=612.7*num;
    a3=571.6*num;
    d2=163.9*num;
    d5=115.7*num;
    
    %生成一个数组来保存随机变量
    i=1:20000;
    PX=zeros(size(i));
    PY=zeros(size(i));
    PZ=zeros(size(i));
    %设置随机点
    for j=1:1:10000
        %randNum=rand();
    
        theta1=(-180+360*rand());
        theta2=(-90+180*rand());
        theta3=(-150+300*rand());
        theta4=(-150+300*rand());
        theta5=(-180+360*rand());
        theta6=(-180+180*rand());
        
    %根据运动学方程,求出机械臂末端执行器在基坐标中的位置向量表达式
       PX(j)=cos(theta1)*(d5*sin(theta2+theta3+theta4)+a2*cos(theta2)+...
           a3*cos(theta2+theta3))+d2*sin(theta1);
       PY(j)=sin(theta1)*(d5*sin(theta2+theta3+theta4)+a2*cos(theta2)+...
            a3*cos(theta2+theta3))-d2*cos(theta1);
       PZ(j)=d5*sin(theta2+theta3+theta4)+a3*sin(theta2+theta3)+a2*sin(theta2);
    end
    
    %求解坐标值并且输出三视图
    subplot(2,2,1);
    plot3(PX,PY,PZ,'.');
    hold on;
    subplot(2,2,2);
    plot3(PX,PY,PZ,'.');
    view([0 0]);
    hold on;
    subplot(2,2,3);
    plot3(PX,PY,PZ,'.');
    view(2);
    hold on;

    5.更深度的应用

    蒙特卡洛树搜索---深度学习,强化学习

     

     

     

  • 相关阅读:
    numpy的shuffle函数
    特征值、特征向量
    keras的Embedding层
    自己写着玩的一个天气APP
    使用mbed进行STM32板子的开发
    提高ListView的效率
    自定义ListView里面的Item的内容
    Android控件使用自定义字体
    使用Handler类来更新UI
    MongoDB在Java下的增删查改
  • 原文地址:https://www.cnblogs.com/youngsea/p/7457683.html
Copyright © 2011-2022 走看看