【元胞自动机】MATLAB界面聚合的元胞自动机模拟完整实现运行

文末有完整代码分享链接

文件介绍

automain 为元胞自动机主函数
choosedirection 选择方向函数,主函数调用
judgedirection 判断位置函数,主函数调用
neighbor 求每个元胞的邻居函数,主函数调用
surfaceness 求表面粗糙度
porosity 求孔隙率
flux 求水通量
intercept 求盐截留率
matrixplot 可视化图形

关键代码

while num<=98
    %tempmatrix = simulation;                  %定义新的矩阵变量暂时保存当前画面
    for i=1:rm
        for j=1:rn
            switch simulation(i,j)
                case -1                       %边界元胞,不作处理
                case 0                        %膜孔元胞,不作处理
                case 1                        %哌嗪元胞
                    if ismember(simulation(i,j),grouppip{i,j})
                        continue;
                    else
                        if ismember(3,nextcell{i,j})        %若元胞上面邻居含有元胞3,则结合生成6
                            direction=find(nextcell{i,j}==3);
                            randindex=randperm(length(direction));
                            resultindex=direction(randindex(1));             %假设水分子运动为布朗运动
                            [swapi,swapj]=judgedirection(resultindex,i,j,rn);
                            simulation(i,j)=6;                               %哌嗪位被PA替代
                            simulation(swapi,swapj)=4;                          %TMC位被油相溶剂替代
                            active(i,j)=2;  %假设pa只反应两次
                        elseif ismember(0,nextcell{i,j}) || ismember(2,nextcell{i,j}) || ismember(4,nextcell{i,j})
                            direction=union(find(nextcell{i,j}==0),union(find(nextcell{i,j}==2),find(nextcell{i,j}==4))); %寻找四个方向中含有元胞0,1,2,4的方向
                            p_max=1;p_min=0.5;                              %概率变化范围
                            if i<=m1    %若哌嗪在水相
                                p_i=p_max-(i-1)*(p_max-p_min)/m1;
                                resultindex=choosedirection(direction,2,p_i);
                                %resultindex=2;
                            elseif i>m1+m2 %若哌嗪在油相
                                p_i=p_min+(i-m1-m2)*(p_max-p_min)/m3;
                                resultindex=choosedirection(direction,1,p_i);
                            else           %若哌嗪在界面中,等概率扩散
                                %p_i=p_max-(i-1)*(p_max-p_min)/m1;
                                resultindex=choosedirection(direction,2,1);
                                %resultindex=2;
                            end
                            %由于界面聚合,水相哌嗪在界面处移动概率最小,两边概率最大,概率随着行数逐渐变化,依据概率选择最佳方向
                            [swapi,swapj]=judgedirection(resultindex,i,j,rn);   %获得选定方向元胞的行列号
                            if simulation(swapi,swapj)==0                    %如果扩散到膜孔,膜孔元胞置为哌嗪元胞,哌嗪元胞变成水分子元胞
                                simulation(swapi,swapj)=1;
                                simulation(i,j)=2;
                            elseif simulation(swapi,swapj)==4
                                if swapi<=m1+m2
                                    continue;
                                elseif swapi>m1+m2+min(size(find(simulation==1)),size(find(simulation==3)))/n+1   %哌嗪只能活跃于油相的表层,该层为期望膜厚度
                                    continue;
                                end
                            else
                                temp=simulation(i,j);                            %交换元胞状态
                                simulation(i,j)=simulation(swapi,swapj);
                                simulation(swapi,swapj)=temp;
                            end
                            
                        elseif ismember(1,nextcell{i,j})   %若邻居有自身,则依玻尔兹曼因子可能形成团簇
                            if rand>=w_pip && i>2 && i<rm-1 && j>2 && j<rn-1 %弹性碰撞
                                direction=find(nextcell{i,j}==1);
                                randindex=randperm(length(direction));
                                resultindex=direction(randindex(1));             %假设水分子运动为布朗运动
                                [swapi,swapj]=judgedirection(resultindex,i,j,rn);
                                temp=simulation(2*i-swapi,2*j-swapj);                            %交换元胞状态
                                simulation(2*i-swapi,2*j-swapj)=simulation(i,j);
                                simulation(i,j)=temp;
                            else             %形成团簇
                                grouppip{i,j}=[simulation(i,j),simulation(swapi,swapj)];
                            end
                        end
                    end
                case 2                        %水分子元胞
                    if ismember(0,nextcell{i,j})  %若水分子扩散到膜孔
                        direction=find(nextcell{i,j}==0);
                        randindex=randperm(length(direction));
                        resultindex=direction(randindex(1));             %假设水分子运动为布朗运动
                        [swapi,swapj]=judgedirection(resultindex,i,j,rn);
                        if simulation(swapi,swapj)==0
                            simulation(swapi,swapj)=2;
                        end
                    end
                case 3                        %TMC元胞
                    if ismember(simulation(i,j),groupTMC{i,j})
                        continue;
                    else
                        if ismember(1,nextcell{i,j})        %若元胞邻居含有元胞1,则结合生成6
                            direction=find(nextcell{i,j}==1);
                            randindex=randperm(length(direction));
                            resultindex=direction(randindex(1));
                            [swapi,swapj]=judgedirection(resultindex,i,j,rn);
                            simulation(i,j)=4;
                            simulation(swapi,swapj)=6; %哌嗪位被PA替代
                            active(swapi,swapj)=2;
                        elseif ismember(4,nextcell{i,j})
                            direction=find(nextcell{i,j}==4);
                            p_max=1;p_min=0.5;
                            p_i=p_min+(i-m1-m2)*(p_max-p_min)/m3;%由于界面聚合,油相哌嗪要往界面去的概率更大,假设概率为0.7
                            resultindex=choosedirection(direction,1,p_i);  %1表示向上,依据概率选择最佳方向
                            [swapi,swapj]=judgedirection(resultindex,i,j,rn);
                            if (simulation(swapi,swapj)==4 && swapi>m1+m2) || simulation(swapi,swapj)==3
                                temp=simulation(i,j);
                                simulation(i,j)=simulation(swapi,swapj);
                                simulation(swapi,swapj)=temp;
                            end
                        elseif ismember(3,nextcell{i,j})
                            if rand>=w_TMC && i>2 && i<rm-1 && j>2 && j<rn-1 %弹性碰撞
                                direction=find(nextcell{i,j}==3);
                                randindex=randperm(length(direction));
                                resultindex=direction(randindex(1));             %假设水分子运动为布朗运动
                                [swapi,swapj]=judgedirection(resultindex,i,j,rn);
                                temp=simulation(2*i-swapi,2*j-swapj);                            %交换元胞状态
                                simulation(2*i-swapi,2*j-swapj)=simulation(i,j);
                                simulation(i,j)=temp;
                            else             %形成团簇
                                groupTMC{i,j}=[simulation(i,j),simulation(swapi,swapj)];
                            end
                        end
                    end
                case 4                        %HEX油相溶剂元胞
                case 5                        %基膜元胞
                case 6                        %PA元胞
                    p1=0.4286;p2=0.5714;           %经计算,p1表示6和1反应再生成6的概率,p2表示6和3反应再生成6的概率
                    if active(i,j)>0
                        if ismember(1,nextcell{i,j}) && ismember(3,nextcell{i,j}) %如果周围仍然有单体
                            flag=(p1*rand>p2*rand);
                            if flag==1  %和1发生反应
                                direction=find(nextcell{i,j}==1);
                                randindex=randperm(length(direction));
                                resultindex=randindex(1);
                                [swapi,swapj]=judgedirection(resultindex,i,j,rn);
                                simulation(swapi,swapj)=6;
                                active(swapi,swapj)=1;
                                active(i,j)=active(i,j)-1;
                            else        %和3发生反应
                                direction=find(nextcell{i,j}==3);
                                resultindex=direction(1);
                                [swapi,swapj]=judgedirection(resultindex,i,j,rn);
                                simulation(swapi,swapj)=6;
                                active(swapi,swapj)=1;
                                active(i,j)=active(i,j)-1;
                            end
                        elseif ismember(1,nextcell{i,j}) || ismember(3,nextcell{i,j}) %若6既和1又和3相邻
                            direction=union(find(nextcell{i,j}==1),find(nextcell{i,j}==3));
                            resultindex=direction(1);
                            [swapi,swapj]=judgedirection(resultindex,i,j,rn);
                            simulation(swapi,swapj)=6;
                            active(swapi,swapj)=1;
                            active(i,j)=active(i,j)-1;
                        end
                    else
                        continue;
                    end
                    if i>m1+m2       %若生成的PA处于油相中,则应该以一定的规律附着在界面
                        direction=[1 2 3 4];
                        p_max=1;p_min=0.5;
                        p_i=p_min+(i-m1-m2)*(p_max-p_min)/m3;
                        resultindex=choosedirection(direction,1,p_i);
                        [swapi,swapj]=judgedirection(resultindex,i,j,rn);
                        temp=simulation(i,j);
                        if simulation(swapi,swapj) ==0 || simulation(swapi,swapj)==5
                            continue;
                        elseif swapi<=m1+m2 && simulation(swapi,swapj)==3
                            continue;
                        elseif swapi>=m1-1 && simulation(swapi,swapj)==2
                            continue;
                        else
                            simulation(i,j)=simulation(swapi,swapj);
                            simulation(swapi,swapj)=temp;
                        end
                        %矩阵元素聚类
                    elseif i<m1
                        direction=[1 2 3 4];
                        p_max=1;p_min=0.5;
                        p_i=p_min-(i-m1)*(p_max-p_min)/m1;
                        resultindex=choosedirection(direction,2,p_i);
                        [swapi,swapj]=judgedirection(resultindex,i,j,rn);
                        temp=simulation(i,j);
                        if simulation(swapi,swapj) ==0 || simulation(swapi,swapj)==5
                            continue;
                        elseif swapi<=m1+m2 && simulation(swapi,swapj)==3
                            continue;
                        elseif swapi>=m1-1 && simulation(swapi,swapj)==2
                            continue;
                        else
                            simulation(i,j)=simulation(swapi,swapj);
                            simulation(swapi,swapj)=temp;
                        end
                    end
            end
            list=neighbor(i,j,simulation);
            nextcell{i,j}=list;
        end
    end
    [row,col]=find(simulation==6); %PA的电荷效应
    len=length(row);
    for i=1:len
        if row(i)>m1+m2
            active(row(i),col(i))=active(row(i),col(i))+1;
        elseif row(i)<m1
            active(row(i),col(i))=active(row(i),col(i))-1;
        end
    end

