复杂网络实验9:vicsek模型(matlab)
一、简介
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)相关推荐
- 级联失效matlab,加权无标度网络的级联失效模型
社交网.交通网.通信网等领域均呈现无标度特性[, 是复杂网络中常见的一种现象, 不同网络中的节点和边都承载着不同形式的负载, 且负载的承受能力是有限的.加权无标度网络是指节点和边根据权值构建成的网络[ ...
- 复杂网络实验1:ER随机图(matlab)
复杂网络实验1:ER随机图(matlab) 一.版本1(单纯画图,无邻接矩阵) 1.创建degree(度)一维矩阵 2.创建点位置二维矩阵 3.生成圆形的形状,把圆形分成N份,给点赋值 4.每个点之间 ...
- adams与matlab联合仿真天线,雷达天线模型MATLAB与ADAMS联合仿真 实验.doc
雷达天线模型MATLAB与ADAMS联合仿真 实验 雷达天线模型MATLAB与ADAMS联合仿真实验 1.导入雷达天线机械系统模型 启动ADAMS,弹出如图1所示的对话框,选择"Open a ...
- 差分方程matlab实验报告,实验二微分方程与差分方程模型Matlab求解
实验二微分方程与差分方程模型Matlab求解 实验二: 微分方程与差分方程模型Matlab求解 一.实验目的 [1] 掌握解析.数值解法,并学会用图形观察解的形态和进行解的定性分析: [2] 熟悉MA ...
- matlab差分方程和微分方程,实验二微分方程与差分方程模型matlab求解
实验二微分方程与差分方程模型matlab求解 实验二: 微分方程与差分方程模型 Matlab 求解一.实验目的[1] 掌握解析.数值解法,并学会用图形观察解的形态和进行解的定性分析:[2] 熟悉 MA ...
- 【深度学习】图像匹配Siamese网络实验记录
图像匹配Siamese网络实验记录 Ⅰ. Siamese 网络介绍 Ⅱ. 数据集 AT&T 分拣行李匹配图像 Ⅲ. 实验记录 A. 模型1 1. 实验1 2. 实验2 3. 实验3 B. 模型 ...
- matlab实验学习心得,matlab实验心得体会-学习matlab的心得体会
matlab实验心得体会-学习matlab的心得体会 导语:通过对MATLAB的系统环境,数据的各种运算,矩阵的分析和处理,程序设计,绘图,数值计算及符号运算的学习,初步掌握了MATLAB的实用方法. ...
- 知识在超网络中的传播模型
知识在超网络中的传播模型 Knowledge diffusion in the collaboration hypernetwork 研究背景 研究点:知识在学术网络中的传播的模型. 一般的合作网络只 ...
- 山东大学类脑实验 五 HMAX 模型实现
山东大学类脑实验 五 HMAX 模型实现 实验目的: 加深对 HMAX 模型的理解,能够使用 HMAX 模型解决简单问题 实验内容: 根据 HMAX 模型的相关知识,使用 Python 语言实现一个简 ...
最新文章
- android 耳机红外线,红外线耳机制作方法
- Linux Shell 逻辑运算符、逻辑表达式详解
- javascript面向对象学习笔记(一)——继承
- python开发网络小工具_Python集成网络诊断小工具(含有ping,tracert,tcping等小工具)...
- 数据可视化【十一】树状图
- 光与夜之恋服务器维护中,光与夜之恋7月16日停服维护说明 维护详情一览
- 【NOIP2016提高A组五校联考2】running
- oracle导出报错04063,Oracle EXP导出报错的解决方法
- 解码Core ML YOLO对象检测器(二)
- ie java 注册表,win7在桌面显示IE图标的注册表
- Unable to boot device due to insufficient system resources
- PS 拖入图片保持原大小
- Poco库使用:文件压缩和解压缩
- psd2html 阿里,psd2html
- RobotStudio 自动路径
- java麻将算法_Java实现的麻将胡牌算法
- Centos 安装 mysql5.7 示例教程
- Hive命令操作汇总
- Linux操作系统的pstack工具
- 【异步电路碎碎念1】 —— 到底什么是异步电路