找回密码
 注册
关于网站域名变更的通知
查看: 743|回复: 1
打印 上一主题 下一主题

Kuramoto模型在Python和MATLAB中的简单实现

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2021-2-22 10:03 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
事情是这样的,我最近在研究团队编组及内部模式对发挥团队能力的影响,以及如何正确编组让团队能力发挥实现最大化,别问我为什么研究这个,反正稀里糊涂就研究上了。我发现在描述团队编组间及内部同步能力的时候,人们对Kuramoto模型(藏本模型)作了大量的研究,其中包括模型达到完全相位同步的充分条件、耦合强度对于同步的影响、一定条件下振子的收敛速率等。但具体实现一般都在MATLAB中,且网上代码过于复杂(我运行了一遍一堆报错),这里我使用Python和MATLAB对Kuramoto模型简单模拟。 / K% E; y: r7 i/ p' z8 @  Z
模拟的话还是一遍举个栗子,边分析边测试效果最好,百度学术上有一篇关于Kuramoto模型的简单论文,我们就用它来实现模拟。
; W- P  C, j, V, o2 Q5 a  S6 ?4 E* T$ w4 U% {( q6 q
好吧,那我们开始,首先是Python实现:
/ V( U4 J3 a% j1 A) K. }, ?. N  z7 v4 Y
N维Kuramoto模型的数学描述如下:
7 Q6 t* G! ^" V1 O% [7 U$ A6 _5 e
# B, a# C6 W1 C
8 x* ]# e7 n& h7 ^* t. r0 q没错,是讨厌的数学公式,没事,它可以改写成这样:
" S; [8 L4 ^" N; k" @/ r
  P* n" O  s$ k6 i9 v: l
9 x! A) \! O; P好像还是有点长,那我们在改写一下:
3 h3 i' P9 J: a, { ' f" F6 p9 x- `' M# k7 y- H% L