效果展示

分享链接:

M00198-MATLAB界面聚合的元胞自动机模拟完整实现运行

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/496435.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

开源AI引擎|信息抽取与文本分类项目案例:提升12345政务投诉处理效率

一、实际案例介绍 采集员案件上报流程是城市管理和问题解决的关键环节&#xff0c;涉及对案件类别的选择、案件来源的记录、详细案件描述的填写以及现场图片的上传。这一流程要求采集员准确、详细地提供案件信息&#xff0c;以便系统能够自动解析关键数据并填写相关内容&#…

Python读取PDF文字转txt,解决分栏识别问题,能读两栏

搜索了一下&#xff0c;大致有这些库能将PDF转txt 1. PyPDF/PyPDF2&#xff08;截止2024.03.28这两个已经合并成了一个&#xff09;pypdf PyPI 2. pdfplumber GitHub - jsvine/pdfplumber: Plumb a PDF for detailed information about each char, rectangle, line, et cete…

VSCode 如何同步显示网页在手机或者平板上

首先要确保 ①电脑上安装了VsCode ②VsCode安装插件LiveServer 安装成功之后 连续按住 Alt L 、Alt O 会跳转到对应的html页面上 http://127.0.0.1:5500/....... 是这个开头的 然后打开网络 如果桌面有网上邻居的可以直接点桌面的网上邻居 进来找到WLAN这个…

