Я много симулирую с python, симулирую системные ответы.
В настоящее время я использую схему Рунге-Кутты, но наткнулся на другую схему, которую я тестировал.
При тестировании в Matlab я достигаю исключительной производительности по сравнению с моей Runge-Kutta. Однако когда я перенес это в Python, это было значительно медленнее.
Я не уверен, так ли это, или я мог бы улучшить свой способ кодирования, поэтому я хотел бы услышать некоторые ваши отзывы, если это возможно.
Код в Matlab, пример:
dt = 0.0001;
f = randn(1, (60 / dt));
ns = length(f);
yo = zeros(3,1);
P1 = [0; 0.001; 0];
F = [1 0.0001 0; 0.001 1 0.0001; 0.001 0 1];
y1 = zeros(3, ns);
tic
for i = 1:ns
y1(:, i) = P1*f(:, i) + F*yo;
yo = y1(:, i);
end
toc
В котором цикл выполняется за 0,55-0,61 сек.
Код на Python, пример:
dt = 0.0001
f = np.random.randn(1, int(60 / dt))
ns = np.size(f)
yo = np.zeros((3))
F = np.array([[1, 0.0001, 0], [0.001, 1, 0.0001], [0.001, 0, 1]])
P1 = np.transpose(np.array([[0, 0.0001, 0]]))
y1 = np.zeros((3, ns), order='F')
start_time = time.time()
for i in range(ns-1):
y1[:, i] = np.dot(P1, f[:, i]) + np.reshape(np.dot(F, yo), (3))
yo = y1[: , i]
print("--- %s seconds ---" % (time.time() - start_time))
В котором цикл выполняется за 2,8 -3,1 с.
Могу ли я сделать что-нибудь, чтобы улучшить это?
Спасибо за рассмотрение моего вопроса.