通过python实现牛顿环仿真模拟
import tkinter as tk
from tkinter import messagebox
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib import gridspec
class InterferenceApp(tk.Tk):
def __init__(self):
super().__init__()
self.title("牛顿环实验")
self.geometry("1600x1800")
self.input_frame = tk.Frame(self)
self.input_frame.pack(side=tk.LEFT, fill=tk.Y, expand=False)
tk.Label(self.input_frame, text='波长(mm):', font=(None, 20)).pack(side=tk.TOP, padx=10, pady=10)
self.lam_entry = tk.Entry(self.input_frame, font=(None, 20))
self.lam_entry.pack(side=tk.TOP, padx=10, pady=10)
tk.Label(self.input_frame, text='曲率半径(mm):', font=(None, 20)).pack(side=tk.TOP, padx=10, pady=10)
self.R_entry = tk.Entry(self.input_frame, font=(None, 20))
self.R_entry.pack(side=tk.TOP, padx=10, pady=10)
self.calculate_button = tk.Button(self.input_frame, text="运行", font=(None, 20), command=self.calculate_interference)
self.calculate_button.pack(side=tk.TOP, padx=10, pady=10)
self.figure_frame = tk.Frame(self)
self.figure_frame.pack(fill=tk.BOTH, expand=True)
self.fig = plt.figure()
self.grid = gridspec.GridSpec(2, 1, height_ratios=[3, 1])
self.ax = self.fig.add_subplot(self.grid[0])
self.ax1 = self.fig.add_subplot(self.grid[1])
self.canvas = FigureCanvasTkAgg(self.fig, master=self.figure_frame)
self.canvas.draw()
self.canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=True)
def calculate_interference(self):
try:
lam = float(self.lam_entry.get()) * 1e-6 # m
R = float(self.R_entry.get()) * 1e-6 # m
ym = np.sqrt(10 * lam * R)
xs = np.linspace(-ym, ym, 1001)
ys = np.linspace(-ym, ym, 1001)
X, Y = np.meshgrid(xs, ys)
r = np.sqrt(X ** 2 + Y ** 2)
I = (np.cos(np.pi * (r ** 2 / R + lam / 2) / lam)) ** 2
B = (I / 4.0) * 255
self.ax.clear()
self.ax.pcolormesh(X, Y, B, shading='gouraud', cmap='gray')
self.ax.set_title('Interference Pattern')
self.ax.set_xlabel('X (mm)')
self.ax.set_ylabel('Y (mm)')
self.ax1.plot(r, B)
self.ax1.set_title('Intensity Distribution')
self.ax1.set_xlabel('Distance to Center (mm)')
self.ax1.set_ylabel('Grayscale Intensity')
self.canvas.draw()
except ValueError:
messagebox.showerror("Error", "Invalid input. Please enter numbers for wavelength and radius of curvature.")
if __name__ == "__main__":
app = InterferenceApp()
app.mainloop()
效果展示: