计算弹簧摆的最低点谈编程教育

原题已在8月5日发布过。有人疑惑编程这个工具该不该这么用?这样学习编程的优势在哪?本文从编程教育的角度解答疑问。

龙虾三吃的节奏

弹簧摆最低点在哪儿?从技术角度讲,这是一个比“爸爸去哪儿了”复杂的多的任务,每次看到蹦极跳活动,立即脑补弹簧摆的最低点,总是担心那些体重偏重一点,摆动幅度过大一点的勇士,会不会有着陆的危险。

原问题已在8月5日公众号发布过,篇幅不长,还惜笔墨,摆动受力分析一笔带过。一道经典物理题篇幅一半在说编程,难怪来有奔着物理来捧场的学生,有误入编程和数学老师课堂的赶脚。有点抱歉,丁大喵炖的牛肉火候未到,就出锅,有点夹生嚼不动。

是编程课,还是物理课? 都是。海鲜馆子的龙虾三吃,生吃、煲粥、蒸煮三样吃法一起来,挺好吃。一个任务求解过程中能吃透物理、数学和编程三样学科,是正路,丁大喵为此努力学习早日成为五星大厨。

归根到底。龙虾还是龙虾,弹簧摆首先还是物理问题。上个世纪中学没有电脑和编程课,遇见这道题,物理老师做好受力分析,嗯哼,接力棒就可以交给大学数学老师了,这一交棒中间就隔了3年。美国孩子高中是学微积分的,编程教育更是甩了我们从观音桥到解放碑。回过头一想,我特能理解有人拍砖来:

1、这是物理课,还是编程课,感觉都有。

2、中学生能理解微积分吗,能。

是否可行,看牛肉炖的烂不烂,龙虾三吃的点子正,先想出来,再不断实践。丁丁猫的孩子尝到编写程序的“甜头”以后,这一点非常重要,一旦尝到甜头,孩子会自发地调整自己兴趣,掌握编程工具为己所用,形成习惯自学的良性循环。

一吃是吃透物理,受力分析。加速度,速度,动能势能守恒;

二吃是吃透数学,多些直观的体验,看着慢镜头一帧一帧地分析找到起微积分的感觉;

三吃是吃透编程,机器擅长做大规模重复运算,指令是你下达,它执行;

总结一下过程,先做扎实受力分析的物理这道菜,接着数学语言精确描述物理过程,最后写好代码,计算机能看懂的指令,累活就交给了计算机,整个程序只需赋值清楚常量和各变量与时间之间的函数关系,每隔一个时间段dt计算累加结果。

孩子看到后面程序跑起瞬间得到答案,眉头紧锁到小嘴翘起。没有接触过微积分的孩子,或对微积分无感,困惑的孩子来看有启发,对微积分直观的,或许孩子借由编程这一独特的途径打开微积分兴趣之门。

有一定编程基础,孩子尝到编写程序的“甜头”课程设计中要照顾到这一阶段孩子的心理特点,会自发地调整适合自己兴趣特长,形成良性循环。

原题图示见上:在坐标系中,棕色小球质量为1kg,是附着在无质量理想弹簧的一端上的。弹簧的另一端固定在原点上。弹簧常数是10N/m,弹簧的未拉伸长度是1m。

最初小球水平地保持在空中如图所示,然后被释放,重力将其向下拉。在第一次穿越(垂直)轴时,小球下降到最低点与原点的距离有多远?

细节和假设答案以米表示小数点后保留2位,环境向下重力加速度为10米/每秒平方

有人表示想不太清楚,弹簧摆的运动轨迹?

答:脑补整个弹簧摆动是什么样的过程,可能并不能对找到答案有多大帮助。用微积分算出轨迹,舍近求远了。动能势能守恒的上方宝剑在手,就可以直奔主题。帮助大家理解,特别找到一个视频,视频看弹簧摆的轨迹有点意思,稍出乎您的意料:-)

弹簧摆的摆动轨迹不是圆,那会是什么形状?

轨迹是否与想象不同?

第一吃

为什么用编程代替微积分解?

孩子们脑补以下洗衣机、扫地机器人不知疲倦地替人干活的感人场面,你的指令就是按钮按下去,机器立即明白了严格执行。现在换成是一个弹簧摆的任务,为啥就不能将任务交给一台会计算的机器呢?

假想一个高速摄像机,将整个小球摆动的过程拍下来。1:10000的速度慢放镜头,将每隔一个“0.0001秒”暂停一下,小球位置标记下来,做受力分析,就得到如下图所示

每隔0.0001秒拍一张小球位置

到此处可以开始第一吃,物理受力分析。

万事开头难,开始龙虾要选对,选小龙虾就虾米了。常见的掉坑的姿势分析:先受力分析,编程计算每0.0001秒的速度、位移,再做求和累加

某一瞬间的受力分析

第一个坑是最低点小球位置受力分析过早祭出动能势能守恒的宝剑,容易误以为小球的最低点的向心力是2个g(2个重力加速度)

第二个坑是弹簧对小球的作用力是变量,加速度是变量,速度和位移更是变量,都在变,很容易想到用微积分,但微积分这个大杀器搞起来晕啊!

未来越来越多的问题描述需要建立起计算模型,而不只是数学模型

数学模型虽然精确,但有时难以计算...”

--《算法》作者Robert Sedgewick 斯坦福大学博士,导师为Donald E. Knuth

小球每一秒受力、加速度都能搞明白了,接下来就不知道怎么办。每隔0.0001秒计算一次受力、加速度和位移,加起来就是结果,可是... ...这活一秒钟摆动就要算10000次加减乘法,简直不是人干的啊!

