После внесения очевидных исправлений и дополнений в ваш код я смог его запустить.Это не было на самом деле в бесконечном цикле, это было просто очень медленно.Вы можете значительно улучшить производительность, максимально «векторизовав» свои расчеты.Это позволяет вычислять циклы в C-коде, а не в Python.Намек на то, что есть место для значительных улучшений, содержится в выражении sum over j from 0 to 399[J(i,j)*r(j)]
.Это еще один способ выразить произведение матрицы J и вектора r.Таким образом, в коде должно быть что-то вроде J @ r
, а не все эти явные циклы Python.
После некоторой дополнительной настройки, вот модифицированная версия вашего кода.Это значительно быстрее, чем оригинал.Я также немного реорганизовал и добавил график.
import numpy as np
from scipy.integrate import odeint
import matplotlib.pyplot as plt
def computeIJ(N):
i = np.arange(N)
theta = (2*np.pi)*i/N
I0 = 0.5
I1 = 0.001
I = I0 + I1*np.cos(theta)
J0 = 0.5
J1 = 2.5
delta_theta = np.subtract.outer(theta, theta)
J = J0 + J1*np.cos(delta_theta)
return I, J / N
def vectors2(r, t, I, J):
s = J @ r
drdt = -r + np.maximum(I + s, 0)
return drdt
N = 400
I, J = computeIJ(N)
np.random.seed(123)
r0 = np.random.rand(N)
t = np.linspace(0, 20, 1000)
r = odeint(vectors2, r0, t, args=(I, J))
for i in [0, 100, 200, 300, 399]:
plt.plot(t, r[:, i], label='i = %d' % i)
plt.xlabel('t')
plt.legend(shadow=True)
plt.grid()
plt.show()
Вот график, сгенерированный скриптом: