Matlab课程中绘图功能趣味教学设计——以绘制“冰墩墩”为例
作者: 卫泽刚 张小丹 赵军娣 刘飞 钱郁
摘要:在Matlab基本绘图方法教学中,很多教师可能会根据教科书内容采用按部就班的策略演示绘图相关命令及绘图结果,教学模式主要为“单向输入式”,而非“双向互动式”,师生之间缺少交流互动,学生处于被动的学习接受地位,缺少积极主动性。为提高学生学习兴趣,结合当前冬奥会吉祥物“冰墩墩”二维平面图,通过查找相关资料,发现冰墩墩二维平面图主要是由多个椭圆、圆形、圆角矩阵以及不同线条颜色组合填充而成,为此,可在学习Matlab绘图功能时通过分步绘制冰墩墩二维图完成课堂教学。以绘制冰墩墩为切入点,使学习形式变得生动有趣,迅速激发学生们的学习兴趣,提高学生学习主动性。
关键词:Matlab;趣味教学;教学设计;绘图方法;程序设计
中图分类号:TP311 文献标识码:A
文章编号:1009-3044(2022)23-0155-04
1 引言
Matlab是一门编程语言,同时也是一种强有力的科学计算软件[1],主要适用于矩阵运算及数据分析,在工学专业中有着非常广泛的应用,如数值计算、人工智能、机器学习、算法仿真、科学绘图等[2]。其中绘图功能是Matlab的一大“强项”,可以很方便地通过Matlab绘制图形对计算结果进行可视化展示,绘图操作简单,易于学习[3]。在Matlab基本绘图方法章节的教学中,教师通常会先根据多媒体课件演示绘图相关命令及其绘图效果,然后给同学们解释绘图的相关命令,再对绘图命令中的参数及代码进行详细讲解,有时还要对程序中的关键代码反复强调等等。这些传统的Matlab绘图教学方法都是根据教科书内容采用按部就班的策略,主要教学内容是Matlab的绘图语法、绘图函数及参数的使用方法。教学模式主要为“单向输入式”,而非“双向互动式”,课堂索然乏味、师生之间缺少交流互动,因此学生在发现问题、分析问题及解决问题方面有所欠缺[4]。同时,在这种照本宣科式的教学过程中,学生处于被动的学习接受地位,不利于激发学生的主观能动性和创新能力的培养。这样被动式学习造成的后果是课堂上很多学生没有学习兴趣,听课积极性不高,不仅在一定程度上影响了教学质量,也助长了不良学风。
所谓兴趣是最好的老师,如果学生有主动学习的兴趣,教师就能充分发挥学生在学习过程中的积极性和主动性,营造轻松和谐的学习氛围[5],对学习效果会起到事半功倍的效果。当前北京冬奥会吉祥物“冰墩墩”由于其外表胖乎乎、圆滚滚、萌哒哒的外表,获得了全民追捧,迅速成为全球焦点。根据相关调查研究,94.11%的受访大学生表示喜爱冰墩墩造型[6]。冰墩墩平面二维图是由一系列曲线绘制组合而成。因此,结合当前冰墩墩热点,如果在学习Matlab绘图功能时通过绘制冰墩墩二维图完成课堂教学,可以使学习内容变得生动有序,迅速激发学生们的学习兴趣,培养学生主动学习的能力。
2 冰墩墩二维绘图教学设计
教学设计是根据课程目标要求和教学对象特点而设计的教学文本,是课堂教学的设想和计划。教学设计同时也是将各种教学要素有序、合理地进行安排,形成教学方案的过程。教学设计一般包括教学目标、教学重难点、教学方法、教学步骤与时间分配等环节。笔者所在学校为地方二本高校,Matlab课程授课对象为大二学生,授课时间一般为大二上学期或下学期,学生在大一时期已经完成了C语言相关课程的学习,虽然具备了相关计算机基础知识,但大多数学生并未接触过用编程语言科学绘图的相关知识,日常课程学习过程中也没有遇到科学绘图的相关需求,更没有跟着导师参与科研绘图的经历。因此,通过本课程学习Matlab绘图功能有可能是绝大多数学生第一次使用专业软件来绘图。鉴于此,进行Matlab绘图教学设计时,需要根据学生实际情况,把绘图命令分解成为几个简单的子问题,分而治之进行讲解,最后又进行合成,让学生从整体与细节上,掌握Matlab绘图功能。
2.1 教学目标
Matlab绘图功能教学目标:掌握Matlab基本绘图相关命令,如gca、hold、plot、fill命令及其相关参数用法。
2.2 教学重难点
Matlab绘图功能教学重难点:Matlab基本绘图命令及其使用方法,绘图过程中显示效果与绘图相关参数之间的对应关系。
2.3 教学方法设计
结合多媒体演示讲解Matlab相关绘图命令及作用,学生可以直观感受绘图函数相关功能,从教学的角度出发,通过查找相关资料(https://mp.weixin.qq.com/s/Wj8YXN_fyaw1WFxPsnMrmQ),结合Matlab软件,最大限度降低绘图复杂度,发现冰墩墩二维平面图主要是由多个椭圆、圆形、圆角矩阵以及不同线条颜色组合填充而成,如图1所示。主要部位分析如下:
(1)冰晶外壳、耳朵、手掌、脚掌、眼圈、嘴巴、鼻子均为椭圆形状,其中脚掌、鼻子为半椭圆形状,左掌心有一颗桃心形形状;
(2)腿部为圆角矩形形状;
(3)胳膊由与手掌相切的直线组成;
(4)面罩由五个不同颜色的椭圆组成;
(5)眼睛与肚子上的奥运五环为圆形形状;
(6)“BEIJING 2022”为字符串。
根据以上各部位的形状分析及多媒体展示,可使学生对冰墩墩二维平面完整图与分解图有一个直观印象,通过拆分讲解达到将复杂问题简单化的目的。如果让学生直接绘制每个分解图的形状有很大的难度,这涉及坐标值选取、椭圆参数,绘图位置等这些精确数值。因此,本次课堂教学不要求学生编写绘图代码及求解绘图参数,而是直接提供绘图程序,让学生根据现有代码学习相关绘图命令及相关参数。
2.4 教学步骤
开始讲授绘图时,先不直接讲授绘图命令及相关参数,而是直接向学生展示完整程序,采用先绘图、后讲解的方法完成教学目的。绘制冰墩墩的完整参考程序及其相关注释信息如下:
function bingdundun
% 创建二维坐标绘图面板
ax=gca;
ax.DataAspectRatio=[1 1 1];
ax.XLim=[-5 5];
ax.YLim=[-5 5];
hold(ax,'on')
% 绘制冰晶外壳轮廓
[X,Y]=getEllipse([0,0],[1,0;0,1.3],3.17^2,200); %冰晶外壳椭圆参数
plot(X,Y,'Color',[57,57,57]./255,'LineWidth',1.8); %画出冰晶外壳
% 绘制耳朵轮廓
[X,Y]=getEllipse([1.7,2.6],[1.2,0;0,1.8],.65^2,200); %耳朵椭圆参数
plot(X,Y,'Color',[57,57,57]./255,'LineWidth',1.8); %画左耳
plot(-X,Y,'Color',[57,57,57]./255,'LineWidth',1.8); %画右耳(与左耳对称)
[X,Y]=getEllipse([1.7,2.6],[1.2,0;0,1.8],.6^2,200);
fill(X,Y,[1,1,1],'EdgeColor',[1,1,1],'LineWidth',1.8); %填充右耳
fill(-X,Y,[1,1,1],'EdgeColor',[1,1,1],'LineWidth',1.8); %填充左耳
% 绘制手掌轮廓
[X,Y]=getEllipse([-3.5,-1],[1.1,.3;.3,1.1],.75^2,200); %右手掌椭圆参数
plot(X,Y,'Color',[57,57,57]./255,'LineWidth',1.8); %画右手掌
[X,Y]=getEllipse([-3.5,-1],[1.1,.3;.3,1.1],.68^2,200);
fill(X,Y,[1,1,1],'EdgeColor',[1,1,1],'LineWidth',1.8); %填充右手掌
[X,Y]=getEllipse([3.5,1],[1.1,.3;.3,1.1],.75^2,200); %左手掌椭圆参数
plot(X,Y,'Color',[57,57,57]./255,'LineWidth',1.8); %画左手掌
[X,Y]=getEllipse([3.5,1],[1.1,.3;.3,1.1],.68^2,200);
fill(X,Y,[1,1,1],'EdgeColor',[1,1,1],'LineWidth',1.8); %填充左手掌
% 绘制胳膊轮廓
X=[-3.8,-2,-3];
Y=[-.51+.13,1+.13,-1];
plot(X,Y,'Color',[57,57,57]./255,'LineWidth',1.8); %画右胳膊
plot(-X,-Y,'Color',[57,57,57]./255,'LineWidth',1.8); %画左胳膊
X=[-3.8,-2,-3];
Y=[-.51+.03,1+.03,-1];
fill(X,Y,[1,1,1],'EdgeColor',[1,1,1],'LineWidth',1.8); %填充右胳膊
fill(-X,-Y,[1,1,1],'EdgeColor',[1,1,1],'LineWidth',1.8); %填充左胳膊
% 绘制脚掌与腿部轮廓
[X,Y]=getEllipse([0,-.1],[1,0;0,1.6],.9^2,200); %脚掌椭圆参数
Y(Y<0)=Y(Y<0).*.2;Y=Y-4.2;X=X-1.2;
plot(X,Y,'Color',[57,57,57]./255,'LineWidth',2); %画右脚掌
plot(-X,Y,'Color',[57,57,57]./255,'LineWidth',2);%画左脚掌(与右脚掌对称)
rectangle('Position',[-2.1 -4.2 1.7 3],'Curvature',0.4,'FaceColor',[1 1 1],'EdgeColor',[57,57,57]./255,'LineWidth',1.8) %画右腿
rectangle('Position',[0.4 -4.2 1.7 3], 'Curvature',0.4,'FaceColor',[1 1 1],'EdgeColor',[57,57,57]./255,'LineWidth',1.8) %画左腿(与右腿对称)
[X,Y]=getEllipse([0,-.1],[1,0;0,1.6],.8^2,200);
Y(Y<0)=Y(Y<0).*.2;Y=Y-4.1;X=X-1.2;