gusucode.com > 自编四参数法生成多孔介质的matlab程序代码 > main.m

    max_i=200;
max_j=200; % 定义生成域
d14=0.1;
d58=0.025; %定义八个方向的生长概率
n=0.35; %多孔材料孔隙率
cdd=0.01; %固相生长核的分布概率
numtotal_need=(1-n)*max_i*max_j;
%所有的固体相数目
numsolid=0;
arrgrid=0;
%遍历所有网格,生成固相内核
for i=1:max_i
    for j=1:max_j
        if rand()<cdd
            numsolid=numsolid+1; %当随机数小于cdd时设为固体相
            arrgrid(i,j)=1; %固体相处设为1
            solid(numsolid,1)=i;
            solid(numsolid,2)=j; %表示第numsolid个固体相的行号与列号
        end
    end
end
Tnumsolid=numsolid;
%第二步,固相内核向八个方向生长
while Tnumsolid<numtotal_need
    for index_solid=1:Tnumsolid
        index_i=solid(index_solid,1);
        index_j=solid(index_solid,2);
        %固体内核向1方向生长
        if index_j<max_j
            i=index_i;
            j=index_j+1;
            if arrgrid(i,j)==0&rand()<d14
                numsolid=numsolid+1;
                arrgrid(i,j)=1;
                solid(numsolid,1)=i;
                solid(numsolid,2)=j;
            end
        end
        %固体内核向2方向生长
        if index_i<max_i
            i=index_i+1;
            j=index_j;
            if arrgrid(i,j)==0&rand()<d14
                numsolid=numsolid+1;
                arrgrid(i,j)=1;
                solid(numsolid,1)=i;
                solid(numsolid,2)=j;
            end
        end
        %固体内核向3方向生长
        if index_j>1
            i=index_i;
            j=index_j-1;
            if arrgrid(i,j)==0&rand()<d14
                numsolid=numsolid+1;
                arrgrid(i,j)=1;
                solid(numsolid,1)=i;
                solid(numsolid,2)=j;
            end
        end
        %固体内核向4方向生长
        if index_i>1
            i=index_i-1;
            j=index_j;
            if arrgrid(i,j)==0&rand()<d14
                numsolid=numsolid+1;
                arrgrid(i,j)=1;
                solid(numsolid,1)=i;
                solid(numsolid,2)=j;
            end
        end
        %固体内核向5方向生长
        if index_i<max_i&index_j<max_j
            i=index_i+1;
            j=index_j+1;
            if arrgrid(i,j)==0&rand()<d58
                numsolid=numsolid+1;
                arrgrid(i,j)=1;
                solid(numsolid,1)=i;
                solid(numsolid,2)=j;
            end
        end
        %固体内核向6方向生长
        if index_i<max_i&index_j>1
            i=index_i+1;
            j=index_j-1;
            if arrgrid(i,j)==0&rand()<d58
                numsolid=numsolid+1;
                arrgrid(i,j)=1;
                solid(numsolid,1)=i;
                solid(numsolid,2)=j;
            end
        end
        %固体内核向7方向生长
        if index_i>1&index_j>1
            i=index_i-1;
            j=index_j-1;
            if arrgrid(i,j)==0&rand()<d58
                numsolid=numsolid+1;
                arrgrid(i,j)=1;
                solid(numsolid,1)=i;
                solid(numsolid,2)=j;
            end
        end
        %固体内核向8方向生长
        if index_i>1&index_j<max_j
            i=index_i-1;
            j=index_j+1;
            if arrgrid(i,j)==0&rand()<d58
                numsolid=numsolid+1;
                arrgrid(i,j)=1;
                solid(numsolid,1)=i;
                solid(numsolid,2)=j;
            end
        end
    end %结束for index_solid循环
Tnumsolid=numsolid;
end %结束while循环
x=1:max_i;
y=1:max_j;
z=arrgrid;
%网格的横坐标,纵坐标,属性0-液体,1-固体
scatter(x,y,5,z)%绘制散点图
[c,h]=contour(x,y,arrgrid,[1,1]);