spark核心概念

DAG 所谓DAG就是有向无环图&#xff0c;其实就是个无环的流程&#xff0c;Spark的核心是根据RDD来实现的&#xff0c;Spark Scheduler!则为Spark核心实现的重要一环&#xff0c;其作用就是任务调度。Spark的任务调度就是如何组织任务去处理RDD中每个分区的数据&#xff0c;根据…

AI智能分析网关V4如何使用GB28181注册到EasyCVR平台?具体步骤是什么?

旭帆科技的智能分析网关V4内含近40种智能分析算法&#xff0c;包括人体、车辆、消防、环境卫生、异常检测等等&#xff0c;在消防安全、生产安全、行为检测等场景应用十分广泛。如常见的智慧工地、智慧校园、智慧景区、智慧城管等等&#xff0c;还支持抓拍、记录、告警、语音对…

JavaScript基础练习题之计算数组元素的和与平均值

一、如何使用JavaScript计算数组元素的和与平均值&#xff1f; 二、正确的源程序 <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>计算数组元素的和与平均值</title></head><body><h1>计算数组元…

HarmonyOS 应用开发之AbilityStage组件容器

AbilityStage是一个 Module 级别的组件容器&#xff0c;应用的HAP在首次加载时会创建一个AbilityStage实例&#xff0c;可以对该Module进行初始化等操作。 AbilityStage与Module一一对应&#xff0c;即一个Module拥有一个AbilityStage。 DevEco Studio默认工程中未自动生成Ab…

Linux常见指令解析一

Linux常见指令解析一 常见指令1. ls 指令2.pwd 命令3.cd 命令4.touch 命令5.mkdir 命令6.rmdir指令 && rm 指令7.man 指令8.cp 指令9.cat 命令 && tac 命令10.mv 指令11.more 指令12.less 指令13.head 指令14.tail 指令15.cal 指令 常见指令 1. ls 指令 语法…

包含具有多种类型信息的3D模型