( M1 G; P3 ]% v% d9 r& p& P看着好多了,那我就来说说式子中参数的意义,Kij为耦合矩阵,是为了便于描述不同振子间耦合程度不同的情形。最下面那个式子的r就是我们的目标,反应振子间的相关性,这个相关性就可以描述我们想要的编组内部同步能力。5 p- `2 L3 Y$ w0 ?4 P, |

2 h1 r3 u8 q/ t- G1 S+ l$ D- ~哎呦,这个式子看起来好简单,这里要补充一下知识点:同步能力可不是一下子各组该怎么同步直接确定的了,它是一个从开始到稳定的阶段,也就是说随时间变化,最终反映在各组的同步能力才会确定,那么最后图像是什么样子才算同步能力好呢?1 D5 S5 l. l7 }8 {6 B

  G# w" `0 M. {/ D+ H6 N$ {( _* O同步能力好,是指随着时间的推移,各组的同步能力r逐渐稳定,波动现象消失或固定在某一个小范围内。需要注意的是这和各组r值之间的差距没有关系,我们要的是一个平稳的状态。那怎么办找r和t的关系呢?
/ T/ i) G( S) [% V# O/ K% ]1 {/ |5 i0 ^3 S/ o8 F
注意看最上面那两个式子,相位(第一项,等号左边那个)上面有个点,这样他可就不简简单单是个相位了,它代表的是相位的变化值,是一个微小的微分值,好吧具体意思就是,那个式子左边展开之后是这样的:  D3 |5 G1 E& K
$ [, k; c) s% M  Q
0 E7 w* J+ {& B0 @& J* J- g) K
哎呀,t出现了,其实\theta 与t有关,这里你可能有点绕,因为它们之间的关系是一一对应的,就是说每个时间的t对应了一个\theta ,我下面带入具体数值的时候你就知道了。2 Y8 |# r6 u) d) W% o; Y
! [. w  ~7 ^% g* l4 {
组间同步能力与时间t的关系出现了!9 |2 K- B2 w1 P& a: g3 p

/ \  S7 w" T2 A, U% J) @0 c也就是说我先用上面的那个公式4计算出来\theta 的值,在带入到公式5,那么t-r关系就可以明确下来了,那现在我们再回过头来看看文章中已经给的例子,看看还有没有未知量。
* E: ~: w# g* h- }+ j9 r. ?' M  z
栗子是这样的栗子:
5 O9 @6 ]3 x: O* b& d, z! s0 o* V& M& h6 r
假设某机构内部有 4 个编组,每个编组包括 5 个节点(其中 1 个节点为领导节点) 。另外,将上级领导作为一个独立的编组,且只包含一个节点。假设在领导机关增加4名信息传递人员。当以独立编组模式编组时,指定1名信息传递人员为指挥者,其指挥关系与其他编组一致; 当分散编组时,信息传递力量节点的关系与所在编组其他节点指挥关系一 致。其中,完全分散编组模式时,各信息传递力量节点之间无信息共享通道; 不完全分散编组时,在各信息传递人员节点之间建立一条信息共享通道。各编组模式及其拓扑结构如下图所示:
; g4 z5 F' p& e* g9 h# p. G- d/ P
6 b! B: J) z- _独立编组模式
/ [8 B" W! B% [
6 j( y$ b7 ]0 i) c
! S" n9 D2 n& I完全分散编组0 R  {! c3 H. F

* A: X! Z% q/ u' I% [% X6 o
1 a9 m9 L2 H2 d* W
. a; z; w: r0 s  Q5 \不完全分散编组
7 E  A) ?4 k4 D* Z. K
* @& U' n) E7 I; A! ]) U5 g- Z7 @( j1 t# ~4 Z! A# u& i% g
; c$ z3 {2 w( R4 M% W7 U) C# m+ p
参数数据$ Q. P& s8 t" `( G; _: e# M; u( q
0 `+ o; v0 g: V% \4 r0 j( P

' {& ~; t! {5 [3 \& A5 R8 }3 {9 H0 o9 \; z1 C) O9 I& I0 f

1 v; f2 D1 L- G参数确定一下有没有未知量:
# O4 d8 ?. v+ b0 K: {4 P
; S* c) L5 e' T. l$ J首先N,数据数目已知,这个有了。
: \* Z0 L# T9 P( r3 d2 P& b0 V9 o+ R0 Q) j5 G8 E+ P
K值是分组内的连接强度,这个是看实际情况,由甲方提供或者自己看着给的,这里就是甲方给的编组图,i与j点的链接强度一目了然,这个有了。
/ H/ Q( P  t1 D7 ^, z5 t8 W5 j; ~1 ^2 Q/ c8 M& n; M
\omega _{i} 是振子i的固有频率,也称自然频率,甲方会给,没法自己估计,这个有了。
: A& s. D/ j6 A: }9 r% m( m" o# j# U' f+ m! G  V
\theta ,\theta 怎么办,初始的\theta 会给,自己也能测的出来,但那么多\theta {j} -\theta{i} 得多少不知道啊,这里通过翻看文章,我发现其实文章是有一个特殊条件的,不然的话是需要研究耦合因子求三种约束条件解情况的,特殊条件就在这:6 z( N2 C0 B) A& G: t' G% Q
  z" f( n; Q$ x
假设编组内节点的初始相位差为π/2,且编号最小者为0,随编号增大而增大。
% S+ S2 ~( W6 i
9 K! l# n3 E# C) ]3 |. A哦,初始相位差知道了,你还告诉了我各个初始相位,那么\theta _{j} -\theta _{i} 的值就在一个范围内的几个固定值里面啊!
4 R% @1 Z3 }. P
' D# w% l/ M: \' G+ x好的,没有未知量了,就是找K的时候麻烦点,没办法,这个决定了编组的不同,写脚本算一下吧:  X! n7 B' `+ `' ]( F" ~
1 x5 q4 v! `! D9 |/ w
#codingutf-85 }( D- l% q  b2 Z/ k' H) L3 J

5 r7 }8 I9 r: @) Z# q4 C##ScriptName:KuramotoSimulation.py
0 s* \5 B( N2 c; N7 [& L' S8 v7 Y' S; Q% Y
import matplotlib.pyplot as plt ' @: P/ r$ D" j9 D
% x5 l4 ?3 Q; `2 f; |$ O8 B
from pylab import " G; c. n. s8 |* C) a& z
8 q+ [: ?" j+ S; q
from sympy import
5 V' D4 o$ P1 X9 L! j
* r& Z) w/ i: A- Y) i+ efrom matplotlib.ticker import MultipleLocator, FormatStRFormatter 4 O% A" h  {+ z2 k4 C; I
9 r) I2 K/ L5 ]4 z6 Y' o0 m
import math
9 ?5 v/ k: Z, Z6 ^, g  }
. n% S4 E, i, X$ t" kimport numpy as np , ~# C0 E* `! g
' }: U6 u% k$ b0 w8 ]
N = 31      #总节点数 % X; J6 I3 t5 v0 U2 v+ x7 S8 [

  w2 X9 J1 Z+ v% v$ U+ L% t8 {c=[0,0,math.pi  2,math.pi,3  math.pi 2,0,0,0,math.pi  2,math.pi,3  math.pi 2,0,0,0,math.pi  2,math.pi,3  math.pi 2,0,0,0,math.pi  2,math.pi,3  math.pi 2,0,0,0,math.pi  2,math.pi,3  math.pi 2,0,0]
$ \# H/ R8 d) p( O' V( A. s' I
! c! e* V/ B& j( @( _3 L% ?w = [4,3,3,2,2,1,4,3,3,2,2,1,4,3,3,2,2,1,4,3,3,2,2,1,4,3,3,2,2,1,5]
4 X  m% r! k1 U1 \% K: q
2 _& v9 R/ h  D) P& L0 Dk1 = [ * Z6 c$ v% U( u* U

- d3 X3 X( s/ |[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], # h% O. x: i) x; z1 s
6 U9 a  t$ D% X8 w
[1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2],
7 p4 l! @% Y5 w7 y( y% i) [* L1 A
[1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
1 K$ v% _# k; W* |0 x( L' P& K$ V0 C; A
[1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
% J3 K- A, N0 @  F# g  f  g5 s# I
[1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], , [; [# X4 V" k* A1 m; W) N
6 @/ j# n$ i) K9 Y7 a
[1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
3 {5 [8 h/ m. a: n& Z7 D0 u" v+ J# o- j  L
[1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],   A2 C) }' L( O& I  T
1 g3 c* m* }2 T: B5 ?
[0,0,0,0,0,0,1,0.9,0.9,0.9,0.9,0.9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2], 8 S! B" T6 w# g- y
% f- O. S# L$ b9 f' I
[0,0,0,0,0,0,0.9,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], ! F( Z3 T. D5 l) x$ f. E+ x$ A; w  ^

$ O) |: b4 F: Y& F: Q1 [[0,0,0,0,0,0,0.9,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], . c9 r6 ?% V" L% I8 T* p

$ \3 P! m$ p8 K+ G7 d[0,0,0,0,0,0,0.9,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], . N1 Y9 b) S' J" p

6 j* W1 l' K9 D# v: m[0,0,0,0,0,0,0.9,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], $ O+ \7 ~+ X( B7 D$ W% U
& E' a* ^' G; C: U/ Y: e
[0,0,0,0,0,0,0.9,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], 6 a! c$ }. |  t7 V
, T5 @% M7 Z4 s& Q8 }
[0,0,0,0,0,0,0,0,0,0,0,0,1,0.8,0.8,0.8,0.8,0.8,0,0,0,0,0,0,0,0,0,0,0,0,2],
) m) g* V) T" F& Z6 H" v" y
( v( w( s9 a3 t: n. |& G2 F/ Z[0,0,0,0,0,0,0,0,0,0,0,0,0.8,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
0 c% Z( ]3 d& P; ^, T. O, ]7 {! B) q9 }1 z% K3 O% v
[0,0,0,0,0,0,0,0,0,0,0,0,0.8,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
7 R2 b  F3 W! n
5 b% d; A0 K5 R[0,0,0,0,0,0,0,0,0,0,0,0,0.8,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
) ~8 Q3 m$ y% G* g! N# I6 B
; g& f3 i& n: d[0,0,0,0,0,0,0,0,0,0,0,0,0.8,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0], ' s! g3 V2 N& n% }

9 h' r! E+ z$ N  U7 H8 o[0,0,0,0,0,0,0,0,0,0,0,0,0.8,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0],   d1 r- {# a4 L+ t/ |
( D4 j8 W/ \2 F$ I5 ^. Z) j
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0.7,0.7,0.7,0.7,0.7,0,0,0,0,0,0,2],
# w) C+ e+ b  t1 F* x" F' {8 k
# d2 {& Y9 B) t[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.7,1,0,0,0,0,0,0,0,0,0,0,0],
$ ?1 h( w  ^# H- n% Q' |' h: }) y
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.7,0,1,0,0,0,0,0,0,0,0,0,0],
4 V# h+ l  g4 F/ y* P3 g! P) [# q& K" f5 b- j& a8 u9 Y* n3 z
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.7,0,0,1,0,0,0,0,0,0,0,0,0],
7 Y) x; o6 w+ K* }/ X& A; ]. N1 K$ f6 L2 b
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.7,0,0,0,1,0,0,0,0,0,0,0,0], , r' [. b1 c' V
& x1 s+ H% ^6 z8 U% _
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.7,0,0,0,0,1,0,0,0,0,0,0,0], ) ]7 l' ]3 Q2 J- I. K! l' y
* H0 [0 R  A8 ?" L6 j
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0.6,0.6,0.6,0.6,0.6,2],
$ b( s: l0 [2 }2 E. \* \
! [( j7 ?% h# X# E! w[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.6,1,0,0,0,0,0],
- X% K5 o/ g% ^! C) l% o  @; r
6 u& V  t) F+ T# k) K  s3 x; I[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.6,0,1,0,0,0,0],
  L" _3 M* c, b6 N# e
6 h! g# V8 d, X[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.6,0,0,1,0,0,0], ( U; H' G3 e) r2 q. n7 T" M

$ |. v& H, l3 H' `[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.6,0,0,0,1,0,0],
" b) E7 w; `6 O0 k& h( L/ P
" }0 Q0 ~; k& r* z, h9 y' X; s- q7 x8 f[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.6,0,0,0,0,1,0],
+ Q' F# z3 F* q: U
% F0 F: ]" O; N9 _! \$ @) j; `1 g' `[2,0,0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,1]]   
7 k0 y) H# `& z) Q) A- {& [$ w. T% F
n = [i + 1 for i in range(22)]                #目标划分,24个值,1-24 1 C5 r( f9 z# r4 w- N6 r$ e

