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

网友投稿 2018-09-08 13:37

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

龙虾三吃的节奏

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

https://cdn.china-scratch.com/timg/180910/133FQb7-0.jpg

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

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

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

轨迹是否与想象不同?

第一吃 

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

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

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

https://cdn.china-scratch.com/timg/180910/133FSK0-1.jpg

每隔0.0001秒拍一张小球位置

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

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

https://cdn.china-scratch.com/timg/180910/133FU610-2.jpg

某一瞬间的受力分析

第一个坑是最低点小球位置受力分析过早祭出动能势能守恒的宝剑,容易误以为小球的最低点的向心力是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米是高精度解(微积分的思想啊,喵喵)

import math
dt = 0.0001  # 时间切片step size for simulation
x = 1.00  #
y = 0.0000  # initial position
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 # start the timer
while x > 0:
   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年推出,可真正能读完读懂的人为数并不多(传比尔·盖茨费时几个月才读完这一卷,然后说,如果你想成为一个优秀的程序员,那就去读这个《基本算法》吧)。高对此解释道:“我知道我的书是不容易读,不过要知道的是,如果不是我精雕细琢地写的话,它们会比现在难读一百倍。”

--end--

声明:本文章由网友投稿作为教育分享用途,如有侵权原作者可通过邮件及时和我们联系删除:freemanzk@qq.com