python计算系统的阶跃响应和脉冲响应

因为正在学习自动控制理论,想验证一下书上的结论和做一些简单的系统分析,就选择了用Python来试验一下,因为MATLAB受到版权等原因,还是用Python开源的为好。

一、软件环境配置

使用过Anaconda、winPython和python(x,y)后,我最终选择了winPython。下面说明一下我自己选择的原因,对于Anaconda,笔者在知乎和其他很多论坛上都说Anaconda很好,很适合做科学计算,但本人安装之后发现了几个问题,首先,软件不稳定,一些组件竟然报错无法打开,可能是本人电脑原因,但是测试过2.7版本和3.5版本的都是那样,再加上安装完之后体积比较大,程序打开缓慢,几番折腾后无奈放弃。对于python(x,y),软件体积巨大,我只需要科学计算的,很多多余的功能并不需要,而且这个软件的更新缓慢,目前(2016年11月7日)支持的Python版本号只是2.7.10,在测试了winPython后也放弃python(x,y)了,winPython的更新比较活跃,网上查阅了一些资料获知winPython和python(x,y)的开发者是同一人,想必是把重心放到winPython了。
我选择的winPython是WinPython-64bit-2.7.10.3,软件大小263M,其实也有比较小的版本较新的WinPython-64bit-2.7.12.3Zero,大小21M,但是这个集合的模块很少,几乎没有,特别是我想要的IPython(后来才知道自己完全可以自己配置的,即使不用winPython,也可以用Python+jupyter-qtconsole来配置自己想要的工作环境),全部安装完成之后,更新了常用的模块和添加了其他需要的模块之后,占用了磁盘1.8G空间,也挺大的,但是为了不想再折腾就没去动他了,因为就测试使用这三个软件,不同版本都耗费了一天时间,最后发现winPython最稳定,以前写的代码都能正常运行。下面进入正题:

二、所需模块

Scipy,Numpy,matplotlib,具体的教程网上很多,官网的文档也非常详细,这里就不费篇幅写了。处理系统信号,输出阶跃响应和脉冲响应,就用到了scipy模块下的子模块signal,函数用step2()和impulse2()来分别求阶跃输出和脉冲输出,类似于MATLAB下的step()和impulse()函数,但是scipy下还要通过matplotlib的绘图函数自己将曲线画出来,当然也可以自己定义一个函数达到MATLAB的效果

三、程序

为了记录学习过程和分享知识,这里直接贴出代码,因为想从MATLAB转向Python的开源编程环境,很多实现的功能还是基础的,大神莫笑。

from scipy.signal import lti,step2,impulse2
import matplotlib.pyplot as plt

s1=lti([3],[1,2,10])    # 以分子分母的最高次幂降序的系数构建传递函数,s1=3/(s^2+2s+10)
s2=lti([1],[1,0.4,1])   # s2=1/(s^2+0.4s+1)
s3=lti([5],[1,2,5])     # s3=5/(s^2+2s+5)

t1,y1=step2(s1)         # 计算阶跃输出,y1是Step response of system.
t2,y2=step2(s2)
t3,y3=step2(s3)
t11,y11=impulse2(s1)
t22,y22=impulse2(s2)
t33,y33=impulse2(s3)

f,((ax1,ax2,ax3),(ax4,ax5,ax6)) = plt.subplots(2,3,sharex='col',sharey='row') # 开启subplots模式
ax1.plot(t1,y1,'r',label='s1 Step Response',linewidth=0.5)
ax1.set_title('s1 Step Response',fontsize=9)
ax2.plot(t2,y2,'g',label='s2 Step Response',linewidth=0.5)
ax2.set_title('s2 Step Response',fontsize=9)
ax3.plot(t3,y3,'b',label='s3 Step Response',linewidth=0.5)
ax3.set_title('s3 Step Response',fontsize=9)

ax4.plot(t11,y11,'m',label='s1 Impulse Response',linewidth=0.5)
ax4.set_title('s1 Impulse Response',fontsize=9)
ax5.plot(t22,y22,'y',label='s2 Impulse Response',linewidth=0.5)
ax5.set_title('s2 Impulse Response',fontsize=9)
ax6.plot(t33,y33,'k',label='s3 Impulse Response',linewidth=0.5)
ax6.set_title('s3 Impulse Response',fontsize=9)

##plt.xlabel('Times')
##plt.ylabel('Amplitude')
#plt.legend()
plt.show()

输出结果如下:
python计算系统的阶跃响应和脉冲响应_第1张图片

感觉比MATLAB好看多了,主要是Python及其众多模块的开源,没有了版权问题,也让编程更加灵活了。


2016/11/8

今天又发现了新的Python关于控制理论的工具包,虽然没有MATLAB的强大,但是对于一般应用完全够用了。

新的工具包是Python Control Systems Library ,里面有和MATLAB语法相近的函数,如tf,ss,series,parallel,bote,step,impulse等函数,测试了一下感觉稳定性感觉比scipy.signal下的好,另外,和scipy.signal.step2和scipy.signal.impulse2一样,control.matlab.step和control.matlab.impulse只是返回输出值而不是直接绘制出阶跃响应或者脉冲响应的图像,可以自己定义个函数实现,下面随便给出一个闭环传递函数

G(s)=4s3+2s2+10s+8

观察阶跃响应和脉冲响应,Python程序如下:

#自定义step_plot()
import numpy as np
import control as ctl
import matplotlib.pyplot as plt

def step_plot(s):
    y,t=ctl.step(s)
    plt.plot(t,y,'b',linewidth=0.6)
    plt.title('Step Response',fontsize=9)
    plt.xlabel('Time(seconds)',fontsize=9)
    plt.ylabel('Amplitude',fontsize=9)
    plt.show()

def impulse_plot(s):
    y,t=ctl.impulse(s)
    plt.plot(t,y,'b',linewidth=0.6)
    plt.title('Impulse Response',fontsize=9)
    plt.xlabel('Time(seconds)',fontsize=9)
    plt.ylabel('Amplitude',fontsize=9)
    plt.show()


s=ctl.tf([4],[1,2,10,8])
step_plot(s)

结果如下(图片导出为PNG格式):


python计算系统的阶跃响应和脉冲响应_第2张图片


python计算系统的阶跃响应和脉冲响应_第3张图片

和MATLAB对比:

s=tf(4,[1,2,10,8]);
step(s)
impulse(s)

python计算系统的阶跃响应和脉冲响应_第4张图片

python计算系统的阶跃响应和脉冲响应_第5张图片

在此不得不感叹开源合作的力量真的非常强大,在科学计算方面几乎可以转到Python平台下操作了,还有接下来本人要学习的基于python-openCV的图像处理,都可以通过Python轻松实现。

你可能感兴趣的:(Python)