Permalink
Newer
100644
238 lines (190 sloc)
6.57 KB
1
#!/usr/bin/env python3
2
# -*- coding: utf-8 -*-
3
"""
4
Created on Sat May 11 08:56:41 2019
5
6
@author: nolte
7
8
D. D. Nolte, Introduction to Modern Dynamics: Chaos, Networks, Space and Time, 2nd ed. (Oxford,2019)
9
"""
10
11
# https://www.python-course.eu/networkx.php
12
# https://networkx.github.io/documentation/stable/tutorial.html
13
# https://networkx.github.io/documentation/stable/reference/functions.html
14
15
import numpy as np
16
from scipy import integrate
17
from matplotlib import pyplot as plt
18
import networkx as nx
19
from UserFunction import linfit
20
import time
21
22
tstart = time.time()
23
24
plt.close('all')
25
26
27
28
Nfac = 25 # 25
30
width = 0.2
31
32
# model_case 1 = Complete Graph
33
# model_case 2 = Barabasi
34
# model_case 3 = Power Law
35
# model_case 4 = D-dimensional Hypercube
36
# model_case 5 = Erdos Renyi
37
# model_case 6 = Random Regular
38
# model_case 7 = Strogatz
39
# model_case 8 = Hexagonal lattice
40
# model_case 9 = Tree
41
# model_case 10 == 2D square lattice
42
43
model_case = int(input('Input Model Case (1-10)'))
44
if model_case == 1: # Complete Graph
45
facoef = 0.2
46
nodecouple = nx.complete_graph(N)
47
elif model_case == 2: # Barabasi
48
facoef = 2
49
k = 3
50
nodecouple = nx.barabasi_albert_graph(N, k, seed=None)
51
elif model_case == 3: # Power law
52
facoef = 3
53
k = 3
54
triangle_prob = 0.3
55
nodecouple = nx.powerlaw_cluster_graph(N, k, triangle_prob)
56
elif model_case == 4:
57
Dim = 6
58
facoef = 3
59
nodecouple = nx.hypercube_graph(Dim)
60
N = nodecouple.number_of_nodes()
61
elif model_case == 5: # Erdos-Renyi
62
facoef = 5
63
prob = 0.1
64
nodecouple = nx.erdos_renyi_graph(N, prob, seed=None, directed=False)
65
elif model_case == 6: # Random
66
facoef = 5
67
nodecouple = nx.random_regular_graph(3, N, seed=None)
68
elif model_case == 7: # Watts
69
facoef = 7
70
k = 4; # nearest neighbors
71
rewire_prob = 0.2 # rewiring probability
72
nodecouple = nx.watts_strogatz_graph(N, k, rewire_prob, seed=None)
73
elif model_case == 8:
74
facoef = 8
75
rows = 4
76
colm = 8
77
nodecouple = nx.hexagonal_lattice_graph(rows, colm, periodic=True, with_positions=False)
78
N = nodecouple.number_of_nodes()
79
elif model_case == 9: # k-fold tree
80
facoef = 16
81
k = 3 # degree
82
h = 3 # height
83
sm = 0
84
for lp in range(h+1):
85
sm = sm + k**lp
86
N = sm
87
nodecouple = nx.balanced_tree(k, h)
88
elif model_case == 10: # square lattice
89
facoef = 3
90
m = 6
91
n = 6
93
N = nodecouple.number_of_nodes()
94
95
plt.figure(1)
96
nx.draw(nodecouple)
97
#nx.draw_circular(nodecouple)
98
#nx.draw_spring(nodecouple)
99
#nx.draw_spectral(nodecouple)
100
print('Number of nodes = ',nodecouple.number_of_nodes())
101
print('Number of edges = ',nodecouple.number_of_edges())
102
#print('Average degree = ',nx.k_nearest_neighbors(nodecouple))
103
104
# function: omegout, yout = coupleN(G)
105
def coupleN(G):
106
107
# function: yd = flow_deriv(x_y)
108
def flow_deriv(y,t0):
109
110
yp = np.zeros(shape=(N,))
111
ind = -1
112
for omloop in G.node:
113
ind = ind + 1
114
temp = omega[ind]
115
linksz = G.node[omloop]['numlink']
116
for cloop in range(linksz):
117
cindex = G.node[omloop]['link'][cloop]
118
indx = G.node[cindex]['index']
119
g = G.node[omloop]['coupling'][cloop]
120
121
122
temp = temp + g*np.sin(y[indx]-y[ind])
123
124
yp[ind] = temp
125
126
yd = np.zeros(shape=(N,))
127
for omloop in range(N):
128
yd[omloop] = yp[omloop]
129
130
return yd
131
# end of function flow_deriv(x_y)
132
133
mnomega = 1.0
134
135
ind = -1
136
for nodeloop in G.node:
137
ind = ind + 1
138
omega[ind] = G.node[nodeloop]['element']
139
140
x_y_z = omega
141
142
# Settle-down Solve for the trajectories
143
tsettle = 100
144
t = np.linspace(0, tsettle, tsettle)
145
x_t = integrate.odeint(flow_deriv, x_y_z, t)
146
x0 = x_t[tsettle-1,0:N]
147
149
y = integrate.odeint(flow_deriv, x0, t)
150
siztmp = np.shape(y)
151
sy = siztmp[0]
152
153
# Fit the frequency
154
m = np.zeros(shape = (N,))
155
w = np.zeros(shape = (N,))
156
mtmp = np.zeros(shape=(4,))
157
btmp = np.zeros(shape=(4,))
158
for omloop in range(N):
159
160
if np.remainder(sy,4) == 0:
161
mtmp[0],btmp[0] = linfit(t[0:sy//2],y[0:sy//2,omloop]);
162
mtmp[1],btmp[1] = linfit(t[sy//2+1:sy],y[sy//2+1:sy,omloop]);
163
mtmp[2],btmp[2] = linfit(t[sy//4+1:3*sy//4],y[sy//4+1:3*sy//4,omloop]);
164
mtmp[3],btmp[3] = linfit(t,y[:,omloop]);
165
else:
166
sytmp = 4*np.floor(sy/4);
167
mtmp[0],btmp[0] = linfit(t[0:sytmp//2],y[0:sytmp//2,omloop]);
168
mtmp[1],btmp[1] = linfit(t[sytmp//2+1:sytmp],y[sytmp//2+1:sytmp,omloop]);
169
mtmp[2],btmp[2] = linfit(t[sytmp//4+1:3*sytmp/4],y[sytmp//4+1:3*sytmp//4,omloop]);
170
mtmp[3],btmp[3] = linfit(t[0:sytmp],y[0:sytmp,omloop]);
171
172
173
#m[omloop] = np.median(mtmp)
174
m[omloop] = np.mean(mtmp)
175
176
w[omloop] = mnomega + m[omloop]
177
178
omegout = m
179
yout = y
180
181
return omegout, yout
182
# end of function: omegout, yout = coupleN(G)
183
184
185
186
Nlink = N*(N-1)//2
187
omega = np.zeros(shape=(N,))
188
omegatemp = width*(np.random.rand(N)-1)
189
meanomega = np.mean(omegatemp)
190
omega = omegatemp - meanomega
191
sto = np.std(omega)
192
193
194
195
lnk = np.zeros(shape = (N,), dtype=int)
196
ind = -1
197
for loop in nodecouple.node:
198
ind = ind + 1
199
nodecouple.node[loop]['index'] = ind
200
nodecouple.node[loop]['element'] = omega[ind]
201
nodecouple.node[loop]['link'] = list(nx.neighbors(nodecouple,loop))
202
nodecouple.node[loop]['numlink'] = len(list(nx.neighbors(nodecouple,loop)))
203
lnk[ind] = len(list(nx.neighbors(nodecouple,loop)))
204
205
206
avgdegree = np.mean(lnk)
207
mnomega = 1
208
209
facval = np.zeros(shape = (Nfac,))
210
yy = np.zeros(shape=(Nfac,N))
211
xx = np.zeros(shape=(Nfac,))
212
for facloop in range(Nfac):
213
print(facloop)
214
215
fac = facoef*(16*facloop/(Nfac))*(1/(N-1))*sto/mnomega
216
ind = -1
217
for nodeloop in nodecouple.node:
218
ind = ind + 1
219
nodecouple.node[nodeloop]['coupling'] = np.zeros(shape=(lnk[ind],))
220
for linkloop in range (lnk[ind]):
221
nodecouple.node[nodeloop]['coupling'][linkloop] = fac
222
223
facval[facloop] = fac*avgdegree
224
225
omegout, yout = coupleN(nodecouple) # Here is the subfunction call for the flow
226
227
for omloop in range(N):
228
yy[facloop,omloop] = omegout[omloop]
229
230
xx[facloop] = facval[facloop]
231
232
plt.figure(2)
233
lines = plt.plot(xx,yy)
234
plt.setp(lines, linewidth=0.5)
235
plt.show()
236
237
elapsed_time = time.time() - tstart
238
print('elapsed time = ',format(elapsed_time,'.2f'),'secs')