青岛济南网站建设优化石家庄的网站建设公司

当前位置: 首页 > news >正文

青岛济南网站建设优化,石家庄的网站建设公司,网站后台文章编辑不了,嵌入式软件开发是什么意思Particle Life粒子生命演化的MATLAB模拟 0 前言1 基本原理1.1 力影响-吸引排斥行为1.2 距离rmax影响 2 多种粒子相互作用2.1 双种粒子作用2.1 多种粒子作用 3 代码 惯例声明#xff1a;本人没有相关的工程应用经验#xff0c;只是纯粹对相关算法感兴趣才写此博客。所以如果有… Particle Life粒子生命演化的MATLAB模拟 0 前言1 基本原理1.1 力影响-吸引排斥行为1.2 距离rmax影响 2 多种粒子相互作用2.1 双种粒子作用2.1 多种粒子作用 3 代码 惯例声明本人没有相关的工程应用经验只是纯粹对相关算法感兴趣才写此博客。所以如果有错误欢迎在评论区指正不胜感激。本文主要关注于算法的实现对于实际应用等问题本人没有任何经验所以也不再涉及。 0 前言 Particle Life粒子生命演化最早是2017年由数字艺术家Jeffery Ventrella定义的通过非常简单方法的定义粒子间的作用力从而产生非常复杂的变化。 最开始Jeffery Ventrella管这种生成方法叫做Clusters其思想来源于生物学家Lynn Margulus。每个粒子具有不同的颜色每个颜色代表一种属性。粒子不仅会受到自己颜色粒子的吸引或排斥也会受到其它颜色粒子的吸引和排斥。 在不同的参数下粒子间会发生复杂的相互运动某些参数会呈现出复杂的固定斑图某些参数会呈现出类似生物之间的集群、逃跑、捕食等各种行为。 章节安排为第一章主要是讲解原理第二章演示一些基本的例子第三章给出了基于MATLAB的具体代码。 本文的参考文献如下 [1]粒子生命演化由数量庞大的单体粒子演化出复杂的群体行为逻辑 https://www.bilibili.com/video/BV1Dh4y1t7hn/ https://www.youtube.com/watch?vp4YirERTVF0 [2]https://particle-life.com [3]blender3.6模拟-粒子生命-Particle Life https://www.bilibili.com/video/BV1Ns4y1B7Fu/ 1 基本原理 首先假设一群粒子A它们互相会受到其它粒子的作用力。两个粒子间的力大小是粒子间距离r的函数。 当距离r较小小于rmin时设置了-1的排斥力为防止粒子之间重合。当粒子距离在rmin和rmax之间粒子最大作用力为Fi。当粒子距离超过rmax设置作用力为0防止计算量过大。 当然有几个细节点需要注意 1粒子所受的作用力只遵循上面的力方程但不一定遵循牛顿第三定理。粒子的速度和加速度通过牛二律Fma得到。由于防止粒子运动过快还需要在全场设置粘滞阻尼。所以其实牛顿第一定理也不满足。当然由于这并不是精准的模拟仿真所以这些小事可以忽略。 2力Fi是可以自行设置的当Fi0粒子间呈现出排斥性当Fi0粒子间呈现出吸引性一般不超过±2 3距离rmin通常在rmax的1/4~1/5左右rmax和画布大小有关rmax越大越会有全局的粒子参与rmax越小粒子的行为越局部。 1.1 力影响-吸引排斥行为 当F0时粒子间呈现出排斥的现象 当F0时粒子间呈现出吸引的现象
1.2 距离rmax影响 这里画布大小都定义为1。 当rmax0.2时粒子的汇集效果如下 当rmax0.5时粒子的汇集效果更全局化
2 多种粒子相互作用 2.1 双种粒子作用 对于两种粒子A和B力Fi共有4个分别为A对A之间的力A对B之间的力B对A之间的力和B对B之间的力。这4个力可以写为一个矩阵形式 ABAF_AAF_ABBF_BAF_BB 当假设A对A存在吸引且A还会吸引B。但是B没有反向作用A的力B与B之间也不会互相作用。这里的矩阵可以写作 [ 1 0 0.5 0 ] \begin{bmatrix} 1 0 \ 0.50 \end{bmatrix} [10.5​00​] 此时得到的图形为细胞图案A粒子在中间互相吸引到一团周围吸引一圈B粒子。 再添加两个规则给粒子B粒子B之间会弱吸引但粒子B排斥粒子A。此时由于粒子AB间一个吸引一个排斥构成了不断向前运动的追逐系统。 [ 1 − 1 0.5 0.5 ] \begin{bmatrix} 1 -1 \ 0.50.5 \end{bmatrix} [10.5​−10.5​] 追逐模型如下 之后多种粒子之间的运动规律也是由上述各个规则叠加演化而成。 但是由于规则数量等于粒子种类N的平方比如3种粒子就有9种粒子间规则4种粒子就有16种粒子间规则。这就导致复杂性暴增产生了无穷多的变化。 2.1 多种粒子作用 由于规则的复杂性每一次随机出的结果可能都是独一无二的且是其它人都未曾见过的。这种随机性和复杂性正是Particle Life的迷人之处。 下面列举一些演示计算结果 三种粒子细胞图案 三种粒子岛屿图案
三种粒子循环捕食图案 5种粒子的交互作用呈现出一定的结构
3 代码 上面绘图代码见文末。 主要更改粒子数量N颜色数量NColor即可。建议粒子数量N大概是500倍颜色数量。不易太多由于MATLAB运行效率较低所以按照实际电脑配置自行更改。 力的作用距离Rmax在最好是1/c的形式c是一个整数。 迭代总步数StepMax越大展示的时间越长。这个如果想长时间欣赏粒子间作用可以选择一个比较大的数。 图像刷新频率FrameFreq是用来控制多少个时间步显示一次。一般选择2就行太大会有卡顿的感觉。 clear clc close all %Particle Life粒子生命 MATLAB代码%% 初始设定参数 %初始设定 rng(shuffle);%随机种子 N1500;%粒子数量 NColor3;%颜色数量 Nirand(NColor,1);Niround(Ni*N/sum(Ni));%随机分配每个颜色对应的粒子数量 Nsum(Ni);Rmax1/5;%力作用的距离 mcphsv(40);colormap(mcp(1:32,:));%定义展示颜色 StepMax1.2e3;%结束迭代时间步 FrameFreq2;%刷新率正整数最小为1越大图像刷新越慢 %% 其它默认参数 %绘图范围 Xlim[0,1]; Ylim[0,1]; %定义每个粒子颜色编号 ColorPzeros(N,1); for t1:NColorColorP(1sum(Ni(1:t-1)):sum(Ni(1:t)))t; end %粒子的力关系矩阵 FMatrand(NColor,NColor)*3-1.5;%所有力Fi在-1.5~1.5之间 %粒子坐标速度 XY_Prand(N,2)*0.80.1;%所有粒子点坐标 VXY_Pzeros(N,2);%粒子点速度RminRmax/5;%粒子间的最小作用距离 MeshMax1/Rmax;%网格数量 dt5e-3;%时间精度%构建力函数 t0;%初始时间 cRmax*15.0*sqrt(N);%阻尼为了防止粒子运动速度太快%% 循环计算每一步迭代 tJ0;%绘图计数 for kt1:StepMax%计算点对应的网格XYindxceil(XY_P/Rmax);%循环计算每个点所受的力ForcePzeros(N,2);for kp1:N %循环每一个点%该点的颜色、坐标和网格Color_kColorP(kp,:);XY_kXY_P(kp,:);XYindx_kXYindx(kp,:);%计算周围点对该点的力F_kFMat(Color_k,ColorP);[Indx_t,XY_P_B,F_B]Beside9(XYindx_k,XYindx,MeshMax,XY_P,F_k);%周边点索引ForceP_kF_Func(XY_P_B-XY_k,F_B,Rmin,Rmax);ForceP(kp,:)ForceP_k;end%增加阻尼项和v相反ForcePForceP-c.*VXY_P;%根据F更新位移x和速度v。dvat,dxvtat^2/2VXY_P_NewVXY_PForcePdt;XY_PXY_P0.5(VXY_PVXY_P_New)dt;VXY_PVXY_P_New;%循环边界条件如果超出边界就移到另一端XY_P(XY_P1)XY_P(XY_P1)-1;XY_P(XY_P0)XY_P(XY_P0)1;ttdt;%加一时间步if ~mod(kt,FrameFreq)ffigure(1);f.Color[1,1,1];cla;scatter(XY_P(:,1),XY_P(:,2),6,ColorP,filled);xlim([0,1]);ylim([0,1]);%set(gca,XTick,[],YTick,[])axis offpause(0.01)%每一帧图像停留时间tJtJ1;end end%% 后置函数 function Ft2F_Func(xy,F,rmin,rmax) %粒子左右函数 %xyN行2列的向量代表别的点距离O点的距离向量 %FN行1列的向量代表吸引力F大小 rmid0.5(rmaxrmin); dmid0.5(rmax-rmin); rsqrt(xy(:,1).^2xy(:,2).^2);%距离 %r(r0)rmax; Ftzeros(size®); %第一段 indx1(rrmin); Ft(indx1)r(indx1)/rmin-1; %第二段 indx_last~indx1; indx2indx_last(rrmid); Ft(indx2)F(indx2).(r(indx2)-rmin)/dmid; %第三段 indx3(rrmid)(rrmax); Ft(indx3)-F(indx3).(r(indx3)-rmax)/dmid; %计算力向量 dir_xyxy./r; dir_xy(isnan(dir_xy))0; Ft_Vecdir_xy.(Ft*ones(1,2)); %计算合力 Ft2sum(Ft_Vec,1); endfunction [BesideIndx1,XY_P_B,F_P]Beside9(XYindx0,XYindx1,NMesh,XY_P,F_P) %寻找点0附近区域3×3共9格区域内 %开启循环边界条件%复制出边界点然后再计算。因为有的点在rmax较大的循环边界条件会同时向上和下吸引 if XYindx0(1)1%把最后一列复制一份到前面indx_tXYindx1(:,1)NMesh;XYindx1_tXYindx1(indx_t,:);XYindx1_t(:,1)0;%赋值为0XYindx1[XYindx1;XYindx1_t];XY_P[XY_P;XY_P(indx_t,:)[-1,0]];F_P[F_P;F_P(indx_t)]; end if XYindx0(1)NMesh%把第一列复制一份到最后indx_tXYindx1(:,1)1;XYindx1_tXYindx1(indx_t,:);XYindx1_t(:,1)NMesh1;%赋值为NMesh1XYindx1[XYindx1;XYindx1_t];XY_P[XY_P;XY_P(indx_t,:)[1,0]];F_P[F_P;F_P(indx_t)]; end if XYindx0(2)1%把最后一行复制一份到前面indx_tXYindx1(:,2)NMesh;XYindx1_tXYindx1(indx_t,:);XYindx1_t(:,2)0;%赋值为0XYindx1[XYindx1;XYindx1_t];XY_P[XY_P;XY_P(indx_t,:)[0,-1]];F_P[F_P;F_P(indx_t)]; end if XYindx0(2)NMesh%把第一行复制一份到最后indx_tXYindx1(:,2)1;XYindx1_tXYindx1(indx_t,:);XYindx1_t(:,2)NMesh1;%赋值为NMesh1XYindx1[XYindx1;XYindx1_t];XY_P[XY_P;XY_P(indx_t,:)[0,1]];F_P[F_P;F_P(indx_t)]; end %夹在范围之内的点有哪些 BesideIndx_X(XYindx0(1)-1XYindx1(:,1))(XYindx1(:,1)XYindx0(1)1); BesideIndx_Y(XYindx0(2)-1XYindx1(:,2))(XYindx1(:,2)XYindx0(2)1); BesideIndx1BesideIndx_X BesideIndx_Y; XY_P_BXY_P(BesideIndx1,:); F_PF_P(BesideIndx1); end