" R  B# ]2 q! P" J! y$ t* ?- Q" vt = [j  for j in range(1000)] ! N% \6 n5 m0 w+ C" L9 H; _

' J6 ?2 d9 K$ l% d* B% S4 Zci = 0 1 y6 I! l' R# }7 I1 h5 Q2 q6 q; F

$ B, @  S4 a/ V0 XC = [] ; {$ ?; N2 r+ Y2 l! D' M- i$ n
1 s, p( W4 [% |5 b5 F; z
C.append(c)
# _6 a. O6 R! z/ T" O7 ~" v% C# {% {# U; G  [
for d in range(1100) : p7 a9 y! V0 ^0 a5 ?8 U

8 {8 n. l5 ~" B5 i6 a, |    for i in n * ~" D% U/ o4 x  @1 B

& ~7 |3 J4 Z+ @' K        for j in range(22) 0 ?0 m# k0 q) n: S3 ]" r+ T8 D
& k6 Q$ ~- E2 j) k# T) n6 n
            cj = c[j + 1] - c ' M$ D  E1 D: T" N  k" _) s5 {

4 ?. ^' ]9 Q$ U4 U  n5 l' R            ci += k1[j + 1]  math.sin(cj)
2 J4 ~$ p$ ^  q: D5 Q% l: r4 l* \! U% X  S: P
        cii = ci + w - x/ X' _6 z3 }
# C# J' i1 d: y. v1 n& f; A
        h = [0.01  cii + z for z in c]
; z' H- J$ E7 k# u, z1 Y5 S' [7 u& H  L1 d) u
        C.append(h)
) ~$ q( {6 S4 |$ H$ b" I6 t! ~
        c = h
# s. w% ]: q. l
0 g1 v3 k; G1 i0 i* p' g4 a& D  ~def r_function(u) 0 M+ L* s5 R5 ]% @- _- _1 e; Q; M; H5 Y

1 f9 U! h# e2 @. O! e' i0 H    y1 = 0 7 V4 t$ }7 K" `- ]0 F( c
0 [& j# l, S6 z+ {% }6 E' ^0 J
    y2 = 0 ' A- Q3 x; y" m4 H2 w/ {% ^
* v; ?( F/ l" ~. i# b/ M$ Q
    y12 = 0 $ K" U( X8 ^# j/ K8 r; q$ x
/ ~- W; _" Z$ r6 L; [
    y22 = 0 + x+ |0 s% e4 C1 C; R
" N6 M+ ~" v$ K6 v) J1 @4 @
    r = []
# g2 K5 n. ~' H; S  i2 W: u$ ?- r7 @' H' W% H: N6 D
    for x in range(1000) 6 ?1 `- X% S7 B, H& S
2 c" T8 b) {: x2 Q6 J
        for ul in u 6 `- M- o) o: W" K- e

  G% ]3 `+ D' m- w  X, L/ F* {# q            y1 += math.cos(C[x][ul])
) ^; j. e2 K# ]  e1 W7 i- Q0 V  T. J3 G, A: ~4 E2 x
            y2 += math.sin(C[x][ul]) ! V9 u# n9 _& O) A
5 g( ~5 `4 z& z3 Q3 f
        y12 = y1  2
; M( y0 \# {: H; o, E# N& U5 V- l1 v# ?1 J' j
        y22 = y2  2
% x2 N" ^) l' w5 i3 X' Z+ w% i9 h/ d  {# W, s7 B
        r.append((float(1)  N )  ((y12 + y22)  0.5))
. t6 e" u6 m0 U, E' T' A& P/ ?3 |2 Z' g
    return r
$ Y: Z+ Q& N6 k% G
  }0 l) S. C" v+ p) R; M  ir1 = r_function([1,2,3,4,5,6])
2 e9 U! U' Y( x  X+ q5 v, V  n# {  x8 ~3 V- e
r2 = r_function([7,8,9,10,11,12]) ) H' w7 S" \- ]$ z! u0 }6 P
5 u( p: a2 O' ?: O0 E1 W
r3 = r_function([13,14,15,16,17,18]) 4 `8 K- \9 Z! J5 ^5 z

( C: \- d# U$ e  l4 _r4 = r_function([19,20,21,22,23,24])
+ l2 Q2 `9 y( ~0 c( p5 L! `3 M
$ _, I. N8 {: u% B1 x' Wr5 = r_function([25,26,27,28,29,30])
7 l3 H6 x4 N* V7 \5 b% Z
. ?1 b2 {* E, X! d+ V+ b& R#r6 = r_function([31])
+ Y) A; o. W% e; m" v: a
. Q7 V/ ?6 Y8 |2 ?$ M; n: U9 P. u% n( S+ Q" k

2 i7 A- U+ b6 D1 yax = subplot(111) #注意一般都在ax中设置,不再plot中设置 2 l8 H) ?0 Y" a/ u

% r4 u1 T7 L3 r  v7 j5 G& ~ymajorLocator  = MultipleLocator(0.1) #将y轴主刻度标签设置为0.5的倍数
  P5 P+ r) I8 P2 m0 \
* ?- L4 O- H, V* t" nax.yaxis.set_major_locator(ymajorLocator) 2 i( `- Q. }9 t. T& a) T
3 K6 i8 d/ Z" |) b
plt.plot(t, r1, marker='o', color='green', label='1')
1 @, e. b+ y9 }
& H$ B. q5 A; W: _  A* Bplt.plot(t, r2, marker='D',color='red', label='2')
% T! P8 ~" V, }: K, L4 s; r  ]% _& H5 n/ |1 o6 Y
plt.plot(t, r3, marker='+',color='skyblue', label='3') " C7 S# A; |/ C  ]5 k/ u+ P

( T/ q7 f3 u+ O, U/ c- nplt.plot(t, r4, marker='h', color='blue', label='4') " R% @( l: [. P* B! I
( }* v2 N0 u% U4 ]; p5 R' H0 ~2 C. [2 n
plt.plot(t, r5, marker='_',color='yellow', label='5') 9 U- ]! C( K' E* x. h; q

' ~" G$ S- N2 \/ m) r5 E$ z  a#plt.plot(t, r6, color='red', label='6') * s. x* j3 K# P, I! Y1 I

) \5 [5 R8 k  E) L* ]4 a1 A' @: A, c( I' g9 Y

