Я пришел к выводу, что я просто не понимаю Python так, как я думал.
после большого количества попыток в Python я попытался написать то же самое в Matlab, и это просто сработало. Мой вывод таков, что методы работы структур сильно отличаются от того, что я ожидаю, и я не вижу, в чем эта разница. Например, в python он может иметь структуру, которая выглядит как [[1], [2], [3]], а в Matlab это будет [1,2,3]. выполнение цикла над i в python даст только [1], и то же самое в Matlab будет в последовательности. Я исправил это, используя np.hstack, чтобы получить [1,2,3], поэтому я исправил эту проблему, но я подозреваю, что остальная часть моей проблемы сейчас также основана на структуре. в коде Matlab я получаю связь, и числа сходятся. Однако в моем коде на Python все они расходятся.
Есть ли большой ресурс о том, как структуры данных работают в python, это не документация по python, может быть что-то, что сравнивает структуры Matlab и Python? или кто-нибудь имеет представление о том, как я должен реструктурировать свой код Python?
РЕДАКТИРОВАТЬ: код представляет собой попытку euler интеграции связанных генераторов, где каждый генератор соединяется со всеми своими соседями
он принимает частоту w, так как это решение для константы связи K = 0, цикл проходит от каждого генератора i по каждому соседу j.
dTheta [i] - частота токаосциллятор в петле. k / N указывает силу связи на основе количества соседей, а theta [j, c] и theta [i, c] - соответственно предыдущие углы для соседа и генератора тока
, затем назначается новый угол на основена шаге интеграции частоты
в Matlab я написал следующее
%% Initialize items
k = 1; %coupling factor
N = 20 ; %Number of oscillators
tend = 10;
dt= tend/200;
t = 0:dt:tend;
theta=zeros(N,length(t));
theta(:,1)=abs(2*pi*rand(N,1));
dTheta=zeros(N,1);
w = .1.*ones(N,1); %Set the frequency of the oscillators
y = zeros(size(theta));
%% Calculations
for c=2:length(t)
dTheta=w;
for i=1:N
for j=1:N
dTheta(i)=dTheta(i)+((k/N)*sin(theta(j,c-1)-theta(i,c-1))); %Genereate delta theta.
end
end
theta(:,c)=theta(:,c-1)+(dTheta*dt); %Euler forward step
c/length(t);
end
for c=1:length(t)
y(:,c)=sin((5*t(c))+theta(:,c)); %Generate the y.
end
в Python у меня есть
import numpy as np
import matplotlib.pyplot as plt
k = 1
N = 10
tend = 20
dt = tend*4
t = np.linspace(0,tend,dt)
theta = np.zeros((N,len(t)))
theta[:,0] = 2*np.pi*abs(np.random.randint(0, high=N ,size=(N)))/10
dTheta = np.hstack(np.zeros((N,1)))
w = np.hstack(20*np.ones((N,1)))
y = np.zeros(theta.shape)
for c in range(1,len(t)):
dTheta=w
for i in range(N):
for j in range(N):
dTheta[i] = dTheta[i] + ((k/N)*np.sin(theta[j,c-1] - theta[i,c-1]))
theta[:,c] = theta[:,c-1] + (dTheta*dt)
c/len(t)
for c in range(len(t)):
y[:,c] = np.sin((5*t[c]) + theta[:,c])
plt.figure()
for c in range(N):
plt.plot(t,y[c,:])
plt.figure()
for c in range(N):
plt.plot(t,theta[c,:])
plt.show()