Python编程作图物理仿真项目进阶设计

    梁见斌

    为让学生通过仿真实践,体验使用计算机编程解决问题的全过程,掌握分支和循环等算法结构,熟练使用Python内置模块和自定义函数,理解模块化编程思想,笔者尝试使用海龟绘图模块编程来设计简单的物理仿真程序。从仿真自由落体运动、平抛运动和斜抛运动,到实现漫天烟花效果,项目难度不断进阶,最后鼓励学有余力的学生自主学习交互式操作和面向对象编程方法,获得更炫目的漫天烟花视觉效果,逐步形成了从易到难的计算思维的培养。

    项目一:绘制自由落体运动物体径迹图

    仿真技术是利用计算机并通过建立模型进行科学实验的一门多学科综合性技术。人们对现实系统进行简化和模仿,建立相关模型,并对该模型进行试验,从中得到所需的信息,然后帮助人们更好地理解现实世界。

    在物理课上,由于实验条件的限制,没有暗室操作频闪照片的实验,只能简单介绍其工作原理,学生缺乏对频闪照片的感性认识,不能准确理解物理过程。教师可以根据自由落体运动规律,使用编程绘图动态模拟运动过程,并获得相应的仿真实验照片,帮助学生理解物理规律。

    为了让学生体验使用计算机编程解决问题的全过程,教师可以将实际实验获得的频闪照片和仿真实验绘制的粒子径迹图展示给学生,先让学生分析如何抽象建模和设计算法,再编写代码和调试程序。因为本项目的重点是解析算法的应用,如果学生对绘图模块不是很熟悉,教师可以提供半成品参考代码,对绘图相关语句进行说明,学生只需填写计算坐标的核心代码。

    绘制自由落体运动粒子径迹图的算法比较简单,只需设置好初始位置坐标,然后每隔一段时间获取t时刻物体的位置坐标,并在该位置绘制一个白色小球即可。根据自由落体运动规律,小球的x坐标不变,t时间内下落高度为h=0.5*g*t*t。这是典型的解析算法,只要学生熟悉物理公式,就可以直接写出赋值语句。

    因为海龟在屏幕中移动的距离是以像素为单位,所以我们需要为下落高度乘以一个放大倍数mult,以获得合适的距离;同时考虑海龟的运动方向与y轴正方向相反,故计算y坐标的解析式为y=-0.5*g*t*t*mult。

    为了获得理想的仿真实验效果,还可以引导学生对程序进行多次调试,合理设置时间间隔、放大倍数和重力加速度等参数值。核心代码略。

    项目二:绘制平抛运动物体径迹图

    在自由落体运动的基础上,可以让学生进一步研究平抛运动。平抛运动分解为水平方向的匀速直线运动和竖直方向的自由落体运动,教师可以引导学生先绘制两个分运动的频闪照片,再处理合运动,通过对比分析3个小球的频闪照片,可以更好地理解物理模型。

    有了模拟自由落体运动的程序,模拟平抛运动的代码不难写出,只需在原有代码的基础上增加一个表示水平初速度的变量vx,并在循环体中增加计算水平位移的赋值语句x=vx*t*mult即可。核心代码略。

    项目三:绘制斜抛运动物体径迹图

    学生掌握仿真平抛运动的方法后,可以进一步扩展到斜抛运动,并使用这个例子来进行自定义函数的教学。

    一些教师在教授自定义函数时,把重点放在了语法教学上,笔者认为这是不妥当的。Python的自定义函数语法相当复杂,其形式参数就有必需参数、关键字参数、默认参数、不定长参数等多种类型,更别说各种实参的变异写法和复杂的闭包语法了。这些复杂的语法不是光靠死记硬背就能掌握的,需要多次实践的积累才能逐步理解。题目是做不完的,知识也教不完,“师傅领进门,修行靠个人”,教师主要起到引导学生入门和指明前进方向的作用,具体的知识和技能还是要靠学生自己去领悟和理解。

    笔者认为,自定义函数的教学重点应该是让学生理解模块化编程的作用,初步掌握模块化编程的方法,能够根据需要设计自定义函数(包括明确函数功能、设置参数和返回值、给出样例演示等)。其中,设计自定义函数是重中之重,需要反复练习和比较,力求达到意义明确、格式规范、表述简明的目标。

    模块化的目的是降低程序复杂度,使程序设计、调试和维护等操作简单化。利用函数,可以实现程序的模块化,使得程序设计更加简单和直观,从而提高程序的易读性和可维护性。那么本案例需要把哪些功能模块化?又如何设计函数呢?

    分析斜抛运动粒子径迹图,发现它是由一个个处在特定位置的白色小球排列而成,因此可以把绘制一组白色的斜抛运动粒子作为基本功能模块。那么,要把斜抛运动粒子径迹图绘制出来,需要明确它的哪些属性呢?(其实这里已经暗含面向对象的思想了,只不过时机未到,暂时不点破)

    教师可以引导学生从函数功能、函数名、参数表和返回值的角度逐个分析,最后整理出一份完整的函数头说明文档。参考示例略。

    项目四:同时绘制多个粒子(单个烟花)斜抛运动径迹图

    自定义函数oblique_throw()只能绘制单个粒子斜抛运动径迹图,为了实现漫天烟花的效果,先要学会同时绘制多个粒子斜抛运动径迹图的方法。

    在绘制单个粒子径迹图时,只需使用一重循环,计算出粒子在各时刻的位置坐标,并在该位置绘制一个代表该粒子的圆点即可。为了同时绘制多个粒子的径迹图,需要使用二重循环,其中外层循环控制时间,内层循环依次绘制各个粒子。

    为了对不同的粒子进行区分,需要设置3个列表v、a、c分别表示各粒子的初速度、角度和颜色信息,并通过使用随机数模块来为各个粒子设置不同的颜色和初速度等属性。

    为了实现烟花效果,需要设置合理的粒子数量、放大倍数和重力加速度值,并为每一朵烟花(粒子群)设置一支画笔,刷新每一帧画面。在绘制完该粒子群的所有图像后,还要清除画笔,让烟花消失,才能繪制另一朵烟花。

    同样,教师可以引导学生分析函数功能、函数名、参数表和返回值,整理出函数头说明文档。参考示例略。

    项目五:交互式操作和面向对象(点放漫天烟花效果)编程方法

    自定义函fireworks()虽然通过同时绘制多个粒子斜抛运动径迹图的方法,实现了放烟花的动态效果,但是它每次只能绘制一朵烟花,而且颜色不能动态变化,与实际的烟花效果还有一段距离。要想获得更绚丽的漫天烟花效果,需要使用面向对象的编程技术,构造一个烟花类,可以同时生成多个烟花实例,四处绽放,还可以采用交互方式,实现在鼠标点击处生成烟花的功能。

    面向对象编程思想更符合人类的自然思维方式,学生理解起来比较自然,可以把源代码和相关资料提供给学生,鼓励学有余力的学生课后自学,通过调整参数、修改代码,实现更为炫目的烟花效果。

    综合以上分析,上述项目从最简单的“绘制自由落体运动物体径迹图”开始,逐次增加难度,学生面对的每一次挑战都是建立在之前经验的基础上,并不顯得突兀,遵循“最近发展区”教学规律。项目一和项目二,主要学习解析算法和使用绘图模块编写物理仿真程序的基本原理,相对简单,可以在一个课时里完成教学任务;项目三和项目四,主要学习自定义函数的构造和使用方法,其中项目四还运用了列表和二重循环等难度较大的知识点,综合度较高,预计需要两个课时;项目五需要用到交互式操作和面向对象编程方法,已经超出了高中信息技术必修课的教学要求,但是趣味性比较高,而且难度也不大,可以引导学有余力的学生通过自学实现相关功能。

    苍山点题

    计算思维作为信息技术学科核心素养之一,是信息化社会中数字公民所应具备的基本素养。现在普遍的观点是在编程教学中更容易培养计算思维,计算思维培养的模式、实践与案例也是新课程教学研究中最受关注的焦点。

    第一篇文章,对计算思维内涵及其对学生发展的意义进行分析,提出计算思维的培养应夯实学生信息技术学科思想和方法基础,培养学生运用计算思维解决问题的关键能力,以简明、实操性强的教学模式来指引教师在教学中落实计算思维,并提出“不插电的计算思维”等直观教学、基于问题解决的计算思维培养以及在教学中的应用等教学策略和方法。

    第二篇文章,通过对“绘制自由落体运动物体径迹图、绘制平抛运动物体径迹图、绘制斜抛运动物体径迹图、绘制多个粒子(单个烟花)斜抛运动径迹图、交互式操作和面向对象(点放漫天烟花效果)编程方法”五个项目的进阶设计,基本可以让学生熟悉解析算法的基本特征,掌握自定义函数的基本方法,理解模块化编程和面向对象编程的基本思想。在编程实践过程中,学生还加深了对物理规律的理解,掌握了物理仿真技术的基本方法,从而可以使用编程绘图等工具去实现更多更复杂的物理仿真模型,提升计算思维水平。