정보통신기술(ICT)

조화진동자 함수 그래프

해머슴 2024. 10. 18. 13:38
import tkinter as tk
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import matplotlib.pyplot as plt
import numpy as np

# 함수 정의
def plot_graph():
    # 사용자 입력값 가져오기
    frequency = float(entry_frequency.get())
    amplitude = float(entry_amplitude.get())
    phase_shift = float(entry_phase.get())
    time_end = float(entry_time.get())

    # 시간 배열 생성
    t = np.linspace(0, time_end, 1000)

    # 사인과 코사인 함수 계산
    sine_wave = amplitude * np.sin(2 * np.pi * frequency * t + phase_shift)
    cosine_wave = amplitude * np.cos(2 * np.pi * frequency * t + phase_shift)

    # 그래프 초기화
    ax.clear()
    ax.plot(t, sine_wave, label='Sine Wave')
    ax.plot(t, cosine_wave, label='Cosine Wave')
    ax.set_title('Harmonic Oscillator: Sine and Cosine Waves')
    ax.set_xlabel('Time')
    ax.set_ylabel('Amplitude')
    ax.legend()
    ax.grid()

    # 그래프 업데이트
    canvas.draw()

# Tkinter 윈도우 생성
root = tk.Tk()
root.title("Harmonic Oscillator Plotter")

# 입력값을 받을 수 있는 UI 구성
tk.Label(root, text="Frequency (Hz)").grid(row=0, column=0)
entry_frequency = tk.Entry(root)
entry_frequency.grid(row=0, column=1)
entry_frequency.insert(0, "1.0")

tk.Label(root, text="Amplitude").grid(row=1, column=0)
entry_amplitude = tk.Entry(root)
entry_amplitude.grid(row=1, column=1)
entry_amplitude.insert(0, "1.0")

tk.Label(root, text="Phase Shift (radians)").grid(row=2, column=0)
entry_phase = tk.Entry(root)
entry_phase.grid(row=2, column=1)
entry_phase.insert(0, "0.0")

tk.Label(root, text="Time End (seconds)").grid(row=3, column=0)
entry_time = tk.Entry(root)
entry_time.grid(row=3, column=1)
entry_time.insert(0, "10.0")

# 그래프 플롯 버튼 추가
plot_button = tk.Button(root, text="Plot", command=plot_graph)
plot_button.grid(row=4, column=0, columnspan=2)

# Matplotlib Figure 생성
fig, ax = plt.subplots()
canvas = FigureCanvasTkAgg(fig, master=root)
canvas.get_tk_widget().grid(row=5, column=0, columnspan=2)

# Tkinter 메인 루프 시작
root.mainloop()