弹簧是高中物理中一大难点,难在弹簧弹力首先是变化的力,运动过程复杂,涉及到力学规律多,经常将弹簧与运动、能量、动量等问题结合起来,大大加深了难度,但是万变不离其宗,大家在分析弹簧过程要剖析运动规律,抓住要点,比如分析形变所对应的弹力大小和方向,进而分析物体运动状态及变化情况等,还有要抓住临界状态及条件,结合能量守恒定律进行分析。
今天我们通过一道高考典型弹簧题目,首先我们分析整个过程的运动规律,然后通过仿真验证我们的分析过程。
题目:
解答:
(1)小球1获得向右速度并脱离弹簧,之后恰好能经过导轨最高点C,那么小球在C点受到导轨的支持力为0,受力如下图所示。
可以得出重力提供向心力,即
因此,
从A点到C点,根据动能定理有
求得,
(2)由题知,碰撞后小球2以速度
根据平抛运动规律,水平方向做匀速直线运动,竖直方向做自由落体运动,可以得出
联立求得
(3)小球1在与小球2发生弹性碰撞前,设小球1速度为
小球1与小球2发生弹性碰撞瞬间,根据动量定理,有
根据能量守恒定律,有
由题知,
联立求得,
以上为求解过程,下面我们通过Python语言进行仿真,将小球受到弹簧作用、变速圆周运动、小球之间发生碰撞以及平抛运动等动态过程呈现出来,以便大家能够更加理解整个过程。
详细代码如下:
from vpython import *
#定义画布
scene=canvas( width=1520,height=400,background=color.white,center=vector(4,-0.5,0))
label(pos= vector(5,0.5, 0), text = '寒江钓雪',height=20,color = color.black,box=False,opacity=0)
natural_length=1 #设置弹簧原长
ball_radius = 0.05 #设置小球的半径
R=0.3 #圆形轨道半径
length_earth1=3 #与弹簧接触的地面长度
h=1.5 #竖直墙高度
length_earth2=4 #小球2落地后的地面长度
distance_DE=135/16*R #D点与E点之间的水平距离,为了满足(2)(3)问题
height_E=h-405/128*R #E点高度,为了满足(2)(3)问题
theta=37
k=10 #弹簧劲度系数
m1=0.3 #小球1的质量
m2=m1/3 #小球2的质量
g=vector(0,-10,0) #设置重力加速度
init_length=natural_length-sqrt(5*m1*mag(g)*R/k) #设置弹簧压缩后的长度
EPE=0 #设定重力势能
#创建固定弹簧的竖直基座
base_spring=box(pos=vector(0,0.1,0),axis=vector(1,0,0),size=vector(0.01,0.2,0), color=color.black)
#创建小球
ball1=sphere(pos=vector(init_length,ball_radius,0),radius=ball_radius,color=color.blue)
#创建小球2
ball2=sphere(pos=vector(length_earth1,ball_radius,0),radius=ball_radius,color=color.red,make_trail=True)
#创建弹簧
spring=helix(pos=vector(0.03,ball_radius,0),axis=vector(1,0,0),radius=ball_radius/2,coils=20,length=init_length,thickness=0.005,color=color.yellow)
#创建与弹簧接触的水平地面
earth0=box(pos=vector(length_earth1/2,0,0),axis=vector(1,0,0),size=vector(length_earth1,0.01,0.01),color=color.black)
#创建圆形轨道
ring=ring(pos=vector(length_earth1*2/3,R,0),axis=vector(0,0,-1),radius=R,color=color.black, thickness=0.005)
#创建竖直墙壁
wall=box(pos=vector(length_earth1,-h/2,0),axis=vector(1,0,0),size=vector(0.01,h,0),color=color.black)
#创建小球2落地后的地面
earth1=box(pos=vector(length_earth1+length_earth2/2,-h,0),axis=vector(1,0,0),size=vector(length_earth2,0.01,0.01),color=color.black)
#创建三角形的高
triangle_h=box(pos=vector(length_earth1+distance_DE,-h+height_E/2,0),axis=vector(1,0,0),size=vector(0.01,height_E,0),color=color.black)
#创建三角形的斜边
hypotenuse=box(pos=vector(length_earth1+distance_DE+height_E/tan(theta * pi / 180)/2,-h+height_E/2,0),axis=vector(height_E/tan(theta * pi / 180),-height_E,0),size=vector(height_E/sin(theta * pi / 180),0.01,0),color=color.black)
scene.autoscale=0 #禁止画面自动缩放
g1=graph(width=400,height=280,title='能量随时间变化关系',xtitle='时间/s',ytitle='能量/J',align='left' , xmin=0, xmax=0.3 , ymin=0, ymax=2.5) #定义曲线显示窗口
EKcurve=gcurve(color=color.red,graph=g1,label='动能') #定义动能曲线
EPcurve=gcurve(color=color.blue,graph=g1,label='弹性势能') #定义弹性势能曲线
Ecurve=gcurve(color=color.black,graph=g1,label='机械能') #定义系统机械能曲线
g2=graph(width=400,height=280,title='小球速度随时间变化关系',xtitle='时间/s',ytitle='速度/m/s',align='left', xmin=0, xmax=2.2 , ymin=0, ymax=10) #定义曲线显示窗口
V1curve=gcurve(color=color.blue,graph=g2,label='小球1速度') #定义小球1动能曲线
V2curve=gcurve(color=color.red,graph=g2,label='小球2速度') #定义小球2动能曲线
EK_label=label(text='动能',height=20,opacity=0,box=False) #定义小球动能标签
EP_label=label(text='弹性势能',height=20,opacity=0,box=False) #定义弹性势能标签
E_label=label(text='系统机械能',height=20,opacity=0,box=False) #定义系统机械能标签
ball1.v = vector(0,0,0) #设置小球1初始速度
ball1.a = vector(0,0,0) #设置小球1初始加速度
ball2.v = vector(0,0,0) #设置小球2初始速度
ball2.a = vector(0,0,0) #设置小球2初始加速度
t=0 #设置时间变量
dt=0.0001 #设置时间间隔
rateValue=2000 #设置每秒循环次数
#小球未脱离弹簧前
while ball1.pos.x < natural_length:
rate(rateValue) # 设置每秒循环次数
spring.length = ball1.pos.x
delta_length = spring.length-natural_length
F = -k*delta_length #计算弹簧弹力
ball1.a.x = F/m1
ball1.v += ball1.a*dt
ball1.pos += ball1.v*dt
EP = 0.5 * k * delta_length ** 2 # 计算弹簧弹性势能
EK = 0.5 * m1 * (mag(ball1.v)) ** 2 # 计算小球动能
E = EK + EP # 计算系统机械能
EK_label.pos = vector(ball1.pos.x+0.2, ball1.pos.y-0.2, ball1.pos.z) # 设置动能标签位置
EK_label.text = '动 能=' + str('%.2f' % EK) # 设置动能标签显示内容
EP_label.pos = vector(EK_label.pos.x - 0.05, EK_label.pos.y - 0.2, EK_label.pos.z) # 设置弹性势能标签位置
EP_label.text = '弹性势能=' + str('%.2f' % EP) # 设置弹性势能标签显示内容
E_label.pos = vector(EK_label.pos.x + 0.02, EK_label.pos.y - 0.4, EK_label.pos.z) # 设置系统机械能标签位置
E_label.text = '机械能=' + str('%.2f' % E) # 设置系统机械能标签显示内容
EKcurve.plot(t, EK) # 绘制动能曲线
EPcurve.plot(t, EP) # 绘制弹性势能曲线
Ecurve.plot(t, E) # 绘制系统机械能曲线
V1curve.plot(t, mag(ball1.v)) # 绘制小球1速度曲线
V2curve.plot(t, mag(ball2.v)) # 绘制小球2速度曲线
t += dt
#小球脱离弹簧后
while ball1.pos.x < ring.pos.x:
rate(rateValue) # 设置每秒循环次数
ball1.pos += ball1.v*dt
V1curve.plot(t, mag(ball1.v)) # 绘制小球1速度曲线
V2curve.plot(t, mag(ball2.v)) # 绘制小球2速度曲线
t += dt
#小球做圆周运动
theta_ring=180 #滑块绕圆环角度
#设置小球1底部坐标在圆环上
ball1.bottom = vector(ball1.pos.x,0,0)
omega=mag(ball1.v)/R
init_BO=ring.pos-ball1.bottom #向心半径,从B点指向圆心
while(theta_ring >= 0.5):
rate(rateValue) # 设置每秒循环次数
BO=ring.pos-ball1.bottom
an=mag(ball1.v)**2/(R)*norm(BO)
at=g-dot(g,an)/mag(an)**2*an
ball1.a=an+at
ball1.v += ball1.a * dt #计算小球1速度矢量更新值
ball1.bottom += ball1.v * dt #计算小球1底部位置矢量更新值
ball1.pos = ball1.radius*norm(BO)+ball1.bottom
if(ball1.bottom.x < length_earth1*2/3):
theta_ring = diff_angle(init_BO,BO)*180/pi
V1curve.plot(t, mag(ball1.v)) # 绘制小球1速度曲线
V2curve.plot(t, mag(ball2.v)) # 绘制小球2速度曲线
t += dt
#小球1与小球2发生碰撞
# 根据计算我们可得出小球1碰撞后速度为0.5*v1_碰撞前
# 小球2碰撞后速度为1.5*v1_碰撞前
#distance_two_ball = ball2.pos - ball1.pos
while mag(ball2.pos - ball1.pos) - 2*ball_radius > 0:
rate(rateValue) # 设置每秒循环次数
ball1.pos += ball1.v * dt
if(mag(ball2.pos - ball1.pos) - 2*ball_radius <= 0.01):
ball2.v = 1.5*ball1.v
ball1.v = 0.5 * ball1.v
break
V1curve.plot(t, mag(ball1.v)) # 绘制小球1速度曲线
V2curve.plot(t, mag(ball2.v)) # 绘制小球2速度曲线
t += dt
attach_trail(ball1, color=color.blue) #显示小球1的轨迹
#小球1与小球2发生碰撞后,小球2做平抛运动
while ball2.pos.x <= triangle_h.pos.x:
rate(rateValue) # 设置每秒循环次数
ball2.v += g * dt
ball2.pos += ball2.v * dt
ball1.v += g * dt
ball1.pos += ball1.v * dt
V1curve.plot(t, mag(ball1.v)) # 绘制小球1速度曲线
V2curve.plot(t, mag(ball2.v)) # 绘制小球2速度曲线
t += dt
#当小球1和小球2都落地以后,程序才能停止
ball1_stop = False
ball2_stop = False
while True:
rate(rateValue) # 设置每秒循环次数
if(ball2.pos.x > triangle_h.pos.x and ball2.pos.y - earth1.pos.y > ball_radius):
ball2.a.x = mag(g) * sin(theta * pi / 180) * cos(theta * pi / 180)
ball2.a.y = -mag(g) * sin(theta * pi / 180) ** 2
ball2.v += ball2.a * dt # 计算滑块速度矢量更新值
ball2.pos += ball2.v * dt # 计算滑块位置矢量更新值
if(ball2.pos.y - earth1.pos.y < ball_radius):
ball2_stop = True
if(ball1.pos.y - earth1.pos.y > ball_radius):
ball1.v += g * dt
ball1.pos += ball1.v * dt
if (ball1.pos.y - earth1.pos.y < ball_radius):
ball1_stop = True
if(ball2_stop == True and ball1_stop == True):
break
V1curve.plot(t, mag(ball1.v)) # 绘制小球1速度曲线
V2curve.plot(t, mag(ball2.v)) # 绘制小球2速度曲线
t += dt
程序运行结果为:
通过仿真不仅可以清晰地看到小球的运动过程,并且结合“能量随时间变化关系图”、“速度随时间变化关系图”,我们可以得出以下结论:
1、弹簧做功的过程中,机械能守恒的(图上显示的一条恒定的直线),弹簧的弹性势能转化为小球的动能;
2、小球1做圆周运动过程中,发现刚进入圆环、与刚出圆环,速度大小相等,说明重力势能做功与路径无关,势能增量为0,动能也保持不变。
3、从“速度随时间变化关系图”中,我们可以得出碰撞瞬间,速度发生突变。
4、从图中我们看到小球1和小球2同时落地,与质量无关,这也说明了在竖直方向上,小球做的自由落体运动,当两个小球高度一样时,将会同时落地。而水平方向做的匀速直线运动,水平方向上的位移与初速度有关。
END
联系客服