新闻列表
咨询热线:
187 - 6397 - 2757
计算弹簧摆的最低点!
有人疑惑编程这个工具该不该这么用?这样学习编程的优势在哪?本文从编程教育的角度解答疑问。
弹簧摆最低点在哪儿?从技术角度讲,这是一个比“爸爸去哪儿了”复杂的多的任务,每次看到蹦极跳活动,立即脑补弹簧摆的最低点,总是担心那些体重偏重一点,摆动幅度过大一点的勇士,会不会有着陆的危险。
是编程课,还是物理课? 都是。海鲜馆子的龙虾三吃,生吃、煲粥、蒸煮三样吃法一起来,挺好吃。一个任务求解过程中能吃透物理、数学和编程三样学科,是正路。
归根到底。龙虾还是龙虾,弹簧摆首先还是物理问题。上个世纪中学没有电脑和编程课,遇见这道题,物理老师做好受力分析,嗯哼,接力棒就可以交给大学数学老师了,这一交棒中间就隔了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米是高精度解(微积分的思想啊,喵喵)
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年推出,可真正能读完读懂的人为数并不多(传比尔·盖茨费时几个月才读完这一卷,然后说,如果你想成为一个优秀的程序员,那就去读这个《基本算法》吧)。高对此解释道:“我知道我的书是不容易读,不过要知道的是,如果不是我精雕细琢地写的话,它们会比现在难读一百倍。”
速云少儿编程致力于 4 - 18 岁,山东少儿无人机编程教育机构,速云网络研发软件工程师授课少儿编程,教给孩子们不光要学习编程,还要结合编程知识给我们无人机写程序,实现我们无人机的自动启飞、人脸识别、智能跟随,包括更加高级的编程玩法,就是无人机编舞。可能家长想了!四岁孩子能学习无人机编程吗?那我们看个四岁的小同学吧,你自己看看能不能学习吧!
我们来看一看四岁小朋友的学习视频吧!
家长担心孩子们真的能听懂课程吗?在每节课即将结束的时候我们都会进行课程汇报展示,来看一下小童鞋的汇报成果吧!
这个时候家长可能说了,我们四岁的孩子,年龄辣么小,又不认字,那该如何学习呢?
其实四岁、五岁的孩子不认字怎么学习?只要孩子识别颜色就可以学习。通过颜色识别具体编程积木,比如:蓝色是运动、紫色是外观、黄色是事件等等,通过颜色识别文字,根据颜色先实现出程序做出卡通的效果,以激发孩子兴趣,使孩子产生兴趣后开始具体学习每个积木的作用,再学习积木上面的文字。如下图:
这个时候你还认为编程难吗?其实针对4岁起,就已经可以学习编程了。通过搭积木的方式让孩子学习编程。
当然,比如我们下面的无人机编程视频吧!
无人机能六架一起起飞?没错!那他又和数学有什么关系呢?
小云说啦!这是根据我们数学中的坐标轴的 x轴 y轴 初始化无人机位置,无人机与无人机之间的距离、架数的多少,全部需要通过精密的计算,否则无法编排出理想的造型。
现在作为家长的你!还在纠结无人机编程是否对孩子有帮助吗?
无人机编程能做什么?人脸识别?智能跟随?自动飞行?还有吗?
答案:有!那就是"无人机编舞"!不知道无人机如何编舞?快看下面我们速云小童鞋的无人机编舞吧!!
无人机编程都学习哪些内容呢?
让无人机与编程结合?
没错!就是要让孩子“动手”+“编程”实现无人机起飞。
重点培养孩子逻辑思维能力与动手操作能力,让孩子在编写无人机程序的时,无形的锻炼孩子的逻辑思维能力和前沿科技的运用能力,在飞行学习中,孩子们需了解飞机的机械结构,练习手眼协同能力,甚至自己组装飞行器;在编程中,无人机可以在三维空间中,用摄像头完成巡线、人脸识别等人工智能任务。
例如:人脸识别,智能跟随,红外线定稿,光流定位、无人机编舞等。
看我们小童鞋们上课视频吧
坦克编程都学习哪些内容呢?
动手组装”+“编写程序”
通过编程将抽象理论与实践操作合二为一,让孩子重新理解知识,体验人工智能,培养独立思考的习惯和动手解决问题的能力。
课程涉及机器人拼装、力学等数理知识,运用六类人工智能模块,编写专属的自动驾驶算法程序,让孩子更加深入理解人工智能技术。
例如:人脸识别、智能跟随等前沿技术。