疫情建模前期调研之三——微分方程与细胞自动机

目录

  • 原理简介
  • 作品展示
  • 代码演示

一、原理简介

1.微分方程如何运用到细胞自动机/生命游戏中?

(1)微分方程:是指含有未知数及其导数的关系式。描述的是未知函数的倒数与自变量之间的关系的方程。
(2)通过微分方程的变式,我们可以得到在同一个点下一时刻的状态。
如下图,最上面是原始的微分方程,中间通过一系列的变换,得到下一时刻某点的数值和上一时刻该点数值的关系。而在细胞自动机中,这个“值”的大小可以用可视化的形式来展示。(比如表示自爆的颜色值、细胞的透明度等等)
在这里插入图片描述

2.引入微分方程对于之后的疫情建模有什么帮助?

疫情建模的过程中将会使用到很多方程,所以学会如何把方程运用到程序中是一件很重要也是很必要的事情。在这里我是以一阶、二阶、三阶的微分方程分别带入到程序中进行实现。这里可以起到一个联系的作用,对之后的疫情建模将起到引导的作用。而在疫情建模中将会使用到以下一些方程:

1.与自由增长模型相关的微分方程

在这里插入图片描述

2.与SI模型相关的微分方程

在这里插入图片描述

3.与SIS模型相关的微分方程

在这里插入图片描述

4.与SIR模型相关的微分方程

在这里插入图片描述

二、作品展示

1.图片展示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.动态图展示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.视频展示

微分方程+细胞自动机的结合使用

三、代码演示

1.程序设计思路

在这里插入图片描述

2.程序模块介绍

(1)计算下一代细胞的函数: 在普通的细胞自动机中,我们得到下一代细胞的状态都是通过细胞的邻居的状态通过一定规则的演变计算得来的。而计算出微分方程,得到我们想要的关系式之后,就能够用我们得到的关系式作为规则。因为我们最终得到的关系式,其中含有当前位置附近的一些细胞的状态,因此这样就将它们联系在了一起。
(2)添加GUI: 在该程序中,我还添加了GUI,用来实现用户和程序之间的交互。用户可以自己选择细胞的颜色,并实时在程序中进行更改。

3.相关代码

//ui控制器
var controls=new function () {
    this.tx=1;
    this.ty=1;
    this.color="#dda0dd";
    this.setFrame=function () {
        frame=!frame;//取反
    };
    this.secondWay=function () {
        //停止调用循环函数
        clearInterval(firstCal);
        console.log(firstCal);
        //回归初值
        //采用新的计算方法进行循环
    }
};
//计算下一代的细胞:设置透明度
    function generateCell(){
        //排除边缘一圈
        var calOpacity;
        var diver;
        for(var i=1;i<allObjects.length-1;i++){
            for(var j=1;j<allObjects[0].length-1;j++){
                allObjects[i][j].material.wireframe=frame;
                allObjects[i][j].material.color.set(oneObjColor);
                calOpacity= -allObjects[i+1][j].material.opacity
                            +allObjects[i-1][j].material.opacity
                            -allObjects[i][j].material.opacity
                            +allObjects[i+1][j+1].material.opacity
                            +allObjects[i][j-1].material.opacity;
                calOpacity=Math.abs(calOpacity);
                if(calOpacity>1) {
                    diver = Math.floor(calOpacity);//向下取整
                    calOpacity -= diver;//只保留[0,1]的部分,相当于取余一样
                }
                allObjects[i][j].material.opacity=calOpacity;
                record[i][j]=calOpacity;
            }
        }
        console.log(record);
    }
        //UI的控制
    function changeUI(){
        var gui=new dat.GUI();
        var daltX=gui.add(controls,'tx',0,5);
        var daltY=gui.add(controls,'ty',0,5);
        var objColor=gui.addColor(controls,'color');
        gui.add(controls,'setFrame');
        daltX.onFinishChange(function (value) {
            tx=value;
        });
        daltY.onFinishChange(function (value) {
            ty=value;
        });
        objColor.onFinishChange(function (value) {
            oneObjColor=value;
        });
    }
//将object的material颜色转为16进制
    function colorRGBtoHex(color) {
        var r = Math.round(255*color.r);
        var g = Math.round(255*color.g);
        var b = Math.round(255*color.b);
        var hex = "#" + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1);
        return hex;
    }

发布了28 篇原创文章 · 获赞 6 · 访问量 6104

猜你喜欢

转载自blog.csdn.net/Program_dancing/article/details/105734899