% A* \' j5 c. W- p% L$ nplt.legend() # 显示图例
6 w9 v5 B. \1 Y6 n$ W
5 c6 G# b* I3 @" B1 g5 s4 C7 q+ u# ~plt.xlabel('iteration times')
2 [/ \+ ]+ z& _' A' K: P1 x- {1 m5 L' |6 K* H
plt.ylabel('r') " e+ K( t6 a6 x$ ]: n  q% N+ p9 @0 |
8 t% D1 T6 [0 [; n+ o4 f+ a
plt.show() 1 F* |$ M/ z1 a  o' w& {

7 y; u- P3 ?' y4 w( L9 `2 a7 v) F$ O
独立编组结果如图:8 j& d  N2 Q& X

, L7 `5 J) D! p$ \
: ]1 H; P6 E9 `- S, g) P8 L" p; [& F" h0 a# b/ x2 L, f
k1独立编组
' s% k1 E# q& z9 s3 C5 O好的,从图像我们来看看Kuramoto模型在描述这个编组的时候,5组最终稳定,我们说这个团队编组还算科学,但我们改变一下K的值,换成分散编组:
4 g! H) T/ r) {' L# O" Q& z2 t
3 j% `# i8 }( _6 D" w. e3 D* c( Yk2 = [6 N* X5 Y3 I, Z; Y6 K% t

  a, a7 @( d( l5 E' N! J[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], / n2 ?% u8 ~+ Q  z% u

% a5 k" X5 O2 S# i[1,1,0.9,0.8,0.7,0.6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2],
: m& q$ _5 b1 i8 K7 V5 o' R- T# _
  I( Q, Q! K9 D' ~7 q& l[1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], / J) u( m1 @* x
- t, _5 w) f  U) S
[0.9,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
. A+ C" L2 S% j- _" s6 x' Z
3 O& b' o+ t2 k8 l: ^. N7 J# z[0.8,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
  T' [) F4 W  K- U& @3 D3 @% b) D0 R  Y% z3 N, L2 z, V- c
[0.7,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
! y/ w8 F2 Q) U. J
0 W8 X9 r4 d4 _0 [[0.6,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], 8 O" o3 e0 }! w- B& d1 ], Q
5 |) w0 x8 e" E% z& o+ t( M
[0,0,0,0,0,0,1,1,0.9,0.8,0.7,0.6,0,0,0,0,0,0,0,0,0,0,0,2],
; Y7 a! ?/ `( J6 y+ W. Y2 a' O9 y* a( K; ]0 X6 D0 c
[0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], : u- v% Y: g4 o3 c
; C- K) m+ h* a
[0,0,0,0,0,0,0.9,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
5 n) M6 ~) T0 A" i  d; ]8 f) D% p- q* r& E8 {2 Q
[0,0,0,0,0,0,0.8,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], 2 u, t9 @+ q" M5 l' R/ r9 C
7 x; s' A! }( q& e/ @; }: _! n
[0,0,0,0,0,0,0.7,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
: a) U; K4 D: v. [9 G% e5 E" k4 ~: S5 b+ R
[0,0,0,0,0,0,0.6,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0], - B; k# ?; b4 O- |' ^& w
8 v- p& {# v2 t0 S3 |( i
[0,0,0,0,0,0,0,0,0,0,0,0,1,0.9,0.8,0.7,0.6,0,0,0,0,0,0,2],
/ n4 u/ `1 a  h& m9 ]+ x9 U) j) }1 B) `9 [7 k! g0 ^' Y9 b( ?7 K! M
[0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0],
2 ?8 v. ?3 G: P8 ?, t/ @, p+ R- u  j7 }( W: m
[0,0,0,0,0,0,0,0,0,0,0,0,0.9,0,1,0,0,0,0,0,0,0,0,0],
0 T6 Y; r: D/ f7 F* `% \% e) o, C5 K7 p$ f) d3 V% C
[0,0,0,0,0,0,0,0,0,0,0,0,0.8,0,0,1,0,0,0,0,0,0,0,0,0],
% }+ `* [2 C! M6 m
( l7 U. R* `. A1 Z/ J+ w# _[0,0,0,0,0,0,0,0,0,0,0,0,0.7,0,0,0,1,0,0,0,0,0,0,0,0], ! |, u# ^, W, I/ U
$ Z$ J) _1 O) ^) @/ f/ ^3 c6 p
[0,0,0,0,0,0,0,0,0,0,0,0,0.6,0,0,0,0,1,0,0,0,0,0,0,0], : u/ N6 ?0 o# s0 I3 \
, w5 b! m& C! Z. i; `
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0.9,0.8,0.7,0.6,2], ( W1 R6 q: ?4 @' g4 _9 i/ D

1 X$ A5 _1 a. n& o[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0], ! s6 G% o# f" b# c$ I" |, n5 g
4 N! P3 p3 J8 y
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.9,0,1,0,0,0,0], ' \* G+ x% f5 U; g2 T

# x& x# D' T2 _1 J0 @6 F7 O[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.8,0,0,1,0,0,0], 3 e8 S# \3 a+ o
# e. l' O& {9 R3 q
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.7,0,0,0,1,0,0], 2 ]$ L" i9 W# Y- r) K7 v
& w; [* G+ Z9 i; j
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.6,0,0,0,0,1,0], " c" [; l$ r5 K" \" y- {- y1 g; ?/ [

1 U- p  ]7 O6 |( B) I[2,0,0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,1]
( J& D; m+ u5 ?8 ^, H; S7 \% M( ?$ x* M0 G0 R( k
- \7 z3 k  c% u4 U) Z1 J  F
5 ]5 X& g% U9 [/ M
k2独立编组
4 u( K' T+ b, e* x4 U4 f5 {
0 O( G9 {+ B( S$ ~5 Y

1 F6 e2 |) L6 k" S
. Z  l! ]* O/ N# v1 U2 s这两幅图像都在开始阶段大幅波动,而后在一定范围内趋于稳定,那么到底哪个分组模式最符合实际,最能突出编组能力呢?0 |8 V2 x$ o) S( y

% `( U2 _' u% G+ a, ~/ e) p这里还有一个公式,来解决这个问题,编组同步能力的量化:
6 {" s5 E2 M; [7 I7 G$ a

. h# q/ d: B5 g5 E8 C- d/ p+ v* }. j! h
M_{s} 就可以描述某编组的同步效果,r_{s} 是达到稳定状态后序参量的均值,β∈(0,1)是调节因子。我们可以用M_{s} 比较编组内部的好坏。那编组间能力的好坏怎样比较呢?
, M/ t. i6 j; y* X& u; w6 f
5 \' A$ S8 e& k- u, B8 ~; r这个Kuramoto模型同样有所考虑,它有一个描述整个系统编组能力的公式:) H8 {* U" \  B  N% E

- _) d, J/ u; }9 o; P
/ Z0 T6 u! X# g其中,P是编组的数量,M_{i} 是第i个编组的同步能力,\omega _{i} 是编组在整个系统中的权重,\psi {e} 是各编组平均 相位的均值,\Delta \psi 是各编组平均相位的标准差。具体的计算不是这篇文章的重点,就不在计算M{s} 和M的值来比较上述例子独立编组和分散编组的好坏了,本篇文章主要是讲下Kuramoto模型的解决思路,尤其是上面解决\theta 值的方法可以套用在其他Kuramoto模型中,做一个目标估计绰绰有余的。6 }8 |5 r% R( s9 Y% l

6 Z9 N# k# e. A' R" m# r下面是解决Kuramoto模型常用的MATLAB编程方法,具体思路与上述基本一致,这里不再赘述,K的值我们给另一种编组模式:不完全分散编组模式,也是现在实际上最长用的编组方式,直接上代码:3 n5 a5 m0 f% M! V9 O

  e) p! [& B* j( Dclc;
* U! u" r+ p4 X7 U* K' K* a3 o
+ C: K4 P3 Y. ?) K+ {+ Uclear all; $ J0 v" E- M5 R; _

% Y# q  I' ~, d! ~; lk=[0  1  1  1  1  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0.5;
, Y, X6 M; X( @3 g% `) ]% ^" E7 U7 h% z1 D$ l6 {0 q4 p8 A
  1  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0;   
$ V3 u5 {- S1 K5 c$ R& l$ B/ j
6 e$ X1 K0 J% c/ c% Z  1  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0;   
6 R4 P! T# I! w
& g8 Q* c- R* @% o! b5 v& G- ~6 O- e  1  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0;   
5 V* \1 F# K2 [) |* _7 H8 ~- c4 f8 {! |
  1  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0;   
1 ]0 z* ~- Q$ C6 Z& ^0 L0 A& ?
5 c$ }7 e4 J8 j8 I7 f! F# ^  0  0  0  0  0  0  1  1  1  1  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0.5;
2 K2 E2 Y- r7 v
9 v9 i' m; v# Q# m  0  0  0  0  0  1  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0;   
, `7 A2 V" |5 ~; l5 U; G  I' x2 u8 W' `) s8 V) [. ?
  0  0  0  0  0  1  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0;   " J2 `& W& s1 t# ]

- }& P4 w" t( ^  0  0  0  0  0  1  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0;   
7 r3 s) ^$ z& ^9 J
) I* S/ j. p" c; _' P) B! s  0  0  0  0  0  1  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0;   . T. w8 p$ ~' u  A
' d, j6 j  C8 n1 ~5 E8 R7 L
  0  0  0  0  0  0  0  0  0  0  0  1  1  1  1  0  0  0  0  0  0  0  0  0  0.5; # R# t+ d* a  [; Q1 U

