프로그램
[파이썬] 사인파 곡선에서 최저, 최고점 찾기 (scipy, argrelextrema)
오디세이99
2023. 7. 27. 12:57
728x90
반응형
import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import argrelextrema
def min_max_indices(data): # 최저, 최고잠 찾기
max_indices = argrelextrema(np.array(data), np.greater)[0]
max_values = data[max_indices]
min_indices = argrelextrema(np.array(data), np.less)[0]
min_values = data[min_indices]
return max_indices, max_values, min_indices, min_values
def complex_sine_wave(amplitudes, frequencies, phases, num_samples=1000):
# 시간축 생성 (2번 반복하도록 num_samples를 두 배로 증가)
time = np.linspace(0, 4*np.pi, 2*num_samples) # 0부터 4파이까지 num_samples의 2배만큼 등간격으로 생성
# 복합 사인파 생성
complex_sine_wave = np.zeros(2*num_samples)
for amplitude, frequency, phase in zip(amplitudes, frequencies, phases):
complex_sine_wave += amplitude * np.sin(frequency * time + phase)
max_indices, max_values, min_indices, min_values = min_max_indices(complex_sine_wave)
# 그래프 그리기
plt.figure(figsize=(8, 4))
plt.plot(complex_sine_wave, label="Complex Sine Wave")
plt.plot(max_indices, max_values, 'b^', label='max') # 최고점 표시
plt.plot(min_indices, min_values, 'rv', label='min') # 최저점 표시
plt.xlabel('Time (radians)')
plt.ylabel('Amplitude')
plt.title('Complex Sine Wave')
plt.legend()
plt.grid(True)
plt.show()
if __name__ == "__main__":
amplitudes = [1.0, 0.5, 0.2, 0.3] # 사인파들의 진폭 리스트
frequencies = [1.0, 2.0, 3.0, 4.0] # 사인파들의 주파수 리스트 (1주기당 완료하는 사이클 수)
phases = [0.0, np.pi/4, np.pi/2, np.pi] # 사인파들의 위상 리스트 (시작위치)
complex_sine_wave(amplitudes, frequencies, phases)
728x90
반응형