Python几何图形编程之函数曲线

1 任务描述

在平面直角坐标系中,用turtle绘制y=xnn=-2,-1,0,1,2)的曲线。

2 数学知识点

(1)幂函数

幂函数是指y=xnn为有理数)的函数,即以底数为自变量,幂为因变量,指数为常数的函数。幂函数y=x-2y=x-1y=x1y=x2(注:当n<0时,x≠0)在平面直角坐标系里的曲线如图1所示。

Python几何图形编程之函数曲线

图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=2xy=ex等。这里的e是数学常数,近似等于2.718281828。当底数为e时,这个函数写为exp(x)。

指数函数y=axa为常数且a>0,a≠1)在平面直角坐标系里的曲线如图2所示。

Python几何图形编程之函数曲线

图2 指数函数曲线

指数函数有如下特点:

(a)对于a不大于0的情况,函数的定义域不连续,这里不予考虑;

(b)指数函数的值域为(0, ∞);

(c)a>1时,则指数函数单调递增;若0<a<1,则为单调递减的。

3 编程知识点

(1)Python代码的调试

对于任何编程人员来说,程序调试是非常必要的技能。调试就是跟踪程序运行时各行代码运行的情况,并与编程人员预期的效果进行对比,从而帮助编程人员准确地定位程序错误的过程。Python提供了很多调试工具包。

本节介绍Python自带的pdb调试工具包的使用。pdb为Python程序提供了交互式的源代码调试功能,主要包括设置断点、单步调试、进入函数调试、查看当前代码、动态改变变量的值等。

pdb提供的常用调试命令如图3所示。

Python几何图形编程之函数曲线

图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打印变量的当前值,从而判断是否符合预期。

Python几何图形编程之函数曲线

图4 设置了pdb调试跟踪的程序代码

Python几何图形编程之函数曲线

图5 pdb调试过程:执行当前代码

Python几何图形编程之函数曲线

图6 在调试过程中打印变量的值

Python几何图形编程之函数曲线

图7 调试模式下继续执行代码

使用命令exit可以退出调试模式。程序在调试过程中运行到i=1时的图形如图8所示。

Python几何图形编程之函数曲线

图8 程序在调试过程中的运行情况

(2)改变画笔形状

使用turtle库的函数shape(),可以获取当前画笔的形状;如果要改变画笔的形状,只需要给函数shape()中的输入参数赋值,如图9中shape(“turtle”)就是将画笔形状改为turtle形状。

Python几何图形编程之函数曲线

图9 改变画笔形状

4 任务分析

用turtle库绘制函数曲线,工作分为两部分:一是绘制坐标轴,另一个是绘制曲线。

为了程序结构清晰,我们把绘制坐标轴的工作放在自定义函数里完成。用自定义的画坐标轴的函数画出x轴和y轴,并标上刻度。每50像素标注一个单位刻度。

为了在主程序和函数中全程能够使用turtle库、pdb库和颜色列表,在程序的开始就完成库的导入和颜色列表的设置,如下:

Python几何图形编程之函数曲线

自定义画坐标轴的函数的逻辑结构如下:

Python几何图形编程之函数曲线
Python几何图形编程之函数曲线

在主程序中,要调用画x轴和y轴的函数,并且用turtle库绘制幂函数曲线。画幂函数的曲线需要有两层循环:外层循环控制画不同n的曲线(n=-2,-1,0,1,2);内层循环控制x的取值,从-250到250,代表着从-5到5的计算值,计算出相应的y值。指数为负数,x值为0时,y值没有意义,此时不计算y值。

在程序刚开始编写时,由于(xy)值和曲线的绘制可能出现预料之外的运行结果。我们需要设置调试断点。程序运行正常后,可以去掉调试断点。

主程序的逻辑结构如下:

Python几何图形编程之函数曲线
Python几何图形编程之函数曲线

5 程序设计

新建一个Python程序文件powerfunctioncurvpdb.py,去掉调试函数的程序文件名是powerfunctioncurv.py。

自定义函数的名称为axisxy(),程序开始的库导入代码、颜色列表设置代码和函数的程序代码如图10所示。

有调试功能的主程序代码如图11所示。

Python几何图形编程之函数曲线

图10 画坐标轴的自定义函数的程序代码

Python几何图形编程之函数曲线

图11 画幂函数曲线的主程序代码

6 运行结果

powerfunctioncurvpdb.py是一个调试模式的程序。运行这个程序,会停留在设置pdb.set_trace()的位置,编程人员可以开始调试,观察在程序执行过程中各变量值的变化情况。运行有调试模式的程序如图12所示。当编写的程序出现问题时,需要使用调试模式进行调试。

Python几何图形编程之函数曲线

图12 运行有调试模式的程序

程序调试完成后,再运行无调试模式的程序文件powerfunctioncurv.py,程序运行结果如图13所示。

Python几何图形编程之函数曲线

图13 无调试模式程序运行结果:绘制幂函数曲线

7 发散思考

(a)如果想生成n为其他值的幂函数曲线,该如何修改程序?

在如图11所示的主程序代码中,修改外层循环,如把“for i in range(-2,3,1)”改为“for i in range(-4,5,1)”。为了显示更多的曲线,也可以把画笔修改细一些,如pensize(1),其他不变,便可以生成更多的幂函数曲线,运行结果如图14所示。

(b)如何将坐标轴的刻度范围设置成可动态调整?

我们可以给函数axisxy()增加两个参数:xnyn,作用是传递x轴和y轴的正向最大刻度标识。也就是说,将def axisxy()改为def axisxy(xnyn)。

在函数里,标记刻度标识时,需要换算。如果以前最大范围是5,现在要变成10,即现在每个单位的刻度范围是以前的2倍。

Python几何图形编程之函数曲线

图14 程序运行结果:更多的幂函数曲线

把图10所示函数axisxy()中的s=”{0}”.format(j)代码替换为:

Python几何图形编程之函数曲线

在主程序调用函数axisxy(xnyn)的时候,可以输入任意刻度范围,但需要在计算y值的时候,把计算值换算成相应的像素值。如我们使用axisxy(10,10),在计算y值的时候,要改为y=pow(j/25,i)×25,其他语句不变。程序运行结果如图15所示,x轴和y轴的范围变为[-10,10],刻度标识范围从-8.0到8.0。

Python几何图形编程之函数曲线

图15 程序运行结果:变化坐标轴范围

8 挑战自我

在平面直角坐标系中,用turtle绘制y=sin(x)、y=sin(x 45)和y=cos(x)、y=cos(x 45),x的单位是角度。

参考程序

参考程序文件:sincosf.py,这个画正弦函数和余弦函数的程序分为两部分:一部分是画坐标轴的自定义函数程序代码,如图16所示,另一部分是画正弦函数和余弦函数曲线的主程序代码,如图17所示。

Python几何图形编程之函数曲线

图16 画坐标轴的自定义函数程序代码

Python几何图形编程之函数曲线

图17 画正弦函数和余弦函数曲线的主程序代码

画正弦函数和余弦函数程序的运行结果如图18所示。

Python几何图形编程之函数曲线

图18 程序运行结果:画正弦函数和余弦函数

小结

·数学知识:幂函数和指数函数。

·编程知识:Python代码的调试;

用shape()函数改变画笔的朝向;

用turtle画坐标轴的方法;

用turtle画函数曲线的方法。

发表评论