3 n# q/ {; v* c; Y  0  0  0  0  0  0  0  0  0  0  1  0  0  0  0  0  0  0  0  0  0  0  0  0  0;   
& H/ J# I" e# S! _+ {/ d( [9 F5 Q8 [( U; o2 x( k
  0  0  0  0  0  0  0  0  0  0  1  0  0  0  0  0  0  0  0  0  0  0  0  0  0;   
% q$ o5 M# G6 `, \7 S6 h3 Y! @- O( X
  0  0  0  0  0  0  0  0  0  0  1  0  0  0  0  0  0  0  0  0  0  0  0  0  0;   
" e& U" c/ w. z7 P! k+ F/ L% l
; {' t, M$ z8 \  0  0  0  0  0  0  0  0  0  0  1  0  0  0  0  0  0  0  0  0  0  0  0  0  0;   
& P' q4 j7 `" ?' `% e4 j3 X$ q9 m1 V: f- I
  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1  1  1  1  0  0  0  0  0.5;
: q2 d( y6 t! B- k* B" {! E$ ^1 f, i& [8 W4 J
  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1  0  0  0  0  0  0  0  0  0;   # v9 _/ Y! `  s

( Z- r7 A7 X4 g  q$ k" ~" r9 Z  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1  0  0  0  0  0  0  0  0  0;   
1 O, v% ^% }6 |& U0 M, w$ Y" _5 c$ e/ u& P4 y: j8 j2 H
  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1  0  0  0  0  0  0  0  0  0;   # v7 z/ z; O+ _
8 o" ?$ q3 h+ C) F! Z1 B
  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1  0  0  0  0  0  0  0  0  0;   
8 _: ]  F3 m0 f0 d: N! j+ s: r! D: ^, e3 T2 |! ]9 S/ T
  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  2  2  2  0.5;
