python计算系统的阶跃响应和脉冲响应
来源:互联网 发布:如何赚第一桶金 知乎 编辑:程序博客网 时间:2024/05/22 07:55
因为正在学习自动控制理论,想验证一下书上的结论和做一些简单的系统分析,就选择了用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,impulse2import matplotlib.pyplot as plts1=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()
输出结果如下:
感觉比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只是返回输出值而不是直接绘制出阶跃响应或者脉冲响应的图像,可以自己定义个函数实现,下面随便给出一个闭环传递函数
观察阶跃响应和脉冲响应,Python程序如下:
#自定义step_plot()import numpy as npimport control as ctlimport matplotlib.pyplot as pltdef 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格式):
和MATLAB对比:
s=tf(4,[1,2,10,8]);step(s)impulse(s)
在此不得不感叹开源合作的力量真的非常强大,在科学计算方面几乎可以转到Python平台下操作了,还有接下来本人要学习的基于python-openCV的图像处理,都可以通过Python轻松实现。
- python计算系统的阶跃响应和脉冲响应
- 阶跃输入系统的响应
- 阶跃响应指标的matlab计算
- 脉冲和阶跃响应matlab
- 单位冲激响应和单位阶跃响应
- matlab在DSP中的应用(四)---离散系统的冲激响应和阶跃响应
- 冲激响应、阶跃响应
- matlab 绘制系统的单位阶跃响应曲线 并编写程序求峰值时间 超调量 [李园7舍_404]
- MATLAB 笔记,关于Filter函数的功能和使用,求simple(冲激)和unit step(阶跃)响应
- 阶跃函数和符号函数的傅里叶变换
- 信号与系统3:单位阶跃,单位响应以及系统性质
- 信号与系统3:单位阶跃,单位响应以及系统性质
- 脉冲响应与频率响应的关系
- Matlab 单位阶跃响应曲线三维图、上升时间、峰值时间、最大过调量和调整时间
- 第13章 离散时间系统单位脉冲响应
- 关于光纤的基本理论(一)光纤的分类和多模阶跃折射率光纤
- 阶跃响应面积法辨识传递函数&matlab编程
- 阶跃响应法——面积辨识法
- 为github帐号添加SSH keys
- Unity Shader-兰伯特光照模型与Diffuse Shader
- 【Hadoop入门】Hadoop集群安装配置教程_Hadoop2.6.0_Ubuntu/CentOS
- properties读取2
- Oracle数据类型与函数
- python计算系统的阶跃响应和脉冲响应
- nginx负载均衡和反向代理跨域
- 109Q游戏(8)123/133/146/163/168/172/177(9-15)
- java工程怎么应用其他工程的类中的方法或者本工程其他类中的方法?
- 详解Python的装饰器
- properties文件读取测试3
- 后置自增操作符与解引用,前置自增操作符
- ViewPager 源码分析(一) —— setAdapter() 与 populate()
- Android环境变量配置