一、简介

1.定义

为了理解非平衡系统的分簇,传递和相变

vicsek提出了自驱动粒子模型(Self-Propelled Particle,SPP)模型

Vicsek模型是一种用于描述“Active matter”的数学模型

该模型在较高的粒子密度或较低的定位噪声下表现出集体运动

2.数学描述(mathematical description)

3.迭代公式

4.简单理解

刚开始就一群方向随机的粒子

每个周期,每个粒子都检查自己领域半径内粒子的大致方向,得到他们的平均方向

这个方向再加上一个噪声,就是下一时刻的方向

二、实现

1.重要的函数

(1).atan2()

函数名:四象限逆切(four-quadrant inverse tangent)

作用就是给出Y纵坐标和X横坐标,得到角度

再来看看atan()

给定纵坐标,得到角度,但是角度范围在[-pi/2,pi/2]之间,不满足我们要求的360度方向矢量

使用:

拿到周围邻居所有的速度矢量相加,得到邻居的总的矢量,得到Y和X,进而得到总的一个方向趋势

化为角度

(2).quiver()

参考:https://www.cnblogs.com/rgvb178/p/5926168.html

函数名:箭图or矢量图(Quiver or velocity plot)

需要实现这样的效果

#1.出发点为坐标

#2.方向由两个参数 dx 和 dy 决定

dx为下一时刻横坐标的增量,dy为下一时刻纵坐标的增量

dx和dy两个矢量相加就是速度矢量

#3.箭头长度不一定为速度矢量的模,可以自己设置

实现函数:quiver(x , y , u , v , scale)

x为横坐标的向量,y为纵坐标的向量

u为dx,v为dy,scale为箭头的长度(设置为1箭头长度就为1)

(3).pdist()与squareform()

pdist()方法和squareform()方法一般成对出现

pdist()方法用来计算坐标之间的距离,这里需要计算每个点之间的距离(欧几里得距离)

使用方法:

result = pdist(D,'euclidean')

D = (x y) x,y均为列向量

D矩阵每一个行向量代表一个点,假设D(m*2)

那么需要计算距离的点为m个,坐标为二维坐标

result是一个向量,这个向量其实是一个矩阵D'(m * m)的下半角矩阵压缩而来的

