Двойное интегрирование дискретных данных по времени

Допустим, у меня есть набор точек данных с именем signal, и я хочу дважды интегрировать его по времени (т. е. если signal было ускорением, я хотел бы интегрировать его дважды по времени, чтобы получить положение). Я могу интегрировать его один раз, используя simps, но результат здесь скалярный. Как вы можете численно интегрировать (случайный) набор данных дважды? Я бы предположил, что это будет выглядеть примерно так, но очевидно, что входные данные несовместимы после первой интеграции.

n_samples = 5000
t_range = np.arange(float(n_samples))
signal = np.random.normal(0.,1.,n_samples)
signal_integration = simps(signal, t_range)
signal_integration_double = simps(simps(signal, t_range), t_range)

Любая помощь будет оценена по достоинству.


person Community    schedule 19.06.2018    source источник


Ответы (2)


Извините, что ответил слишком быстро. scipy.integrate.simps укажите значение интегрирования в указанном вами диапазоне, аналогично np.sum(signal).

Что вам нужно, так это интеграция между началом и каждой точкой данных, что и делает cumsum. Лучшим методом может быть scipy.integrate.cumtrapz. Вы можете применить любой метод дважды, чтобы получить желаемый результат.

См.:
https://docs.scipy.org/doc/scipy/reference/generated/scipy.integrate.simps.html
https://docs.scipy.org/doc/scipy/reference/generated/scipy.интегрировать.cumtrapz.html

Исходный ответ:
Я думаю, вы хотите np.cumsum. Интеграция дискретных данных — это просто сумма. Вы должны умножить результат на значение шага, чтобы получить правильный масштаб.

См. https://docs.scipy.org/doc/numpy-1.14.0/reference/generated/numpy.cumsum.html

person J. Martinot-Lagarde    schedule 19.06.2018
comment
Разве это не должно быть просто np.sum(signal)*dt для одиночной интеграции и, предположительно, np.sum(signal)*dt**2 для двойной интеграции? Зачем использовать np.cumsum? - person ; 20.06.2018
comment
Формула интегрирования будет выглядеть примерно так: signal_integration = [sum(signal[:i]) for i in range(n_samples)]. Это то, что вычисляет cumsum, но более эффективно. - person J. Martinot-Lagarde; 21.06.2018

При частичной интеграции вы получаете от y''=f до

y(t) = y(0) + y'(0)*t + integral from 0 to t of (t-s)*f(s) ds

Поскольку вы, кажется, предполагаете, что y(0)=0, а также y'(0)=0, вы можете получить желаемое интегральное значение за одно интегрирование как

simps((t-t_range)*signal, t_range)
person Lutz Lehmann    schedule 22.06.2018