정보통신기술(ICT)

수리 물리학: 베셀 함수(Bessel Function)

해머슴 2024. 10. 25. 10:01
import numpy as np
import matplotlib.pyplot as plt
from scipy.special import jn, yn
import tkinter as tk
from tkinter import ttk

def plot_bessel_functions(order, x_min, x_max, num_points):
    """
    주어진 범위에서 베셀 함수(Jn, Yn)를 플로팅합니다.
   
    Parameters:
    - order: 베셀 함수의 차수 (n 값)
    - x_min: x 값의 최소 범위
    - x_max: x 값의 최대 범위
    - num_points: x 범위 내의 포인트 수
    """
    x = np.linspace(x_min, x_max, num_points)
   
    # 1종 베셀 함수 (Jn)
    jn_values = jn(order, x)
   
    # 2종 베셀 함수 (Yn)
    yn_values = yn(order, x)
   
    # 그래프 그리기
    plt.figure(figsize=(10, 6))
    plt.plot(x, jn_values, label=f'J_{order}(x)', color='blue')
    plt.plot(x, yn_values, label=f'Y_{order}(x)', color='red')
    plt.title(f'Bessel Functions of Order {order}')
    plt.xlabel('x')
    plt.ylabel('Function Value')
    plt.legend()
    plt.grid()
    plt.show()

def on_plot_button_click():
    try:
        order = int(order_entry.get())
        x_min = float(x_min_entry.get())
        x_max = float(x_max_entry.get())
        num_points = int(num_points_entry.get())
        plot_bessel_functions(order, x_min, x_max, num_points)
    except ValueError:
        error_label.config(text="올바른 값을 입력하세요.", foreground="red")

# Tkinter GUI 설정
root = tk.Tk()
root.title("베셀 함수 플로터")

# 입력 필드 생성
ttk.Label(root, text="베셀 함수의 차수:").grid(column=0, row=0, padx=5, pady=5)
order_entry = ttk.Entry(root)
order_entry.grid(column=1, row=0, padx=5, pady=5)

ttk.Label(root, text="x 최소값:").grid(column=0, row=1, padx=5, pady=5)
x_min_entry = ttk.Entry(root)
x_min_entry.grid(column=1, row=1, padx=5, pady=5)

ttk.Label(root, text="x 최대값:").grid(column=0, row=2, padx=5, pady=5)
x_max_entry = ttk.Entry(root)
x_max_entry.grid(column=1, row=2, padx=5, pady=5)

ttk.Label(root, text="포인트 수:").grid(column=0, row=3, padx=5, pady=5)
num_points_entry = ttk.Entry(root)
num_points_entry.grid(column=1, row=3, padx=5, pady=5)

# 오류 메시지 레이블
error_label = ttk.Label(root, text="")
error_label.grid(column=0, row=5, columnspan=2)

# 플로팅 버튼 생성
plot_button = ttk.Button(root, text="그래프 그리기", command=on_plot_button_click)
plot_button.grid(column=0, row=4, columnspan=2, pady=10)

# GUI 실행
root.mainloop()