result其实等于[D'(2,1),D'(2,3),...,D'(2,m),..,D'(m,1),D'(m,m-1)]

result这一向量经过squareform()函数的反向操作,就能得到这个D'矩阵

D' = squareform(result)

测试:

2.边界重复问题

整个环境是(L*L)的大小,一个粒子越过右边界就要出现在左边界

同样的,越过上边界就要出现在下边界

通过程序的逻辑,我们预期把整个环境做成上下连通,左右连通

最后形成的系统逻辑上是环面(torus)

这里,关于边界问题,要考虑两个点

(1).位置迭代的时候矫正位置

这个很好考虑,现在的位置,拿到每个位置的速度矢量,进行位置迭代

拿到新一轮的横坐标和纵坐标,越过边界矫正一下

比如说横坐标范围是[0,L],有一个粒子这一次迭代得到的横坐标是-1

那么应该加上L,最后经过矫正的横坐标就是 -1 + L

(2).计算邻居的时候要考虑到边界的邻居

假如说当前粒子坐标为(0.5,y),邻居搜索半径为1

那么另一头的邻居也要计算到

这里只能实现一个粗暴的逻辑,算两遍每个点之间的距离,取相对来说小的那个

首先不要矫正,每个点之间的距离算一遍

然后按照下图的方式,把左边[0,r]范围A内的粒子移动到A'处

同样的把[r,L]范围的粒子移动到左边,再计算一遍每个粒子的距离

中间的粒子坐标就不动

经过这样的方式,在逻辑上满足效果,就是有点浪费性能

3.实现流程

(1).初始化参数

#1.迭代周期

#2.空间大小

#3.噪声大小

#4.粒子数量

#5.作用半径(检测邻居的半径)

#6.速度的模

(2).初始化粒子坐标和角度

(3).进入迭代

#1.画图

#2.越界矫正,得到每个点的距离

#3.得到每个粒子的邻居,计算邻居的平均方向

#4.更新x,y坐标

#5.矫正坐标

#6.更新角度

4.全部代码

%%(1).设置初始参数
clear
TMAX = 1000; %迭代1000个周期
L = 7;       %定义长宽为7的一个空间
noise = 0.2;   %噪声大小
N = 200 ;    %粒子数量
r = 1;       %作用半径
vel = 0.03;  %速度的模
%% (2).初始化粒子坐标和角度(1行N列)
x = L * rand(1 , N);
y = L * rand(1 , N);
angle = 2 * pi * rand(1 , N);
%% (3).进入迭代
for step = 1 : TMAX% #1.画图h = quiver(x , y , cos(angle)  , sin(angle) , 0.3); %箭头长度为0.3xlim([0 L]);ylim([0 L]);axis squarepause(0.1)% #2.计算每个点之间的距离D = pdist([x' y'] , 'euclidean'); %计算每个点之间的欧氏距离,输入矩阵为N * 2%矫正越界坐标,计算相对距离tmp_x(x < r) = L + x(x < r);tmp_x(x > L-r) = x(x > L-r) - L;tmp_x(x >= r & x <= L-r) = x(x >= r & x <= L-r);tmp_y(y < r) = L + y(y < r);tmp_y(y > L-r) = y(y > L-r) - L;tmp_y(y >= r & y <= L-r) = y(y >= r & y <= L-r);%计算逻辑矫正的距离tmp_D = pdist([tmp_x' tmp_y'] , 'euclidean');%两个距离里取到较小的距离D = min([D ; tmp_D]); M = squareform(D); %用矩阵形式表示距离% #3.得到每个粒子的邻居,计算邻居的平均方向[l1 , l2] = find(0 < M & M < r); %找到所有距离在r内的距离for i = 1:Nlist = l1(l2 == i); %l1记录邻居的下标if ~isempty(list)new_angle(i) = atan2(mean(sin(angle(list))) , mean(cos(angle(list))));elsenew_angle(i) = angle(i);endend% #4.更新x,y坐标x = x + vel * cos(angle); y = y + vel * sin(angle);% #5.世界上下相连,左右相连,矫正坐标x(x < 0) = L + x(x < 0);x(L < x) = x(L < x) - L;y(y < 0) = L + y(y < 0);y(L < y) = y(L < y) - L;% #6.更新角度angle = new_angle + noise * (rand(1,N)); %窗口关闭,程序退出if findobj==0  break;end
end

复杂网络实验9:vicsek模型(matlab)相关推荐

  1. 级联失效matlab,加权无标度网络的级联失效模型

    社交网.交通网.通信网等领域均呈现无标度特性[, 是复杂网络中常见的一种现象, 不同网络中的节点和边都承载着不同形式的负载, 且负载的承受能力是有限的.加权无标度网络是指节点和边根据权值构建成的网络[ ...

  2. 复杂网络实验1:ER随机图(matlab)

    复杂网络实验1:ER随机图(matlab) 一.版本1(单纯画图,无邻接矩阵) 1.创建degree(度)一维矩阵 2.创建点位置二维矩阵 3.生成圆形的形状,把圆形分成N份,给点赋值 4.每个点之间 ...

  3. adams与matlab联合仿真天线,雷达天线模型MATLAB与ADAMS联合仿真 实验.doc

    雷达天线模型MATLAB与ADAMS联合仿真 实验 雷达天线模型MATLAB与ADAMS联合仿真实验 1.导入雷达天线机械系统模型 启动ADAMS,弹出如图1所示的对话框,选择"Open a ...

  4. 差分方程matlab实验报告,实验二微分方程与差分方程模型Matlab求解

    实验二微分方程与差分方程模型Matlab求解 实验二: 微分方程与差分方程模型Matlab求解 一.实验目的 [1] 掌握解析.数值解法,并学会用图形观察解的形态和进行解的定性分析: [2] 熟悉MA ...

  5. matlab差分方程和微分方程,实验二微分方程与差分方程模型matlab求解

    实验二微分方程与差分方程模型matlab求解 实验二: 微分方程与差分方程模型 Matlab 求解一.实验目的[1] 掌握解析.数值解法,并学会用图形观察解的形态和进行解的定性分析:[2] 熟悉 MA ...

  6. 【深度学习】图像匹配Siamese网络实验记录

    图像匹配Siamese网络实验记录 Ⅰ. Siamese 网络介绍 Ⅱ. 数据集 AT&T 分拣行李匹配图像 Ⅲ. 实验记录 A. 模型1 1. 实验1 2. 实验2 3. 实验3 B. 模型 ...

  7. matlab实验学习心得,matlab实验心得体会-学习matlab的心得体会

    matlab实验心得体会-学习matlab的心得体会 导语:通过对MATLAB的系统环境,数据的各种运算,矩阵的分析和处理,程序设计,绘图,数值计算及符号运算的学习,初步掌握了MATLAB的实用方法. ...

  8. 知识在超网络中的传播模型

    知识在超网络中的传播模型 Knowledge diffusion in the collaboration hypernetwork 研究背景 研究点:知识在学术网络中的传播的模型. 一般的合作网络只 ...

  9. 山东大学类脑实验 五 HMAX 模型实现

    山东大学类脑实验 五 HMAX 模型实现 实验目的: 加深对 HMAX 模型的理解,能够使用 HMAX 模型解决简单问题 实验内容: 根据 HMAX 模型的相关知识,使用 Python 语言实现一个简 ...

最新文章

  1. android 耳机红外线,红外线耳机制作方法
  2. Linux Shell 逻辑运算符、逻辑表达式详解
  3. javascript面向对象学习笔记(一)——继承
  4. python开发网络小工具_Python集成网络诊断小工具(含有ping,tracert,tcping等小工具)...
  5. 数据可视化【十一】树状图
  6. 光与夜之恋服务器维护中,光与夜之恋7月16日停服维护说明 维护详情一览
  7. 【NOIP2016提高A组五校联考2】running
  8. oracle导出报错04063,Oracle EXP导出报错的解决方法
  9. 解码Core ML YOLO对象检测器(二)
  10. ie java 注册表,win7在桌面显示IE图标的注册表
  11. Unable to boot device due to insufficient system resources
  12. PS 拖入图片保持原大小
  13. Poco库使用:文件压缩和解压缩
  14. psd2html 阿里,psd2html
  15. RobotStudio 自动路径
  16. java麻将算法_Java实现的麻将胡牌算法
  17. Centos 安装 mysql5.7 示例教程
  18. Hive命令操作汇总
  19. Linux操作系统的pstack工具
  20. 【异步电路碎碎念1】 —— 到底什么是异步电路

热门文章

  1. 西瓜微数独家工具! 超全微博粉丝分析!!!
  2. Ubuntu搭建EDK2环境
  3. 基于Python的车辆管理系统
  4. MATLAB--数字图像处理 特征点匹配
  5. C语言趣味一百道 第25题 2017_12_24
  6. 面筋:Java实现''the sky is blue''反转输出为blue is sky the
  7. Ubuntu-离线安装基本依赖(gcc、make、dkms等)
  8. python 期货现货差价监测_现货价格和期货价格的关系怎么看?
  9. java不会英语可以学习吗,详细说明
  10. 去除停用词并绘制词云图