numpy+matplotlib完成信号与系统课后练习1.2

第一章绘制函数图像1.2


题目如下

numpy+matplotlib完成信号与系统课后练习1.2
这个问题的要点如下:

  1. 表示出阶跃函数.
  2. 如何复用函数表达式以及时间来简化代码.
  3. 如何在一个大的"画布"中同时显示多个函数图像.

正文
首先导入需要的包

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()

还有产生的图像
numpy+matplotlib完成信号与系统课后练习1.2

在这里我们还要注意的是,我们复制了五个代码段来实现生成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))

相关文章:

  • 2022-01-03
  • 2022-12-23
  • 2022-01-18
  • 2021-08-24
猜你喜欢
  • 2021-05-18
  • 2021-08-06
  • 2022-01-03
  • 2021-05-24
  • 2021-10-03
  • 2021-04-17
  • 2022-12-23
相关资源
相似解决方案