zoukankan      html  css  js  c++  java
  • 【Matlab编程】马氏链随机模拟

    版权声明:本文为博主原创文章,未经博主同意不得转载。 https://blog.csdn.net/tengweitw/article/details/34063833

    本文是利用蒙特卡罗算法对马氏链过程的模拟。如果有10个状态,从每一个状态到与之相邻状态的概率是同样的,仿真次数为1000,及进行了1000次状态转移。

    我们以动画的形式再现了状态转移的过程。并记录了到达每一个状态的次数。详细实现例如以下:

    close all;clc;clear; 
    figure; 
    s=1;
    n=1000;
    r=1; % 圆圈的半径
    title('等概率情况的计算机模拟')
    set(gcf,'doublebuffer','on'); % 设置图形渲染效果
    xlabel('Please press "space" key and see the result!',... 
       'fontsize',14,'color','r'); % 加入标注文字
    hold on;axis equal; % 设置坐标轴属性
    axis([-16,16,-16,16]); % 设置坐标轴范围
    fill(r*sin(0:.1:2*pi)-7,r*cos(0:.1:2*pi)+13,'w'); % 画出固定点P1
    hold on
    fill(r*sin(0:.1:2*pi)-11,r*cos(0:.1:2*pi)+9,'w');hold on % 画出固定点P2 
    fill(r*sin(0:.1:2*pi)-3,r*cos(0:.1:2*pi)+9,'w'); hold on% 画出固定点P3
    fill(r*sin(0:.1:2*pi)+5,r*cos(0:.1:2*pi)+9,'w');hold on % 画出固定点P4 
    fill(r*sin(0:.1:2*pi)+9,r*cos(0:.1:2*pi)+5,'w');hold on % 画出固定点P5
    fill(r*sin(0:.1:2*pi)-15,r*cos(0:.1:2*pi)-3,'w');hold on % 画出固定点P6
    fill(r*sin(0:.1:2*pi)+1,r*cos(0:.1:2*pi)-3,'w'); hold on% 画出固定点P7
    fill(r*sin(0:.1:2*pi)+13,r*cos(0:.1:2*pi)-3,'w');hold on % 画出固定点P8
    fill(r*sin(0:.1:2*pi)-7,r*cos(0:.1:2*pi)-11,'w');hold on % 画出固定点P9
    fill(r*sin(0:.1:2*pi)+5,r*cos(0:.1:2*pi)-15,'w');hold on % 画出固定点P10
    text(-15.4,-3,'6','FontSize',18);hold on
    text(-11.4,9,'2','FontSize',18);hold on
    text(-7.4,13,'1','FontSize',18);hold on
    text(-7.4,-11,'9','FontSize',18);hold on
    text(-3.4,9,'3','FontSize',18);hold on
    text(0.6,-3,'7','FontSize',18);hold on
    text(4.6,9,'4','FontSize',18);hold on
    text(4.1,-15,'10','FontSize',18);hold on
    text(8.6,5,'5','FontSize',18);hold on
    text(12.6,-3,'8','FontSize',18);hold on
    hold on
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %plot([8.5,6],[6,8.3],'r-')
    hold on
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    x45=fliplr(8.3:-0.1:5.8);
    y45=fliplr(linspace(5.9,8.2,length(x45)));
    x54=8.3:-0.1:5.8;
    y54=linspace(5.9,8.2,length(x54));
    x85=fliplr(9.4:0.05:12.4);
    y85=fliplr(linspace(4.1,-2.2,length(x85)));
    x58=9.4:0.05:12.4;
    y58=linspace(4.1,-2.2,length(x58));
    x80=fliplr(5.8:0.1:12.2);
    y80=fliplr(linspace(-14.4,-3.8,length(x80)));
    x08=5.8:0.1:12.2;
    y08=linspace(-14.4,-3.8,length(x08));
    x87=fliplr(2:0.1:12);
    y87=-3*ones(1,length(x87));
    x78=2:0.1:12;
    y78=-3*ones(1,length(x78));
    x79=fliplr(-6.2:0.1:0.4);
    y79=fliplr(linspace(-10.4,-3.8,length(x79)));
    x97=-6.2:0.1:0.4;
    y97=linspace(-10.4,-3.8,length(x97));
    x73=fliplr(-2.6:0.06:0.9);
    y73=fliplr(linspace(7.9,-2,length(x73)));
    x37=-2.6:0.06:0.9;
    y37=linspace(7.9,-2,length(x37));
    x13=-6.4:0.1:-3.8;
    y13=linspace(12.2,9.6,length(x13));
    x31=fliplr(-6.4:0.1:-3.8);
    y31=linspace(9.6,12.2,length(x31));
    x67=-14:.11:0;
    y67=-3*ones(1,length(x67));
    x76=0:-0.11:-14;
    y76=-3*ones(1,length(x76));
    x21=-10.1:.1:-7.8;
    y21=linspace(9.5,12.4,length(x21));
    x12=-7.8:-0.1:-10.1;
    y12=fliplr(linspace(9.5,12.4,length(x12)));
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    t6=text(-15.3,-5,'0','FontSize',12,'Color',[1 0 0]);
    t2=text(-11.4,7,'0','FontSize',12,'Color',[1 0 0]);
    t1=text(-7.2,11,'0','FontSize',12,'Color',[1 0 0]);
    t9=text(-7.3,-13,'0','FontSize',12,'Color',[1 0 0]);
    t3=text(-4,7,'0','FontSize',12,'Color',[1 0 0]);
    t7=text(0.6,-5,'0','FontSize',12,'Color',[1 0 0]);
    t4=text(4.7,7,'0','FontSize',12,'Color',[1 0 0]);
    t10=text(4.3,-13,'0','FontSize',12,'Color',[1 0 0]);
    t5=text(8.3,3,'0','FontSize',12,'Color',[1 0 0]);
    t8=text(12.6,-5,'0','FontSize',12,'Color',[1 0 0]);
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    for i=1:length(x45)
        plot(x45(i),y45(i),'*')
        
    end
    
    for i=1:length(x54)
        plot(x54(i),y54(i),'*')
      
    end
     
    for i=1:length(x85)
        plot(x85(i),y85(i),'*')
       
    end
     
    for i=1:length(x58)
        plot(x58(i),y58(i),'*')
      
    end
     
    
    for i=1:length(x80)
        plot(x80(i),y80(i),'.')
        
    end
    
    for i=1:length(x08)
        plot(x08(i),y08(i),'*')
    end
     
    
    for i=1:length(x87)
        plot(x87(i),y87(i),'*')
     
    end
    
    for i=1:length(x78)
        plot(x78(i),y78(i),'*')
    end
     
    
    for i=1:length(x79)
        plot(x79(i),y79(i),'.')
       
    end
    
    for i=1:length(x97)
        plot(x97(i),y97(i),'*')
       
    end
     
    
    for i=1:length(x73)
        plot(x73(i),y73(i),'*')
       
    end
    
    for i=1:length(x37)
        plot(x37(i),y37(i),'.')
      
    end
     
    
    for i=1:length(x31)
        plot(x31(i),y31(i),'*')
    end
    
    for i=1:length(x13)
        plot(x13(i),y13(i),'*')
      
    end
     
    
    for i=1:length(x67)
        plot(x67(i),y67(i),'*')
     
    end
    
    for i=1:length(x76)
        plot(x76(i),y76(i),'*')
        
    end
     
    
    for i=1:length(x21)
        plot(x21(i),y21(i),'*')
     
    end
    
    for i=1:length(x12)
        plot(x12(i),y12(i),'*')
        
    end
    plot(x45,y45,'w.')
    plot(x85,y85,'w.')
    plot(x80,y80,'w.')
    plot(x87,y87,'w.')
    plot(x79,y79,'w.')
    plot(x73,y73,'w.')
    plot(x31,y31,'w.')
    plot(x21,y21,'w.')
    plot(x67,y67,'w.')
      plot(x54,y54,'w.')
    plot(x58,y58,'w.')
    plot(x08,y08,'w.')
    plot(x78,y78,'w.')
    plot(x97,y97,'w.')
    plot(x37,y37,'w.')
    plot(x13,y13,'w.')
    plot(x12,y12,'w.')
    plot(x76,y76,'w.')  
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
       s=1;
        p1=0;%pn为到达n村庄的次数
     p2=0;p3=0;p4=0;p5=0;p6=0;p7=0;p8=0;p9=0;p10=0;
    
    %plot([-14,0],[-3,-3],'b','linewidth',3)
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    for i=1:n
        m=get(gcf,'currentkey'); % 获取键入按键的名称
       if strcmp(m,'space'); % 检查按下的按键是否为空格键
           break;
       end 
        if s==1
            possible=round(rand(1));
            if possible==1
            s=3;
            p3=p3+1;
            for i=1:length(x13)
                plot(x13(i),y13(i),'.')
                pause(0.00000000001)
            end
            delete(t3);
            t3=text(-4,7,num2str(p3),'FontSize',12,'Color',[1 0 0]);
            else
                s=2;
                p2=p2+1;
             for i=1:length(x12)
                plot(x12(i),y12(i),'.')
                pause(0.00000000001)
             end
              delete(t2)
              t2=text(-11.4,7,num2str(p2),'FontSize',12,'Color',[1 0 0]);
             
            end
            
        
        elseif s==2
               s=1;
               p1=p1+1;
               for i=1:length(x21)
                    plot(x21(i),y21(i),'.')
                    pause(0.00000000001)
               end
                delete(t1)
                t1=text(-7.2,11,num2str(p1),'FontSize',12,'Color',[1 0 0]);
        elseif s==3
            possible=round(rand(1));
            if possible==1
            s=7;
            p7=p7+1;
            for i=1:length(x37)
            plot(x37(i),y37(i),'.')
            pause(0.00000000001)
            end
            delete(t7)
            t7=text(0.6,-5,num2str(p7),'FontSize',12,'Color',[1 0 0]);
            
            else
                s=1;
                p1=p1+1;
                for i=1:length(x31)
                    plot(x31(i),y31(i),'.')
                    pause(0.00000000001)
                end
                delete(t1)
                 t1=text(-7.2,11,num2str(p1),'FontSize',12,'Color',[1 0 0]);
            end
            
        elseif s==4
               s=5;
               p5=p5+1;
            for i=1:length(x45)
                plot(x45(i),y45(i),'.')
                pause(0.00000000001)
            end
            delete(t5)
            t5=text(8.3,3,num2str(p5),'FontSize',12,'Color',[1 0 0]);
            
        elseif s==5
            possible=round(rand(1));
            if possible==1
            s=8;
            p8=p8+1;
            for i=1:length(x58)
                plot(x58(i),y58(i),'.')
                pause(0.00000000001)
            end
            delete(t8)
            t8=text(12.6,-5,num2str(p8),'FontSize',12,'Color',[1 0 0]);
            
            else
                s=4;
                p4=p4+1;
                for i=1:length(x54)
                    plot(x54(i),y54(i),'.')
                    pause(0.00000000001)
                end
                delete(t4)
                t4=text(4.7,7,num2str(p4),'FontSize',12,'Color',[1 0 0]);
                
                end
            
            
        elseif s==6
             s=7;
               p7=p7+1;
               for i=1:length(x67)
                    plot(x67(i),y67(i),'.')
                    pause(0.00000000001)
               end
               delete(t7)
               t7=text(0.6,-5,num2str(p7),'FontSize',12,'Color',[1 0 0]);
        elseif s==7
            possible=floor(rand(1)*4);
            if possible==0
                s=6;
                p6=p6+1;
                for i=1:length(x76)
                    plot(x76(i),y76(i),'.')
                    pause(0.00000000001)
                end
                delete(t6)
                t6=text(-15.3,-5,num2str(p6),'FontSize',12,'Color',[1 0 0]);
                
            elseif possible==1
                s=3;
                p3=p3+1;
                for i=1:length(x73)
                    plot(x73(i),y73(i),'.')
                    pause(0.00000000001)
                end
                delete(t3)
                t3=text(-4,7,num2str(p3),'FontSize',12,'Color',[1 0 0]);
                
            elseif possible==2
                s=9;
                p9=p9+1;
                for i=1:length(x79)
                    plot(x79(i),y79(i),'.')
                    pause(0.00000000001)
                end
                delete(t9)
                t9=text(-7.3,-13,num2str(p9),'FontSize',12,'Color',[1 0 0]);
            else
                s=8;
                p8=p8+1;
                for i=1:length(x78)
                    plot(x78(i),y78(i),'.')
                    pause(0.00000000001)
                end
                delete(t8)
                t8=text(12.6,-5,num2str(p8),'FontSize',12,'Color',[1 0 0]);
                
            end
            
        elseif s==8
             possible=floor(rand(1)*3);
            if possible==0
                s=7;
                p7=p7+1;
                for i=1:length(x87)
                    plot(x87(i),y87(i),'.')
                    pause(0.00000000001)
                end
                delete(t7)
                t7=text(0.6,-5,num2str(p7),'FontSize',12,'Color',[1 0 0]);
            elseif possible==1
                s=5;
                p5=p5+1;
                for i=1:length(x85)
                    plot(x85(i),y85(i),'.')
                    pause(0.00000000001)
                end
                delete(t5)
                t5=text(8.3,3,num2str(p5),'FontSize',12,'Color',[1 0 0]);
                
            else 
                s=10;
                p10=p10+1;
                for i=1:length(x80)
                    plot(x80(i),y80(i),'.')
                    pause(0.00000000001)
                end
                delete(t10)
                t10=text(4.3,-13,num2str(p10),'FontSize',12,'Color',[1 0 0]);
            end
            
        elseif s==9
            s=7;
            p7=p7+1;
            for i=1:length(x97)
                plot(x97(i),y97(i),'.')
                pause(0.00000000001)
            end
            delete(t7)
            t7=text(0.6,-5,num2str(p7),'FontSize',12,'Color',[1 0 0]);
        
        else 
            s=8;
            p8=p8+1;
            for i=1:length(x08)
                plot(x08(i),y08(i),'.')
                pause(0.00000000001)
            end
            delete(t8)
            t8=text(12.6,-5,num2str(p8),'FontSize',12,'Color',[1 0 0]);
            
        end
    plot(x45,y45,'w.')
    plot(x85,y85,'w.')
    plot(x80,y80,'w.')
    plot(x87,y87,'w.')
    plot(x79,y79,'w.')
    plot(x73,y73,'w.')
    plot(x31,y31,'w.')
    plot(x21,y21,'w.')
    plot(x67,y67,'w.')
    plot(x54,y54,'w.')
    plot(x58,y58,'w.')
    plot(x08,y08,'w.')
    plot(x78,y78,'w.')
    plot(x97,y97,'w.')
    plot(x37,y37,'w.')
    plot(x13,y13,'w.')
    plot(x12,y12,'w.')
    plot(x76,y76,'w.')  
    end
     
    for j=i:n
        if s==1
            possible=round(rand(1));
            if possible==1
            s=3;
            p3=p3+1;
            else
                s=2;
                p2=p2+1;
            end
            
        
        elseif s==2
               s=1;
               p1=p1+1;
               
        elseif s==3
            possible=round(rand(1));
            if possible==1
            s=7;
            p7=p7+1;
            else
                s=1;
                p1=p1+1;
            end
            
        elseif s==4
               s=5;
               p5=p5+1;
            
        elseif s==5
            possible=round(rand(1));
            if possible==1
            s=8;
            p8=p8+1;
            else
                s=4;
                p4=p4+1;
            end
            
            
        elseif s==6
             s=7;
               p7=p7+1;
               
        elseif s==7
            possible=floor(rand(1)*4);
            if possible==0
                s=6;
                p6=p6+1;
            elseif possible==1
                s=3;
                p3=p3+1;
            elseif possible==2
                s=9;
                p9=p9+1;
            else
                s=8;
                p8=p8+1;
            end
            
        elseif s==8
             possible=floor(rand(1)*3);
            if possible==0
                s=7;
                p7=p7+1;
            elseif possible==1
                s=5;
                p5=p5+1;
            else 
                s=10;
                p10=p10+1;
            end
            
        elseif s==9
            s=7;
            p7=p7+1;
        
        
        else 
            s=8;
            p8=p8+1;
        end
         
        
    end
    delete(t1)
    delete(t2)
    delete(t3)
    delete(t4)
    delete(t5)
    delete(t6)
    delete(t7)
    delete(t8)
    delete(t9)
    delete(t10)
    t6=text(-15.3,-5,num2str(p6),'FontSize',12,'Color',[1 0 0]);
    t2=text(-11.4,7,num2str(p2),'FontSize',12,'Color',[1 0 0]);
    t1=text(-7.2,11,num2str(p1),'FontSize',12,'Color',[1 0 0]);
    t9=text(-7.3,-13,num2str(p9),'FontSize',12,'Color',[1 0 0]);
    t3=text(-4,7,num2str(p3),'FontSize',12,'Color',[1 0 0]);
    t7=text(0.6,-5,num2str(p7),'FontSize',12,'Color',[1 0 0]);
    t4=text(4.7,7,num2str(p4),'FontSize',12,'Color',[1 0 0]);
    t10=text(4.3,-13,num2str(p10),'FontSize',12,'Color',[1 0 0]);
    t5=text(8.3,3,num2str(p5),'FontSize',12,'Color',[1 0 0]);
    t8=text(12.6,-5,num2str(p8),'FontSize',12,'Color',[1 0 0]);
    仿真步骤例如以下:

    终于的结果例如以下:


    原文:http://blog.csdn.net/tengweitw/article/details/34063833

    作者:nineheadedbird



  • 相关阅读:
    Github 上热门的 Spring Boot 项目实战推荐
    深入理解建造者模式 ——组装复杂的实例
    别死写代码,这 25 条比涨工资都重要
    Spring Boot 使用 JWT 进行身份和权限验证
    秋招打怪升级之路:十面阿里,终获offer!
    一问带你区分清楚Authentication,Authorization以及Cookie、Session、Token
    适合新手入门Spring Security With JWT的Demo
    面试官:“谈谈Spring中都用到了那些设计模式?”。
    春夏秋冬又一春之Redis持久化
    Mysql锁机制简单了解一下
  • 原文地址:https://www.cnblogs.com/ldxsuanfa/p/9934868.html
Copyright © 2011-2022 走看看