每隔0.0001秒算一次,手工计算简直比罚重抄一百遍作业还悲催一百倍

编程交给机器执行大量重复运算,计算机明白怎么干吗?

对,这活本来就不是人干的,是计算机干的。

告诉计算机怎么干活,需要和交待人干活一样,你不说程序不知道你要干嘛,怎么干。二吃就是数学表达,程序里那些小学加减乘法就是受力分析。

数学描述下面小球的初始状态

小球最开始在哪?

都是谁给了它哪些力让它动起来的?

这些力的大小是变化的,还是恒定不变的?

合力有了,加速度就有了,速度也有了,位移也就有了

现在可以三吃了,上编程计算最低点位置!

第二吃

dt = 0.0001 # 时间切片step size for simulation

x = 1.00 #小球初始位置

y = 0.0000 # 小球初始位置

vx = 0# 小球初始位置

vy = 0.0000 # initial velocity

g = 10.000 # 重力加速度 acceleration due to gravity

m = 1.00 # 小球质量 mass of object

k = 10.00 # 弹簧弹性系数 spring constant

L0 = 1.00 # neutral length of springt = 0.0000

#Spring wave.py 计算弹簧摆最低点的程序

while x > 0: # 小球最低点x坐标接近0,但不能小于0,干活啥时候停手

new_t = t + dt # 每隔dt 就是0.0001秒

# 初始位置, 弹簧悬挂点为坐标原点,弹簧松弛状态下的长度为X

r = math.sqrt(x*x + y*y) #小球到原点的距离r

L = r - L0

# 小球受力分析

Fspr = -k*L # 弹簧spring拉力 OB = r 的长度是变化的

Fg = m*g

Fx = Fspr * x/r # 弹簧spring拉力在X轴的投影

Fy = Fspr * y/r + Fg # 弹簧spring拉力在Y轴的投影

# 计算小球瞬间加速度

ax = Fx/m

ay = Fy/m

# 每隔dt = 0.0001秒计算一次,计算速度和位移,结果累加

dt = new_t - t

new_vx = vx + ax*dt #每隔0.00001秒速度变化x轴方向

new_vy = vy + ay*dt #每隔0.00001秒速度变化x轴方向

new_x = x + (vx+new_vx)/2 * dt #每隔0.00001秒x轴位移

new_y = y + (vy+new_vy)/2 * dt #每隔0.00001秒y轴位移

# 累加输出最终结果

x = new_x; y = new_y

vx = new_vx; vy = new_vy

t = new_t

print(y) # Y轴最大值就是小球最低点与原点距离

3.5303845

第三吃

为了保证计算精度,程序dt时间切片是0.0001秒,执行非常快但丝毫感觉不到等待,试试更高精度:dt为0.00001,再慢十倍看dt = 0.00001 小球最低点:3.5300487416454067。可见3.53米是高精度解(微积分的思想啊,喵喵)

importmath

dt =0.0001# 时间切片step size for simulation

x =1.00#

y =0.0000# initial position

vx =

vy =0.0000# initial velocity

g =10.000# 重力加速度 acceleration due to gravity

m =1.00# 小球质量 mass of object

k =10.00# 弹簧弹性系数 spring constant

L0 =1.00# neutral length of springt =0.0000# start the timer

whilex >:

new_t = t + dt#Calculate distance to origin

r = math.sqrt(x*x + y*y)

L = r - L0

# Calculate forces

Fspr = -k*L

Fg = m*g

Fx = Fspr * x/r

Fy = Fspr * y/r + Fg

#Calculate acceleration

ax = Fx/m

ay = Fy/m

#Simple numerical integration

dt= new_t - t

new_vx = vx + ax*dt

new_vy = vy + ay*dt

new_x = x + (vx+new_vx)/2*dt

new_y = y + (vy+new_vy)/2*dt

# Get ready for the next step

x = new_x; y = new_y

vx = new_vx; vy = new_vy

t = new_t

print(y)

3.5303845

小球最低点距离O点是约为3.53米

注释:Donald E. Knuth高德纳。《算法》作者Robert Sedgewick 斯坦福大学博士,导师为Donald E. Knuth。搜到中文名来自姚储枫教授(中国香港城大计算机科学系主任,华裔图灵奖得主姚期智的夫人)。

以“高”为姓,据Knuth自述是因其个头高大,且辅音G和K读音接近;“德纳”则与“Donald”相谐,且在中文里含体面高贵之义。其时(1977年)高德纳携夫人及儿女John和与Jen正准备访问中国大陆——姚储枫给孩子也分别起了“高小强”、“高小珍”的名字,他们全家还同中国孩子在公园玩过无须语言交流的游戏。

有人视高为文艺复兴时期式的天才人物,因其不仅博学,更难得的是具超一流的动手能力——在分工日益细化,专业领域愈来愈狭窄的现代社会,这种博而专,基础与应用兼能,理论和操作并行的人才类型尤为罕见。如同一个人独力设计制造一架飞机,除了需要精通空气动力学理论,还须考虑机身上每一颗螺丝钉的固定方式,这确实不免让人想到欧洲文艺复兴时期列奥纳多·达·芬奇那样的全能巨人。

《计算机程序设计艺术》第一卷于1968年推出,可真正能读完读懂的人为数并不多(传比尔·盖茨费时几个月才读完这一卷,然后说,如果你想成为一个优秀的程序员,那就去读这个《基本算法》吧)。高对此解释道:“我知道我的书是不容易读,不过要知道的是,如果不是我精雕细琢地写的话,它们会比现在难读一百倍。”

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180910G0I7YI00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券