我正在制作一个交互式的伪静态波形演示,但我陷入了僵局。本质上,该项目的目标是重新创建Melde实验的一种变体,其中弦的一端由振荡器驱动,另一端以90度角连接到滑轮。在此实验的物理版本中,可以将铅丸添加到从滑轮上悬挂的杯子中,从而增加弦中的张力,直到形成驻波。
该项目并不是真正的驻波模拟,因为我没有用必要的边界条件来数值求解波动方程。相反,我正在生成入射正弦波和“反射”正弦波。在此,可以调整入射波,以使两个波之间的波向量匹配,从而产生驻波。我的目标是能够通过通过Tkinter的秤小部件来调整掉落到杯中的铅丸的数量来调谐此波。换句话说,我希望能够调整下面的屏幕快照中所示的滑块,并相应地更新(动画)波形。
我在这个论坛上发现了一些相关的问题,但它们似乎都与使用滑块的移动来更新静止绘图或使滑块自身动画化有关。就我而言,波形图已经被动画化了-已经随着时间而移动,并且我想在调整滑块时刷新动画本身。我知道我需要命令比例小部件来调用一个函数,但是我不确定在保留代码中已经存在的动画函数的同时如何执行此操作。最终,我希望能够使用比例小部件控制参数N(朝下面代码的顶部),并相应地更新动画图。
import matplotlib.pylab as plot
import numpy as np
import matplotlib.animation as animation
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import tkinter as tk
h = 3 #define nth harmonic
kval = np.pi*h/100 #wave vector from nth harmonic (1/cm)
mu = 0.001 #linear string mass density (g/cm)
g = 980 #gravitational acceleration (cm/s/s)
N = 50 #number of lead shot pellets
m = N*0.01216 #total mass of lead shot pellets (g)
A = 0.15 #wave amplitude
omega = 120 #angular wave frequency
k1 = omega*np.sqrt(mu/(m*g)) #wave vector for initial wave (1/cm)
k2 = k1*k1/kval #wave vector for 'reflected' wave (1/cm)
fig = plot.Figure()
x = np.linspace(0,100,500)
def animate(i):
line.set_ydata(A*np.sin(k1*x+omega*i) + A*np.sin(k2*x - omega*i))
return line,
main = tk.Tk()
#background text
intro = tk.Label(main,text='Add lead shot to produce a standing wave.').grid(column=0,row=0)
canvas = FigureCanvasTkAgg(fig, master=main)
canvas.get_tk_widget().grid(column=0,row=1)
ax = fig.add_subplot(111)
ax.set_xlim(0,100)
ax.set_ylim(-2,2)
line, = ax.plot(x, A*np.sin(k1*x) + A*np.sin(k2*x))
anim = animation.FuncAnimation(fig, animate, interval=50, blit=False)
horizontal = tk.Scale(main, from_=50, to=300, length=400, orient='horizontal').grid(column=0,row=2)
main.mainloop()
任何建议都将不胜感激!我是使用Tkinter的新手,所以很可能会缺少一些明显的东西。