用代码缩写胡克定律公式原理图
代码实现了以下功能:
-
交互式滑块:用户可以通过滑块调整弹簧的弹性系数(k)、拉力大小(F)和弹簧的原长(l0),实时观察弹簧的伸长和受力变化。
-
动态图像更新:随着滑块的调整,图像会动态更新,显示弹簧在不同参数下的伸长和受力情况。
-
胡克定律可视化:通过图像直观地展示胡克定律(F = k * x),即弹簧的受力与其伸长量成正比。
-
弹性极限表示:当施加的力超过弹簧的弹性极限时,图像通过颜色变化和竖直线表示,直观地展示弹簧的弹性极限。
-
详细信息标注:在图像上标注了施加的力、弹簧的伸长量以及生成时间和制作信息,提供了额外的上下文信息。
-
多子图显示:同时显示两个子图,一个表示原始弹簧状态,另一个表示施加力后的状态,方便对比。
好处包括:
-
教育意义:对于学习物理的学生,这种交互式工具可以帮助他们更好地理解胡克定律和弹簧的弹性特性。
-
实验模拟:可以作为实验模拟工具,让学生在没有实际弹簧的情况下进行虚拟实验,探索不同参数对弹簧行为的影响。
-
直观理解:通过视觉化的方式,帮助用户直观地理解抽象的物理概念,如弹性系数、拉力和弹簧伸长之间的关系。
-
灵活性:用户可以自由调整参数,观察不同情况下的物理现象,增加了学习的互动性和趣味性。
-
易于分享和使用:作为一个Python程序,可以轻松地在支持Python的环境中运行,无需额外的实验设备或材料。
-
实时反馈:提供了实时反馈机制,用户可以立即看到他们调整参数后的结果,有助于加深对物理定律的理解。
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from tkinter import Tk, Scale# 设置matplotlib支持中文显示
plt.rcParams['font.sans-serif'] = ['SimHei'] # Windows系统使用SimHei字体
plt.rcParams['axes.unicode_minus'] = False # 正确显示负号
plt.rcParams['font.size'] = 10 # 设置默认字体大小# 胡克定律:F = k * x,考虑弹性极限
def hooke_law(k, x, F_max, original_length=10):return k * x if k * x <= F_max else F_max# 创建图形和轴(只初始化一次)
class SpringApp:def __init__(self, root):self.root = rootself.root.title("胡克定律演示")# 弹性系数、拉力大小和弹簧原长self.k_var = 100.0 # 初始弹性系数,单位 N/cmself.F_max = 50 # 弹性极限,单位 Nself.original_length = 10 # 初始弹簧原长,单位 cm# 滑块设置self.k_scale = Scale(root, from_=10, to=200, orient='horizontal', label='弹性系数 (k) [N/cm]')self.k_scale.set(self.k_var)self.k_scale.pack(side='left', fill='x', expand=True, padx=10, pady=10)self.k_scale.config(command=self.update_plot)self.F_scale = Scale(root, from_=0, to=100, orient='horizontal', label='拉力大小 (F) [N]')self.F_scale.set(0)self.F_scale.pack(side='left', fill='x', expand=True, padx=10, pady=10)self.F_scale.config(command=self.update_plot)self.length_scale = Scale(root, from_=5, to=20, orient='horizontal', label='弹簧原长 (l0) [cm]')self.length_scale.set(self.original_length)self.length_scale.pack(side='left', fill='x', expand=True, padx=10, pady=10)self.length_scale.config(command=self.update_plot)# 创建图形和轴self.fig, self.axs = plt.subplots(1, 1, figsize=(10, 5))# 图形显示self.canvas = FigureCanvasTkAgg(self.fig, master=root)self.canvas.draw()self.canvas.get_tk_widget().pack(side='top', fill='both', expand=1)# 初始绘图self.update_plot()def update_plot(self, *args):self.k_var = float(self.k_scale.get())self.F_var = float(self.F_scale.get())self.original_length = float(self.length_scale.get())# 清除旧图形self.axs.cla()# 设置坐标轴self.axs.set_xlim(0, 20)self.axs.set_ylim(0, 100)self.axs.set_xlabel('弹簧长度 (cm)')self.axs.set_ylabel('力 (N)')self.axs.set_title('弹簧受力图')# 计算运动点的位置critical_length = self.original_length + 50 / self.k_var # 临界长度# 绘制力随长度变化的曲线if self.F_var <= self.F_max:x_values = np.linspace(0, self.original_length + self.F_var / self.k_var, 200)F_values = np.vectorize(hooke_law)(self.k_var, x_values - self.original_length, self.F_max, self.original_length)self.axs.plot(x_values, F_values, 'k-', label=f'F = {self.F_var:.2f} N')else:x_values = np.linspace(0, critical_length, 200)F_values = np.vectorize(hooke_law)(self.k_var, x_values - self.original_length, self.F_max, self.original_length)self.axs.plot(x_values, F_values, 'k-', label=f'F = {self.F_max} N')self.axs.plot([critical_length, critical_length], [self.F_max, self.F_var], 'r--', label='超过弹性极限')# 绘制运动点color = 'red' if self.F_var >= self.F_max else 'black'stretched_length = self.original_length + self.F_var / self.k_var if self.F_var <= self.F_max else critical_lengthpoint = self.axs.plot(stretched_length, self.F_var, 'o', color=color, label='运动点')[0]# 标注力和弹簧长度的值self.axs.text(stretched_length, self.F_var, f'{self.F_var:.2f} N\n{stretched_length:.2f} cm',horizontalalignment='left', verticalalignment='bottom')# 绘制竖直线if self.F_var >= self.F_max:self.axs.plot([critical_length, critical_length], [0, self.F_var], 'r--', label='超过弹性极限')# 标注胡克定律公式self.axs.text(0.5, 0.9, '胡克定律:F = k * x', transform=self.axs.transAxes, fontsize=12,horizontalalignment='center', verticalalignment='top', color='blue')self.axs.grid(True)self.axs.legend()self.canvas.draw()# 创建GUI
root = Tk()
app = SpringApp(root)
root.mainloop()