1. 程式人生 > >python計算系統的階躍響應和脈衝響應

python計算系統的階躍響應和脈衝響應

因為正在學習自動控制理論,想驗證一下書上的結論和做一些簡單的系統分析,就選擇了用Python來試驗一下,因為MATLAB受到版權等原因,還是用Python開源的為好。

一、軟體環境配置

使用過AnacondawinPythonpython(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()

輸出結果如下:
這裡寫圖片描述

感覺比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格式):


這裡寫圖片描述
這裡寫圖片描述

和MATLAB對比:

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

這裡寫圖片描述

這裡寫圖片描述

在此不得不感嘆開源合作的力量真的非常強大,在科學計算方面幾乎可以轉到Python平臺下操作了,還有接下來本人要學習的基於python-openCV的影象處理,都可以通過Python輕鬆實現。

相關推薦

python計算系統響應脈衝響應

因為正在學習自動控制理論,想驗證一下書上的結論和做一些簡單的系統分析,就選擇了用Python來試驗一下,因為MATLAB受到版權等原因,還是用Python開源的為好。 一、軟體環境配置 使用過Anaconda、winPython和python(x,y)後,我

DCDC開關電源的響應動態響應(Load Transient)的區別

本文以DCDC晶片TPS54620為例,介紹階躍響應和動態響應的概念。 1. 階躍響應 階躍響應考察的是輸出電壓VOUT和輸入電壓VIN的關係,考察階躍響應的目的在於:希望在DCDC電源的輸入電壓階躍時,輸出電壓能儘快變到目標值。 圖 1‑1 階躍響應的模擬電路

python讀取大檔案的方法 python計算檔案的行數讀取某一行內容的實現方法

 python計算檔案的行數和讀取某一行內容的實現方法 :最簡單的辦法是把檔案讀入一個大的列表中,然後統計列表的長度.如果檔案的路徑是以引數的形式filepath傳遞的,那麼只用一行程式碼就可以完成我們的需求了:   1、http://blog.csdn.net/shudaq

python計算資料包校驗

使用python對IP資料報頭部進行校驗。 源資料包: python程式碼:         全域性陣列packet中放著20位元組的IP資料報首部,校驗和為零,通過程式處理將校驗和填入packet陣列。 packet=['45','00

Python計算圓的周長面積球的表面積體積

Python計算圓的周長面積和球的表面積和體積 import math r=float(input("請輸入半徑:")) circumference=2*math.pi*r area=math.pi*r*r sarea=4*math.pi*r*r volume=4/3*math.pi*r

python知識系統表-1.變數資料型別

1.變數和資料型別 1.1 資料型別 1.1.1 整數 Python可處理任意大小的整數,包括負整數,在Python程式中,整數的表示方法和數學上的寫法一模一樣,例如:1,100,-8080,0等等。 計算機由於使用二進位制,所以,有時候用十六

Python計算上個月最後一天第一天

import time from datetime import datetime import calendar def getLastDayOfLastMonth(): d = date

matlab在DSP中的應用(四)---離散系統的衝激響應響應

一、實驗目的 (1)加深對離散線性移不變(LSI)系統基本理論的理解,明確差分方程與系統函式之間的關係。    (2)初步瞭解用MATLAB語言進行離散時間系統研究的基本方法。 (3)掌握求解離散時間系統衝激響應和階躍響應程式的編寫方法,瞭解常用子函式。

Python練習(七)計算1到n的乘的

python階乘: 所有小於及等於該數的正整數的積,當n為5時,5的階乘為 5!=1*2*3*4*5=1200 的階乘永遠等於11 的階乘等於 1*1 12 的階乘等於 1*1*2 23 的階乘等於 1*1*2*3 64 的階乘等於 1*1*2*3*4 245 的階

歸一化二系統響應之matlab GUI+程式打包實現

歸一化系統的二階階躍響應之matlab GUI+程式打包實現 設計程式效果展示 1.1.list選項:選擇第一項效果展示 1.2.list選項:選擇第二項效果展示 1.3.list選項:選擇第三項效果展示 1.4.list選項:選擇第四項效果展示 設計思想 為了研究

matlab-自控原理 step、impulse 脈衝響應 已知傳遞函式

慈心積善融學習,技術願為有情學。善心速造多好事,前人栽樹後乘涼。我今於此寫經驗,願見文者得啟發。 已知傳遞函式,求其階躍響應 code clear clc num=[0 1 3] den=[1

Python計算一個目錄下的所有文件的md5值,在Linux系統下面

linux md5 python walk hashlib 實現代碼如下:#!/usr/bin/python #*-*coding:utf8*-* import os import sys import hashlib def md5sum(data): with open(d

Python學習筆記--系統相關模塊操作

setuid val var 表達 package log 轉換 eval 最小 系統相關的信息模塊: import sys sys.argv 是一個 list,包含所有的命令行參數. sys.stdout sys.stdin sys.stderr 分別表示標準輸入

Python—操作系統多線程

listdir python ESS 判斷 rem 生成 打印機 top 元素 ####python的操作系統### 1.os模塊 import os #1.返回操作系統類型 # 值為posix,是linux操作系統 #值為nt,是windows系統 print

Python-----使用ininstanceissublcass方法判斷類對象的關系

對象 print ssi __init__ elf cas bin usr cls #!/usr/bin/env python # -*- coding:utf-8 -*- # isinstance(obj,cls) #用於判斷obj對象是否由cls這個類實例化

python 計算校驗

校驗和是經常使用的,這裡簡單的列了一個針對按位元組計算累加和的程式碼片段。其實,這種累加和的計算,將位元組翻譯為無符號整數和帶符號整數,結果是一樣的。 使用python計算校驗和時記住做截斷就可以了。 這裡僅僅是作為一個程式碼樣本,權作標記,直接上程式碼 ''' Created on

C語言:計算乘的

從鍵盤輸入一個數,用C語言計算該數的階乘 #include <stdio.h> #include<stdlib.h> int main() { int i,sum = 0, p = 1, n; scanf("%d",&n); if(

Python(二十四)-Python中函式的引數定義可變引數

分享一下我的偶像大神的人工智慧教程!http://blog.csdn.net/jiangjunshow 也歡迎轉載我的文章,轉載請註明出處 https://blog.csdn.net/mm2zzyzzp Python進階(二十四)-Python中函式的引數定義

分享一個18K Python大佬的面試簡歷系統AI學習視訊!

這兩天無意中網上看到一幅圖,大概就是python各個發展路線和對應的工資水平,這幅圖的工資水平僅供參考(一線城市)       看到這個機器學習初級工程師工資,我我臉上只透露著一個字     當然個人覺得web

分享一個18K Python大佬的面試簡歷系統AI學習視訊

這兩天無意中網上看到一幅圖,大概就是python各個發展路線和對應的工資水平,這幅圖的工資水平僅供參考(一線城市) 看到這個機器學習初級工程師工資,我我臉上只透露著一個字 當然個人覺得web、爬蟲、資料探勘工資個人覺得還算合理,機器學習的覺得會有點誇張,畢竟身邊一些從事機