1982年&#xff0c;Gbor Bojr开始使用类似于1975年的建筑描述系统技术来开发建筑信息软件。随后&#xff0c;1984年Bojr发布了用于Apple Lisa操作系统的Graphisoft的Radar CH。该软件技术被称为ArchiCAD于1987年重新推出&#xff0c;这是第一个能够在个人计算机上运行的建筑信息…

【源码分析】一文看透集合容器

一文看透集合容器 一、Mapa. HashMapb.ConcurrentHashMapc.HashTabled. TreeMap 二、Collectiona. ListArrayListLinkedListVectorCopyOnWriteArrayList对比和自身思考思考&#xff1a;为什么都拒绝使用Vector啊&#xff1f;它线程安全诶 b. SetHashSetTreeSetCopyOnWriteArray…

2024年【烟花爆竹产品涉药】免费试题及烟花爆竹产品涉药考试技巧

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年【烟花爆竹产品涉药】免费试题及烟花爆竹产品涉药考试技巧&#xff0c;包含烟花爆竹产品涉药免费试题答案和解析及烟花爆竹产品涉药考试技巧练习。安全生产模拟考试一点通结合国家烟花爆竹产品涉药考试最新大纲…

135.分发糖果

javapublic class Solution {public int candy(int[] ratings) {// 获取孩子人数int len ratings.length;// 初始化一个数组存储每个孩子的糖果数&#xff0c;默认第一个孩子有1颗糖果int[] candyVec new int[len];candyVec[0] 1;// 阶段1&#xff1a;从左到右遍历for (int …

MongoDB内存过高问题分析解决

告警 公司有个3.2.7版本的mongo复制集&#xff0c;最近几天频繁告警内存过高。 服务器配置16C64G内存。mongo备节点内存使用到55G&#xff0c;触发告警。 以下内容基于3.2.7版本&#xff0c;3.2.7版本已经太老&#xff0c;很多后来的命令和配置&#xff0c;3.2.7都没有。 …

C++自主点餐系统

一、 题目 设计一个自助点餐系统&#xff0c;方便顾客自己点餐&#xff0c;并提供对餐厅销售情况的统计和管理功能。 二、 业务流程图 三、 系统功能结构图 四、 类的设计 五、 程序代码与说明 头文件1. SystemMap.h #pragma once #ifndef SYSTEMMAP #define SYSTEMMAP #in…

vue3全局引入element-plus使用Message教程

文章目录 安装引入 Element Plus和组件样式示例注意安装与引入&#xff1a;按需引入&#xff1a;API 使用&#xff1a;样式问题&#xff1a;组件上下文&#xff1a;版本兼容性&#xff1a;错误处理&#xff1a; 这是 Element UI 的 Vue 3 版本。ElMessage 是 Element Plus 中的…

在Linux上使用nginx反向代理部署Docker网站

在政务云上部署Web环境&#xff0c;为了保证服务器安全&#xff0c;甲方只开放一个端口且只允许使用https协议进行访问&#xff0c;经过思考&#xff0c;决定使用docker部署网站&#xff0c;使用nginx反向代理&#xff0c;通过不同的二级域名访问不同的端口。 1 使用docker部署…

编程语言|C语言——C语言变量的存储方式

前言 变量是程序中数据的存储空间的抽象。变量的存储方式可分为静态存储和动态存储两种。 静态存储变量通常是在程序编译时就分配一定的存储空间并一直保持不变&#xff0c;直至整个程序结束。在上一部分中介绍的全局变量的存储方式即属于此类存储方式。 动态存储变量是在程序执…

超越极限!《无名之辈》高阶武学与战术应对策略一览!

欢迎来到《无名之辈》世界&#xff01;在这里&#xff0c;决战不仅需要勇气&#xff0c;更需要智慧和策略。为了让你在游戏中游刃有余&#xff0c;以下是一份全面的游戏攻略&#xff0c;助你成为战场上的无敌之王&#xff01; 一、主角战斗技巧&#xff1a; 反击属性至关重要&a…

Vue3状态管理库--Pinia

Pinia快速入门 一、什么是Pinia &#xff1f; Pinia 是 Vue 的专属的最新状态管理库 &#xff0c;是 Vuex 状态管理工具的替代品。 Pinia官网链接 提供更加简单的API &#xff08;去掉了 mutation &#xff09;提供符合组合式风格的API &#xff08;和 Vue3 新语法统一&…

2024年【低压电工】实操考试视频及低压电工考试试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 低压电工实操考试视频是安全生产模拟考试一点通生成的&#xff0c;低压电工证模拟考试题库是根据低压电工最新版教材汇编出低压电工仿真模拟考试。2024年【低压电工】实操考试视频及低压电工考试试题 1、【单选题】()…