1 任务描述
在平面直角坐标系中,用turtle绘制y=xn(n=-2,-1,0,1,2)的曲线。
2 数学知识点
(1)幂函数
幂函数是指y=xn(n为有理数)的函数,即以底数为自变量,幂为因变量,指数为常数的函数。幂函数y=x-2、y=x-1、y=x1、y=x2(注:当n<0时,x≠0)在平面直角坐标系里的曲线如图1所示。
图1 幂函数曲线
幂函数有如下特点:
(a)所有曲线都通过点(1,1)。当n>0时,曲线过点(0,0)和(1,1)两个点;
(b)当n为正奇数时,曲线在定义域为实数域内单调递增;
(c)当n为正偶数时,曲线在定义域为第二象限内单调递减,在第一象限内单调递增;
(d)当n为负奇数时,曲线在第一、三象限内单调递减;
(e)当n为负偶数时,曲线在第二象限内单调递增,在第一象限内单调递减;
(f)当n为负数时,x不能为0。
(2)指数函数
指数函数是指y=ax形式的函数(a为常数且a>0,a≠1),即底数为常数,指数为自变量,幂为因变量的函数。函数的定义域是实数域R。如:y=2x,y=ex等。这里的e是数学常数,近似等于2.718281828。当底数为e时,这个函数写为exp(x)。
指数函数y=ax(a为常数且a>0,a≠1)在平面直角坐标系里的曲线如图2所示。
图2 指数函数曲线
指数函数有如下特点:
(a)对于a不大于0的情况,函数的定义域不连续,这里不予考虑;
(b)指数函数的值域为(0, ∞);
(c)a>1时,则指数函数单调递增;若0<a<1,则为单调递减的。
3 编程知识点
(1)Python代码的调试
对于任何编程人员来说,程序调试是非常必要的技能。调试就是跟踪程序运行时各行代码运行的情况,并与编程人员预期的效果进行对比,从而帮助编程人员准确地定位程序错误的过程。Python提供了很多调试工具包。
本节介绍Python自带的pdb调试工具包的使用。pdb为Python程序提供了交互式的源代码调试功能,主要包括设置断点、单步调试、进入函数调试、查看当前代码、动态改变变量的值等。
pdb提供的常用调试命令如图3所示。
图3 常用pdb调试命令
在图4所示程序中导入pdb库,加入了函数pdb.set_trace();在调试过程中,程序会运行到pdb.set_trace()的位置处。调试过程的Python界面显示如图5所示,选择n Enter可以执行当前的代码;在第一次按下了n Enter之后,可以直接按Enter重复执行上一条调试命令。输入list或l命令可以显示当前代码段。
在调试过程中,我们最关心当前代码运行后,相关变量的值如何变化,代码运行是否符合预期。调试命令p用来打印当前变量的值,如图6所示。
在调试模式下,命令c可以让程序继续运行到下一个pdb.set_trace()处,如图7所示。可以使用命令n单步执行程序,使用命令p打印变量的当前值,从而判断是否符合预期。
图4 设置了pdb调试跟踪的程序代码
图5 pdb调试过程:执行当前代码
图6 在调试过程中打印变量的值
图7 调试模式下继续执行代码
使用命令exit可以退出调试模式。程序在调试过程中运行到i=1时的图形如图8所示。
图8 程序在调试过程中的运行情况
(2)改变画笔形状
使用turtle库的函数shape(),可以获取当前画笔的形状;如果要改变画笔的形状,只需要给函数shape()中的输入参数赋值,如图9中shape(“turtle”)就是将画笔形状改为turtle形状。
图9 改变画笔形状
4 任务分析
用turtle库绘制函数曲线,工作分为两部分:一是绘制坐标轴,另一个是绘制曲线。
为了程序结构清晰,我们把绘制坐标轴的工作放在自定义函数里完成。用自定义的画坐标轴的函数画出x轴和y轴,并标上刻度。每50像素标注一个单位刻度。
为了在主程序和函数中全程能够使用turtle库、pdb库和颜色列表,在程序的开始就完成库的导入和颜色列表的设置,如下:
自定义画坐标轴的函数的逻辑结构如下:
在主程序中,要调用画x轴和y轴的函数,并且用turtle库绘制幂函数曲线。画幂函数的曲线需要有两层循环:外层循环控制画不同n的曲线(n=-2,-1,0,1,2);内层循环控制x的取值,从-250到250,代表着从-5到5的计算值,计算出相应的y值。指数为负数,x值为0时,y值没有意义,此时不计算y值。
在程序刚开始编写时,由于(x,y)值和曲线的绘制可能出现预料之外的运行结果。我们需要设置调试断点。程序运行正常后,可以去掉调试断点。
主程序的逻辑结构如下:
5 程序设计
新建一个Python程序文件powerfunctioncurvpdb.py,去掉调试函数的程序文件名是powerfunctioncurv.py。
自定义函数的名称为axisxy(),程序开始的库导入代码、颜色列表设置代码和函数的程序代码如图10所示。
有调试功能的主程序代码如图11所示。
图10 画坐标轴的自定义函数的程序代码
图11 画幂函数曲线的主程序代码
6 运行结果
powerfunctioncurvpdb.py是一个调试模式的程序。运行这个程序,会停留在设置pdb.set_trace()的位置,编程人员可以开始调试,观察在程序执行过程中各变量值的变化情况。运行有调试模式的程序如图12所示。当编写的程序出现问题时,需要使用调试模式进行调试。
图12 运行有调试模式的程序
程序调试完成后,再运行无调试模式的程序文件powerfunctioncurv.py,程序运行结果如图13所示。
图13 无调试模式程序运行结果:绘制幂函数曲线
7 发散思考
(a)如果想生成n为其他值的幂函数曲线,该如何修改程序?
在如图11所示的主程序代码中,修改外层循环,如把“for i in range(-2,3,1)”改为“for i in range(-4,5,1)”。为了显示更多的曲线,也可以把画笔修改细一些,如pensize(1),其他不变,便可以生成更多的幂函数曲线,运行结果如图14所示。
(b)如何将坐标轴的刻度范围设置成可动态调整?
我们可以给函数axisxy()增加两个参数:xn,yn,作用是传递x轴和y轴的正向最大刻度标识。也就是说,将def axisxy()改为def axisxy(xn,yn)。
在函数里,标记刻度标识时,需要换算。如果以前最大范围是5,现在要变成10,即现在每个单位的刻度范围是以前的2倍。
图14 程序运行结果:更多的幂函数曲线
把图10所示函数axisxy()中的s=”{0}”.format(j)代码替换为:
在主程序调用函数axisxy(xn, yn)的时候,可以输入任意刻度范围,但需要在计算y值的时候,把计算值换算成相应的像素值。如我们使用axisxy(10,10),在计算y值的时候,要改为y=pow(j/25,i)×25,其他语句不变。程序运行结果如图15所示,x轴和y轴的范围变为[-10,10],刻度标识范围从-8.0到8.0。
图15 程序运行结果:变化坐标轴范围
8 挑战自我
在平面直角坐标系中,用turtle绘制y=sin(x)、y=sin(x 45)和y=cos(x)、y=cos(x 45),x的单位是角度。
参考程序
参考程序文件:sincosf.py,这个画正弦函数和余弦函数的程序分为两部分:一部分是画坐标轴的自定义函数程序代码,如图16所示,另一部分是画正弦函数和余弦函数曲线的主程序代码,如图17所示。
图16 画坐标轴的自定义函数程序代码
图17 画正弦函数和余弦函数曲线的主程序代码
画正弦函数和余弦函数程序的运行结果如图18所示。
图18 程序运行结果:画正弦函数和余弦函数
小结
·数学知识:幂函数和指数函数。
·编程知识:Python代码的调试;
用shape()函数改变画笔的朝向;
用turtle画坐标轴的方法;
用turtle画函数曲线的方法。