注册地址 登录
数学建模社区-数学中国 返回首页

trxiao2011的个人空间 http://www.madio.net/?509386 [收藏] [复制] [分享] [RSS]

日志

结晶元胞代码

已有 506 次阅读2012-8-30 09:05 |个人分类:量子原胞自动机

用元胞自动机模型实现晶体的晶相组织动态演化的模拟,规则和算法如下:
1.
随机生成一个整数矩阵,矩阵中的每个元素代表一个元胞,元胞的数值相同的代表一个晶粒,不同数值的元胞之间形成自然的晶界。
2.
对矩阵中的元素以概率P0进行随机抽取,具体的做法是:生成一个随机数rand,而P0=exp[-Q/RT],其中Q,R,T 是相关的常数,P0也就是一个确定的常数,在每一个时间步内将randP0进行比较,如果rand<P0,那么就对矩阵中的元胞进行抽取,没有选中的元胞的数值保持不变,被选中的元胞的数值就采用以下规则3转变:
3.
采用的是Moore型邻居规则和周期性的边界条件,
     Moore
型邻居规则如下:
              A1            A2           A3
             A4            A5           A6
              A7            A8           A9
周期性的边界条件的意思如下:

 

 

 

 

A9          A7         A8       A9    A7
A3          A1         A2       A3    A1
A6          A4         A5       A6    A4
A9          A7         A8       A9    A7
A3          A1         A2       A3    A1
周期性的边界条件的意思就是说,只考虑一个N×N矩阵(蓝色所示),但是要生成一个(N+2×N+2)的矩阵(黑色所示),这样就使得原来的N×N的矩阵中的每个元素都有8个邻居,也就是左右相邻,上下相邻。
  
具体的转变规则如下:
   
1)如果A58个邻居元素(上下左右和斜对角)和A5的数值相同,那么A5的数值就保持不变;
   
2 如果A2A4, A6,A8中的任意三个元素的数值相同,例如等于a,那么A5的数值转变成a的概率就是P0,否则再判断A1A3,A7,A9的的数值,如果A1A3,  A7, A9中有三个元素的数值相等,例如等于b,那么A5的数值就转变成b的概率就是P0
   
3)如果以上条件都不满足,那么从A5的这8个邻居中任意选取一个元素,A5的数值就转变为这个元素的值的概率也是P0
然后将此转变规则扩展到整个矩阵中,实现一个时间步CAS的模拟,输出图形是转变后矩阵中的元素的灰度值。

clc;clear all;
%
初始化参数
N=100;         %
矩阵是一个 N×N
T=1000;           %
参数值
S=500;            %
元胞的可能取值为1-500
Q=300000;           %
参数值
R=831;               %
参数值
p1=exp(-Q/(R*T));   %
计算概率P0
kk=1000;           %
循环次数即总的时间步数
A=round(1 +499.*rand(N)); %
生成随机整数矩阵499=500-1
Ii=imshow(A,[]);         %
显示元胞的灰度值
ti=title('CAS=0', 'Fontsize',14,'Fontname','Times New Roman' );%
显示标题

   %
循环部分
for k=1:kk;
   
    if    A1==A2==A3==A4==A6==A7==A8==A9==A5&& (rand<P0);
                           A5=A5;
    elseif   A2==A4==A6||A4==A6==A8|| A2==A6==A8&& (rand<P0);
                           A5=A2;
    elseif   A1==A3==A7||A1==A3==A9||A1==A7==A9 && (rand<P0);
                           A5=A1;
    else      A5 (rand<P0)=B(index);  
               
    end
   A=A5;  
%  
定义扩展的矩阵Am
      Am=zeros(N+2);           %
生成一个全为0的矩阵Am
      Am(2:end-1,2:end-1)=A;  %
A赋值给Am的中间部分
      Am(1,2:end-1)=A(end,:);   %
A最下面一行补到矩阵Am的上边
      Am(end,2:end-1)=A(1,:);    %
A第一行补到矩阵Am的下面
       Am(2:end-1,1)=A(:,end);  %
A最右边一列补到矩阵Am的最左边
      Am(2:end-1,end)=A(:,1);   %
A的第一列补到矩阵Am的最右边
       Am(1,1)=A(end,end);     %
A的右下角补到Am左上角
      Am(end,end)=A(1,1);      %
A的左上角补到Am右下角
      Am(end,1)=A(1,end);       %
A的右上角补到Am左下角
      Am(1,end)=A(end,1);       %
A的左下角补到Am右上角
    rand('state',0);         %
生成一个0-1之间的随机数
A1= Am(1:end-2,1:end-2);   %A5
的左上近邻     
A2= Am(2:end-1,1:end-2);    %A5
的上近邻        
A3 = Am(3:end,1:end-2);      %A5
的右上近邻         
A4 = Am(1:end-2,2:end-1);    %A5
的左近邻
A6 = Am(3:end,2:end-1);      %A5
的右近邻         
A7 = Am(1:end-2,3:end);       %A5
的上近邻      
A8 = Am(2:end-1,3:end);        %A5
的下近邻     
A9= Am(3:end,3:end);         %A5
的右下近邻
A5=Am(end-1,end-1);        %Am
的中间部分A5
B={A1;A2;A3;A4;A6;A7;A8;A9};  %
A5的邻居存储在矩阵B
     index=round(1+7* rand(1));    %
生成1-8的参数值便于提取
  set(Ii, 'CData',[]);                %
更新灰度值的显示
  set(ti,'string',['CAS=',num2str(k)]);  %
显示更新的CAS时间步数
  pause(1);                        %
暂停1秒,显示动画效果
end


路过

雷人

握手

鲜花

鸡蛋

全部作者的其他最新日志

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册地址

qq
收缩
  • 电话咨询

  • 04714969085

关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

手机版|Archiver| |繁體中文 手机客户端  

蒙公网安备 15010502000194号

Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

GMT+8, 2025-8-14 18:27 , Processed in 0.279128 second(s), 29 queries .

回顶部