4 m0 K4 m/ F& y$ l
( `' Z. T; _" [  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  2  0  0  0  0;   
, I5 h! N' ]3 R% M! J2 ~3 [- Z2 g1 K# k  m) a
  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  2  0  0  0  0;   
9 u) V/ E, t1 A8 R( }: w' `2 [6 W. i# W" N& h6 |1 }( c
  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  2  0  0  0  0;   
; t) r: m- [: N2 F+ O& v9 A6 K
2 `( e! k/ h7 x  0.5 0 0  0  0  0.5 0 0  0  0 0.5 0  0  0  0  0.5 0 0  0  0  0.5 0 0  0  0;   
" }) }- I% W& X
, c( r5 ?2 K. I# q& x  ]     
& q1 W& i. z/ b4 r3 H
$ e, x: @6 l. _, T0 p- o+ GN = 25;
6 T: w  m8 Z/ W! |, \
4 u. }1 u) O  s+ Z! T$ ^! eStep= 10000;
: w" W4 j" P/ e0 ^& V- j) b5 v8 N  v6 f: A( p" v
Theta=zeros(Step,N);
, j5 o+ p" f  \  [- t. l% A* e5 W7 G" S" s
Omega =zeros(Step,N);
# \3 z$ S# H: X+ o# [2 Z
% U8 R; a+ X0 `% [& KDeltaT=0.01 9 C8 i9 W0 M9 q* Q8 t

& s& S  C9 P. \2 F8 S( m. eTheta(1,:)=[0 pi/2 pi 3*pi/2 0 pi/2 pi 3*pi/2 0 pi/2 pi 3*pi/2 0 pi/2 pi 3*pi/2 0 pi/2 pi 3*pi/2 0 pi/2 pi 3*pi/2 0];
# g6 ~$ E  ]6 F5 Q" B+ @
4 @6 z4 d1 u$ ~, y) r9 VOmega(1,
:D=2*pi*[2  3  3  4      4 2    3  3      4 4    2  3      3 4    4  2      3 3    4  4      2 2    3  4      1]; & `( _% K% ]/ z" r1 C: S+ D$ y
- V" H  f- J' v" H( G
%  求解微分方程
! O; m$ e' v! H- m
6 v+ ^' B5 c% xfor n = 1:Step
* P6 K; O1 V1 c2 q" ], |; U" m3 u/ Z1 n* E
    for i = 1:N " n2 c. W( S% X3 }1 u" J

1 v/ a7 x; m6 l1 y8 M+ n* M            Sigma = 0;
5 Y8 {+ `3 \  n6 P6 P- S, o/ ?( e5 Q0 H8 _; W! I% t
        for j = 1:N
$ `. P  [) u/ ]! l
. m. S$ M' I5 j* K4 j! d1 J0 }            %%判断k对同步效果的影响
4 P& K2 G* Y, _) I4 h# V% Y' B9 V2 R/ l$ v5 R+ w- c/ ?
= Sigma + k(i,j) * sin( Theta(n,i) - Theta(n,j) );
3 r* w5 h7 u2 O' w, f
' \& J4 m" l; M' x7 M        end 4 n2 T" {8 R$ |) A
/ G* h# q! K) P  \3 V
            Omega(n+1,i) = Omega(n,i) - Sigma; 1 s9 z% W/ J$ }1 }8 U" f
- K0 T3 \4 D) R, x8 d! y
            Theta(n+1,i) = Omega(n+1,i)*DeltaT + Theta(n,i);
" ^8 Y* P4 w" i: T8 u; D
. `; Y3 {3 h* @    end 0 m& x2 [/ q2 ^7 m
1 x. |  T! K. k3 s8 ^# V$ c+ |
end
$ K% d% F9 J7 U2 _& K* V6 z
! l. [: ^% o0 w) r%  求解序参量r(t)
- D$ b! |5 R& q. R8 A5 J7 e/ q! H7 o/ `; @
groupN = 5;
  ~1 d5 {8 ~, o' c! V# S! d* S) j  ^: J$ q* N, b8 t
Step = 1000; " v+ n7 J* M0 M& s0 F, Y
( _2 w- R1 {8 L, c/ c
for i = 1:Step * W3 c/ M& q1 F4 F. t( o" l

- I& j2 @" j( r& l    sigma1 = 0; 0 M+ u/ h5 N2 M5 S( i
3 `: X+ g3 I9 g, b! w8 V; G
    sigma2 = 0; ( |3 k& [2 N0 N9 S1 \/ r" @. X
! I# j8 B$ U, P" B
    sumTheta = 0;
6 k2 e) C+ A7 l6 y2 `+ q! ], h. G: o% }% i8 j+ m* F
    for j =6:10  %表示相应的群组
0 I! k) s. b- M4 n: H1 t# P2 D
- z. J/ S$ v7 S% r+ v: W        sigma1=sigma1+cos(Theta(i,j));
/ K5 @- u; i9 a! }# T$ t8 N! K; W! L
        sigma2=sigma2+sin(Theta(i,j)); # ~3 W# r7 l- k+ x7 c* @+ r
5 S( m5 V% I  I7 I6 k) X0 \
    end - {4 D& l) ?  }. S
) i) z% b- v4 g. v6 \+ V
    r(i)= sqrt( sigma1^2+sigma2^2 )/groupN; 6 \! c! w. r! Y" _* e

) {3 T4 F6 N1 t% X. \0 _8 lend
! T9 A+ @2 T: c+ k  K6 T  g$ r5 d3 T+ N
x= 0.01:DeltaT
:DeltaT*Step;
* ?  Y' \6 [: D2 D6 y* y) w7 y% n  ^1 |, _: w/ s
plot(x,r); & G; `* k+ n2 f. S: _+ p7 V, D
MATLAB版不完全分散编组结果如下图:
3 M/ [# v; i2 X' `
( @' E1 X6 P+ f2 R+ h/ F2 a

该用户从未签到

2#
发表于 2021-2-22 10:42 | 只看该作者
Kuramoto模型在Python和MATLAB中的简单实现
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-11-24 15:23 , Processed in 0.218750 second(s), 26 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表