Больше скорости в питоне - PullRequest
0 голосов
/ 10 ноября 2018

Я работаю над синхронизацией сложных сетей с использованием модели 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 s

эта динамика заставляет узлы системы изменяться в притяжении с другими узлами, пока система не перейдет в синхронизированную систему.

Было введение в физику. Программа:

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()

Мой вопрос таков: возможно ли написать эту программу параллельно? или можно написать его более эффективным, чтобы ускорить его?

Спасибо за ваши ответы.

...