Нахождение периодов сюжета - PullRequest
0 голосов
/ 29 апреля 2020

Я построил фигуру, содержащую 3 разных графика, представляющих положение 3 разных масс в некотором временном диапазоне. Я хочу найти период каждого. Я не знаком с функцией FFT, с которой я столкнулся, когда искал способы найти период в Интернете. Как я go об этом? Ниже приведено ядро ​​для сюжета и рисунка; Я не буду включать код, используемый для построения всех этих переменных, поскольку он будет довольно обширным.

Я знаю, что код просто начинает создавать вертикальные линии, а затем оценивать на глаз, но я бы предпочел сделать это через кодирование, чем с этим методом.

#using the times in days
T9 = 500
dt9 = 0.5
num9 = T9/dt9
times9 = np.linspace(0, T9, num9)
xpos_q9_m1_AU_new = xpos_q9_m1_AU[:-1]
xpos_q9_m2_AU_new = xpos_q9_m2_AU[:-1]
xpos_q9_m3_AU_new = xpos_q9_m3_AU[:-1]
plt.plot(times9, xpos_q9_m1_AU_new)
plt.plot(times9, xpos_q9_m2_AU_new)
plt.plot(times9, xpos_q9_m3_AU_new)
plt.xlabel('Time (days)')
plt.ylabel('X Positions (AU)')
plt.title('X Position of the Kepler 16 System over Time')
plt.legend(['Body 1', 'Body 2', 'Body 3'])
plt.savefig('q9_plot.png');

X Position of Masses over Time

1 Ответ

0 голосов
/ 04 мая 2020

То, что вы ищете, это преобразование Фурье . Эта функция определяет, какие частоты составляют волну. Scipy имеет модуль, который делает это для вас приятно:

from scipy.fft import fft
# Number of sample points
N = 600
# sample spacing
T = 1.0 / 800.0
x = np.linspace(0.0, N * T, N)
y = np.sin(50.0 * 2.0 * np.pi * x)
yf = fft(y)
xf = np.linspace(0.0, 1.0 / (2.0 * T), N // 2)
import matplotlib.pyplot as plt
plt.plot(xf, 2.0 / N * np.abs(yf[0:N // 2]))
plt.grid()
plt.show()

Frequency distribution of np.sin(50.0 * 2.0 * np.pi * x) showing spike at 50

Это дает вам график, показывающий прогнозируемую частоту .

...