numpy+matplotlib完成信号与系统课后练习1.2
第一章绘制函数图像1.2
题目如下
这个问题的要点如下:
- 表示出阶跃函数.
- 如何复用函数表达式以及时间来简化代码.
- 如何在一个大的"画布"中同时显示多个函数图像.
正文
首先导入需要的包
import numpy as np
from matplotlib import pyplot as plt
然后对时间采样并写出函数表达式
t = np.arange(-5,5,0.01) #对时间取样
f = lambda t : (1+t/2)*(np.heaviside(t+2,0)-np.heaviside(t-2,0)) #表示函数,会解释为什么用lambda实现
上边出现了一个np的函数heaviside,这是np包内定义的一个阶跃函数,可以接受数组为参数,具体情况大家可以自己查看文档.
但其实我们根据阶跃函数的定义可以自己定义一个heaviside使用lambda表达式
lambda x : 1 if x > 0 else 0
但是在处理数组是这个短小的函数弊端就显现出来,我们可能需要借助for循环来处理数组,为了简化问题,我们直接使用np的阶跃函数.
接下来解释为什么要用lambda来表示题目中的函数关系.如果不用lambda函数我们表示的函数可能是这个样子
f = (1+t/2)*(np.heaviside(t+2,0)-np.heaviside(t-2,0))
#但紧接着问题就出现了,我们还需要f(t+2),f(t-2)等等很多由f(t)产生的函数,每一次再复制粘贴修改虽然简单,但是并不符合设计程序的原#则.所以我们把这个设计成一个短小精悍的函数,lambda表达式正是我们最佳的选择.通过改变对f()传入的参数,很方便的完成了复用的需求.
接下来是在一个画布上做出多个图像的问题,我并不打算在这个博客中说明原理和思路,有兴趣的朋友可以看我的另外一篇博文
<--------------------------------------------------这是个占位符,那篇文章还没有写: )---------------------------------------------------------------------->
直接贴上代码:
plt.figure(figsize=(8,6)) #定义一个画布
plt.subplots_adjust(right=1.0,hspace=0.5) #调整每个子图之间的距离
plt.subplot(2,3,1) #子图一
plt.xlabel('t')
plt.xlim(-2.5,2.5)
plt.title('f(t)') #这里通过上边定义的 f = lambda t : (1+t/2)*(np.heaviside(t+2,0)-np.heaviside(t-2,0)
plt.plot(t,f(t)) #很简单就实现了函数改变的问题
plt.subplot(2,3,2) #子图二
plt.xlabel('t')
plt.xlim(-4.5,0.5)
plt.title('f(t+2)')
plt.plot(t,f(t+2))
plt.subplot(2,3,3) #子图三
plt.xlabel('t')
plt.xlim(-0.5,4.5)
plt.title('f(t)')
plt.plot(t,f(t-2))
plt.subplot(2,3,4) #子图四
plt.xlabel('t')
plt.xlim(-2.5,2.5)
plt.title('f(-t)')
plt.plot(t,f(-t))
plt.subplot(2,3,5) # 子图五
plt.xlabel('t')
plt.xlim(-2.5,2.5)
plt.title('f(2t)')
plt.plot(t,f(2*t))
plt.show()
还有产生的图像
在这里我们还要注意的是,我们复制了五个代码段来实现生成5个子图.这个显然是与程序设计原则相违背的,我们因该把这个做成一个函数,并通过调用这个函数,来实现生成五个子图.
分析这个函数的功能我们发现,只要把上边子图代码段中,变化的量设计为形参,并返回一个plt中的subplot对象的句柄.是很简单实现的,我就不完成了,大家自行实现.
完整的代码段
t = np.arange(-5,5,0.01) #对时间取样
# 也可以自己定义一个阶跃函数 heavisid_e = lambda t : 0 if t < 0 else 1
f = lambda t : (1+t/2)*(np.heaviside(t+2,0)-np.heaviside(t-2,0)) #表示函数,会解释为什么用lambda实现
plt.figure(figsize=(8,6)) #定义一个画布
plt.subplots_adjust(right=1.0,hspace=0.5) #调整每个子图之间的距离
plt.subplot(2,3,1) #子图一
plt.xlabel('t')
plt.xlim(-2.5,2.5)
plt.title('f(t)') #这里通过上边定义的 f = lambda t : (1+t/2)*(np.heaviside(t+2,0)-np.heaviside(t-2,0)
plt.plot(t,f(t)) #很简单就实现了函数改变的问题
plt.subplot(2,3,2) #子图二
plt.xlabel('t')
plt.xlim(-4.5,0.5)
plt.title('f(t+2)')
plt.plot(t,f(t+2))
plt.subplot(2,3,3) #子图三
plt.xlabel('t')
plt.xlim(-0.5,4.5)
plt.title('f(t)')
plt.plot(t,f(t-2))
plt.subplot(2,3,4) #子图四
plt.xlabel('t')
plt.xlim(-2.5,2.5)
plt.title('f(-t)')
plt.plot(t,f(-t))
plt.subplot(2,3,5) # 子图五
plt.xlabel('t')
plt.xlim(-2.5,2.5)
plt.title('f(2t)')
plt.plot(t,f(2*t))