打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
让高考物理“动”起来——弹簧篇

弹簧是高中物理中一大难点,难在弹簧弹力首先是变化的力,运动过程复杂,涉及到力学规律多,经常将弹簧与运动、能量、动量等问题结合起来,大大加深了难度,但是万变不离其宗,大家在分析弹簧过程要剖析运动规律,抓住要点,比如分析形变所对应的弹力大小和方向,进而分析物体运动状态及变化情况等,还有要抓住临界状态及条件,结合能量守恒定律进行分析。

今天我们通过一道高考典型弹簧题目,首先我们分析整个过程的运动规律,然后通过仿真验证我们的分析过程。

题目:

解答:

(1)小球1获得向右速度并脱离弹簧,之后恰好能经过导轨最高点C,那么小球在C点受到导轨的支持力为0,受力如下图所示。

可以得出重力提供向心力,即

因此,

从A点到C点,根据动能定理有

求得,

(2)由题知,碰撞后小球2以速度  水平抛出,恰好在E点处无碰撞沿斜面下滑,则小球2在E点的速度方向与水平方向成37°,且小球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=37k=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)#创建小球2ball2=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.poswhile 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 = Falseball2_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

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
UNITY2d检测方法OverlapCircle与Raycast详解 | 航行学园
On the ball不是在球上面的意思!一定别理解错了!180903
r语言文本分析主题模型文本分类文本聚类
【CSS】常用样式
Unity3D手机中Input类touch详解 | Unity3D教程手册
LoadTxt2Vec
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服