Структуры данных и формат в Matlab против Python? - PullRequest
0 голосов
/ 23 октября 2019

Я пришел к выводу, что я просто не понимаю 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...