我正在使用Kuramoto模型进行复杂网络的同步。我写的程序运行起来很慢。大约运行了14天,仍然没有结束。总之,使用这种动态机制,随机网络中有N个节点:
d(theta)[i]/dt = K/k[i]*sum(adjancy_matrix[i,j]*sin(teta[j]-teta[i]))
theta[i]
是具有初始随机数据的每个节点的阶段。
邻接矩阵是节点之间的邻接矩阵。并且k[i]
是每个节点的顺序,最后是K=10
和dt
这种动态性使系统节点与其他节点的吸引力发生变化,直到系统进入同步系统为止。
有物理学介绍。该程序是:
import networkx as nx
import matplotlib.pyplot as plt
import numpy as np
from numpy import abs
from random import random
from time import time
from math import pi,sin,cos,exp
import cmath
start=time()
def initial_phase(graph):
phase_list=[]
for i in range(len(graph)):
phase_list.append((random()-0.5)*2*np.pi)
return np.array(phase_list)
def graph_degree(graph):
degree_list=[]
for i in range(len(G)):
degree_list.append(graph.degree(i))
return np.array(degree_list)
t_start=0;t_end=1;dt=0.1
tpoints=np.arange(t_start,t_end,dt)
G = nx.watts_strogatz_graph(10,2,0.03,seed= None)
adj_matrix=nx.adjacency_matrix(G)
def rung_kutta(graph,adjancy_matrix,teta,K,k):
list_sum=[] ; i_teta=[]
for i in range(len(graph)) :
sum_phase=0
for j in range(len(graph)):
sum_phase=sum_phase+adjancy_matrix[i,j]*np.sin(teta[j]-teta[i])
d=(cos(teta[i])+1j*sin(teta[i]))
i_teta.append(d)
list_sum.append((K/k[i])*sum_phase)
return np.array(list_sum),np.array(i_teta)
print(rung_kutta(G,adj_matrix,initial_phase(G),10,graph_degree(G)))
teta_point=[] ; r=[]
teta_0=initial_phase(G)
degree=graph_degree(G)
c=np.zeros((len(teta_0), len(teta_0)))
for t in tpoints :
teta_point.append(teta_0)
a=[];a.append(teta_0)
k1=rung_kutta(G,adj_matrix,teta_0,10,degree)[0]*dt
k2=rung_kutta(G,adj_matrix,teta_0+(k1/2),10,degree)[0]*dt
k3=rung_kutta(G,adj_matrix,teta_0+(k2/2),10,degree)[0]*dt
k4=rung_kutta(G,adj_matrix,teta_0+(k3),10,degree)[0]*dt
teta_0=teta_0+(k1+2*k2+2*k3+k4)/6
gh=sum(rung_kutta(G,adj_matrix,teta_0,10,degree)[1])
r.append(abs(gh)/len(G))
for i in range(len(c)):
for j in range(len(c)):
c[i][j]=c[i][j]+np.cos(a[0][i]-a[0][j])
print(c/len(tpoints))
print(r)
plt.plot(tpoints,r)
plt.show()
print((np.array(teta_point))[-1,:])
pco=plt.pcolor(c/len(tpoints),cmap='jet')
print(time()-start)
plt.imshow(c/len(tpoints),cmap='jet')
plt.colorbar(pco,label='Correlation')
plt.show()
我的问题是,可以并行编写此程序吗?还是有可能更高效地编写它以加快速度?
感谢您的回答。