郭玉祥 周函 張慶平 李彥梅
【摘? ?要】? ?自動控制原理課程常常需要運用軟件繪制圖形,而MATLAB又存在價格昂貴、關(guān)鍵代碼被隱藏和可移植性不高等諸多不便?;诖?,給出了PYTHON軟件在自動控制原理課程仿真中的應(yīng)用和一些具體實例的仿真程序代碼。首先使用ANACONDA開源軟件,安裝第三方開源包SLYCOT和CONTROL以搭建環(huán)境,然后基于PYTHON語言環(huán)境開展系統(tǒng)的時域、復(fù)域和頻域仿真以及系統(tǒng)的校正與設(shè)計仿真,并與相關(guān)參考文獻(xiàn)里的MATLAB仿真結(jié)果進(jìn)行比較,結(jié)果表明二者的仿真效果并無明顯區(qū)別,為系統(tǒng)的仿真和繪圖提供了一種新方式。
【關(guān)鍵詞】? ?PYTHON;自動控制;傳遞函數(shù);仿真
Application of PYTHON in the Simulation of Automatic
Control Principle Course
Guo Yuxiang, Zhou Han, Zhang Qingping, Li Yanmei*
( Anqing Normal University, Anqing 246011, China)
【Abstract】? ? The course of automatic control principle usually needs to use software to draw graphics while MATLAB exists a number of inconveniences such as high cost, hidden critical code, the lack of portability, and so on. Based on these statements, the paper shows the applications of PYTHON software in the course of automatic control principle and gives many simulated codes of the relevant examples.It employs thefree software of ANACONDA and installsthe third-partyopen source package of SLYCOT and CONTROL at first, in order to set up the environment.And then itis based on the PYTHON language environment to simulate the system in the time domain, the complex domain, the frequency domain and the calibration and design of plant. Further compared with the MATLAB simulations of the related references, the results show that there is no obvious difference between PYTHON and MATLAB on the simulation of the system, and it offers a new way for simulations and plots of system.
【Key words】? ? ?PYTHON; automatic control; transfer function; simulation
〔中圖分類號〕? TP273? ? ? ? ? ? ? ? ? ? ? ? 〔文獻(xiàn)標(biāo)識碼〕? A ? ? ? ? ? ? ?〔文章編號〕 1674 - 3229(2022)01- 0120 - 06
0? ? ?引言
自動控制原理[1-2]是自動化及相近專業(yè)本科生的必修課,其內(nèi)容主要包含控制系統(tǒng)數(shù)學(xué)模型建立,用時域法、根軌跡法和頻域法對已建立的模型系統(tǒng)進(jìn)行分析和校正,使系統(tǒng)達(dá)到性能指標(biāo)要求。系統(tǒng)的時域法是在時間域內(nèi)分析和校正系統(tǒng)的方法,可以直接在時間上給出系統(tǒng)響應(yīng)的全部信息。在時間域里,繪制典型輸入信號系統(tǒng)的響應(yīng)曲線,以便直觀、準(zhǔn)確地計算和分析系統(tǒng)的動態(tài)性能和穩(wěn)態(tài)性能,對改善和校正系統(tǒng)性能提供指引。線性系統(tǒng)的根軌跡法是在不便計算閉環(huán)系統(tǒng)特征根或某一參數(shù)發(fā)生變化時為系統(tǒng)提供一種非常便捷的圖解方法。結(jié)合仿真軟件,繪制系統(tǒng)的根軌跡,可以形象直觀地分析閉環(huán)系統(tǒng)的穩(wěn)態(tài)性能和暫態(tài)性能,還可以為滿足某一性能指標(biāo)要求而改變參數(shù)來改造和校正系統(tǒng)的性能。線性系統(tǒng)的頻域法也是一種圖解的方法,它是基于頻域響應(yīng)或頻域特性來分析、校正以及綜合設(shè)計控制系統(tǒng)。在使用線性系統(tǒng)的頻域法時,需要繪制系統(tǒng)的幅相頻率特性曲線、對數(shù)幅頻相頻曲線和對數(shù)幅相曲線。其優(yōu)點是在系統(tǒng)難以建模或傳遞函數(shù)難以確定時,以實驗的方式來確定頻域特性,繼而開展控制系統(tǒng)的分析、校正以及綜合設(shè)計。因此,利用仿真軟件對系統(tǒng)展開分析、校正以及綜合設(shè)計是研究自動控制系統(tǒng)的重要手段??涩F(xiàn)今大多數(shù)使用的系統(tǒng)仿真軟件是MATLAB(一款商業(yè)軟件),在使用時需向MATHWORKS公司購買,并且價格昂貴,一些關(guān)鍵代碼被隱藏,難以更改算法的細(xì)節(jié),可移植性不高,對大多數(shù)自動控制原理的學(xué)習(xí)者來說有著許多不便。4A02A196-6C83-430C-8B2B-6CDFDD91B1EA
PYTHON是一門與MATLAB軟件一樣有著悠久歷史的高級程序設(shè)計語言。PYTHON語言是一門面向?qū)ο蟮恼Z言,其中的模塊、函數(shù)等都是對象并且它們都支持繼承、重載等特性[3]。與JAVA、C、C++、JAVASCRIPT等語言不同,PYTHON語言在語法上不支持以花括號為模塊的界限而是以每行字母在該行的位置來確定模塊的界限。控制類語句如IF、WHILE等的使用方式與JAVA語言、C語言之間無明顯區(qū)別,但是PYTHON語言創(chuàng)建了新的一些關(guān)鍵字,如IN,IMPORT,IMPORT AS等。其中IN關(guān)鍵詞是用來判斷一個對象是否在另一個對象之中,IMPORT關(guān)鍵字用來導(dǎo)入文件需要使用的模塊或包,IMPORT AS被用來賦予導(dǎo)入對象新的名字。PYTHON的設(shè)計定位與其他主流編程語言也不同[4-5],PYTHON堅持“面對具體問題只要有一種最優(yōu)解法即可”,不再堅持同其他語言的“多種解法”風(fēng)格。在科學(xué)計算領(lǐng)域PYTHON語言扮演著重要角色,其語言的三個經(jīng)典第三方開源庫(即NUMPY、SCIPY以及MATPLOTLIB)分別是為數(shù)組處理、數(shù)值運算、繪圖三個功能而產(chǎn)生的,可以通過IMPORT函數(shù)導(dǎo)入進(jìn)行使用。近年來隨著人工智能技術(shù)、區(qū)塊鏈技術(shù)、大數(shù)據(jù)技術(shù)的發(fā)展,PYTHON的受歡迎程度也越來越高。可是將PYTHON應(yīng)用于控制系統(tǒng)的仿真中,已有的文獻(xiàn)鮮有報道。李琴等[6]僅僅提出在LABACT自控原理試驗機上結(jié)合PYTHON語言完成實驗任務(wù),并沒有完整給出PYTHON用于時域、復(fù)數(shù)域和頻域?qū)刂葡到y(tǒng)開展分析、校正以及綜合設(shè)計的過程和相關(guān)程序代碼,沒有體現(xiàn)PYTHON在控制系統(tǒng)仿真中的靈活性和可移植性,也不利于自動控制原理學(xué)習(xí)者模仿學(xué)習(xí)、科學(xué)地更改算法細(xì)節(jié),并將其應(yīng)用于將來的系統(tǒng)開發(fā)和科學(xué)研究中。本文利用ANACONDA開源軟件,安裝第三方開源包SLYCOT和CONTROL來搭建環(huán)境,然后基于PYTHON語言環(huán)境對時域法、根軌跡法和頻域法進(jìn)行不同對象的計算和仿真,得到圖形與相關(guān)教材的內(nèi)容相比較,并給出實例程序代碼。下面從時域、復(fù)域、頻域以及控制系統(tǒng)的校正幾個方面給出PYTHON語言的仿真。
1? ? ?控制系統(tǒng)的時域仿真
在自動控制原理教材里,無源網(wǎng)絡(luò)是課程講解舉例時的重要內(nèi)容,現(xiàn)以兩個直接相連接的RC網(wǎng)絡(luò)為對象建立數(shù)學(xué)模型。系統(tǒng)的傳遞函數(shù)為[Gs=ω2n/(s2+2ξωn+ω2n)],其中[ωn=4],[ξ=1]。若分別對這兩個直接相連接的RC網(wǎng)絡(luò)施加單位階躍信號和脈沖信號,對控制系統(tǒng)使用PYTHON語言進(jìn)行仿真得到圖1和圖2,與《自動控制原理基礎(chǔ)教程》書中[7]的第132頁圖3-43和圖3-44的對比,發(fā)現(xiàn)PYTHON語言的控制系統(tǒng)仿真與MATLAB仿真無本質(zhì)區(qū)別,均可以刻畫系統(tǒng)在時域內(nèi)的變化過程。
※基于PYTHON的系統(tǒng)階躍響應(yīng)代碼為:
from scipy.signal import lti,step2,impulse2
import matplotlib.pyplot as plt
s1=lti([16],[1,5.656,16]) #創(chuàng)建傳函's1=16/(1s^2+5.656s+16)'
t1,y1=step2(s1) #系統(tǒng)階躍輸出
plt.plot(t1,y1,color='black',linewidth=1.0) #繪制響應(yīng)曲線
plt.axhline(y=1,color='green',linewidth=1.0,linestyle='--')
plt.grid()
plt.xlim((0,2.5))
plt.ylim((0,1.2))
plt.show()
※基于PYTHON的系統(tǒng)脈沖響應(yīng)代碼為:
from scipy.signal import lti,step2,impulse2
import matplotlib.pyplot as plt
s=lti([16],[1,5.656,16]) #創(chuàng)建傳函's1=16/(1s^2+5.656s+1)'
t,y1=impulse2(s) #系統(tǒng)脈沖輸出
plt.plot(t,y1,color='red',linewidth=1.0) #繪制響應(yīng)曲線
plt.axhline(y=0,color='blue',linewidth=1.0,linestyle='--')
plt.grid()
plt.xlim((0,2.5))
plt.ylim((-0.2,1.85))
plt.show()
2? ? ?控制系統(tǒng)的復(fù)域仿真
在現(xiàn)實生活中存在著很多高階的控制系統(tǒng),如航空航天中的衛(wèi)星姿態(tài)控制、多旋翼無人機控制以及柴油汽車的柴油發(fā)動機控制[8],面對一個高階的控制系統(tǒng)如何快速判斷系統(tǒng)的穩(wěn)定性成為重要問題,但是系統(tǒng)的閉環(huán)極點卻很難求解。通過自動控制原理的學(xué)習(xí),我們知道可以通過繪制系統(tǒng)傳遞函數(shù)零極點圖,觀察控制系統(tǒng)傳遞函數(shù)零極點的分布情況來快速判斷控制系統(tǒng)的穩(wěn)定性。當(dāng)系統(tǒng)某參數(shù)發(fā)生變化時,也可以通過繪制系統(tǒng)的根軌跡圖,判斷系統(tǒng)的穩(wěn)定性,假定系統(tǒng)的傳遞函數(shù)為[Gs=Kj=1m(s-zj)/i=1n(s-pi)],以硬盤讀寫磁頭為對象[9]建立模型確定傳遞函數(shù),假定傳遞函數(shù)有一個零點[z1=-4],兩個極點[p1=-2+4j],[p2=-2-4j],使用PYTHON語言進(jìn)行控制系統(tǒng)仿真,分別繪制零極點圖和根軌跡圖,得到圖3和圖4。與《自動控制原理基礎(chǔ)教程》[7]中的第162頁圖4-23和圖4-24進(jìn)行對比發(fā)現(xiàn)是一樣的,都清晰地反映出系統(tǒng)的零極點分布和參數(shù)變化下的根軌跡走向。4A02A196-6C83-430C-8B2B-6CDFDD91B1EA
※基于PYTHON的系統(tǒng)零極點圖代碼為:
from control.matlab import *
import matplotlib.pyplot as plt
import numpy as np
num = [1,4] #分子
den = [1,4,20] #分母
sys = tf(num,den) #創(chuàng)建傳遞函數(shù)'(s+4)/(s^2+4s+20)'
pzmap(sys)
plt.axhline(y=0,color='blue',linewidth=1.0,linestyle='--')
plt.axvline(x=0,color='red',linewidth=1.0,linestyle='--')
plt.show()
※基于PYTHON的系統(tǒng)根軌跡圖代碼為:
from control import *
from matplotlib import pyplot as plt
sy1 = tf([1,4],[1,4,20]) #創(chuàng)建開環(huán)傳函'k(s+4)/(s^2+4s+20)'
rlocus(sy1,grid=True)
plt.xlim(-10, 0)
plt.show()
3? ? ?控制系統(tǒng)的頻域仿真
3.1? ?控制系統(tǒng)的幅相頻率特性曲線(奈奎斯特曲線)
在實際工程的控制系統(tǒng)設(shè)計與分析中常常使用頻域圖解法,幅相頻率特性曲線在其中扮演重要角色,在面對一些復(fù)雜的控制系統(tǒng)時,如何判斷系統(tǒng)的穩(wěn)定是必須要面對的問題,要解決這一問題除了上文提到的零極點圖和根軌跡圖,還可以通過奈奎斯特判據(jù)來解決這一問題。因此對系統(tǒng)繪制其幅相頻率特性曲線是有必要的。以雕刻機為對象抽象出傳遞函數(shù)。選取系統(tǒng)的傳遞函數(shù)為[Gs=k/(T1s+1)],其中[k=5,T1=3]。
※基于PYTHON的系統(tǒng)幅相頻率特性曲線代碼如下:
from control.matlab import *
from matplotlib import pyplot as plt
import numpy as np
num=[5]
den=[3,1]
sy1 = tf(num,den) #創(chuàng)建傳遞函數(shù)'sy1=1/(3s+1)′
nyquist(sy1) #繪制系統(tǒng)的Nyquist響應(yīng)曲線
plt.xlim((0,10))
plt.ylim((-5,5))
plt.axhline(y=0,color='red',linewidth=3.0,linestyle=′-′)
plt.show()
分析圖5發(fā)現(xiàn)與王正林等[10]所著《MATLAB/Simulink與控制系統(tǒng)仿真》中第188頁圖7.9仿真效果一致,能反映出幅頻與相頻之間的關(guān)系。
3.2? ?控制系統(tǒng)的對數(shù)幅頻相頻曲線(伯德圖)
在現(xiàn)代控制系統(tǒng)的設(shè)計中,對數(shù)幅頻相頻曲線有著及其重要的應(yīng)用。對數(shù)幅頻相頻曲線由對數(shù)幅頻曲線和對數(shù)相頻曲線組成。若以空間機器人系統(tǒng)為研究對象,建立數(shù)學(xué)模型,抽象出系統(tǒng)的傳遞函數(shù)為[GsHs=kT1s+1ω2n/sT2s+1s2+2ωnξs+ω2n],選定[k=2],[T1=1],[T2=0.2],[ωn=10],[ξ=10-1/2],繪制系統(tǒng)的對數(shù)幅頻和對數(shù)相頻曲線得到圖6,與《自動控制原理基礎(chǔ)教程》[6]中第207頁圖5-43進(jìn)行比較,發(fā)現(xiàn)兩圖仿真效果相同。
※基于PYTHON的系統(tǒng)伯德圖代碼如下:
from control.matlab import *
import matplotlib.pyplot as plt
import numpy as np
num = [20,20] #分子
den = [1,7,20,70,20] #分母
sys = tf(num,den) #建傳函'(20s+20)/(s^4+7s^3+20s^2+70s+20)′
bode (sys) #繪制系統(tǒng)的Bode圖
plt.show()
3.3? ?對數(shù)幅相曲線(尼科爾斯曲線)
對數(shù)幅相曲線在控制系統(tǒng)的實際分析中同樣扮演著重要角色,依據(jù)系統(tǒng)的開環(huán)函數(shù)和閉環(huán)函數(shù)之間的關(guān)系,畫出閉環(huán)幅頻和相頻特性的等M簇、等[α]簇曲線,再以設(shè)計者給出的頻域指標(biāo)要求校正控制系統(tǒng),可以極大地降低控制系統(tǒng)的設(shè)計難度[1]。現(xiàn)以電加熱爐為對象建立溫度和電壓的傳遞函數(shù)。假定系統(tǒng)的傳遞函數(shù)為[Gs=1/(Ts+1)],其中[T=0.5],通過PYTHON語言對系統(tǒng)進(jìn)行仿真得到其對數(shù)幅相曲線圖7。將圖7與文獻(xiàn)[1]第183頁圖5-8對比,發(fā)現(xiàn)兩者的區(qū)別僅僅在于圖5-8是圖7的放大版,其他均無明顯區(qū)別。
※基于PYTHON的系統(tǒng)Nichols曲線代碼:
from control.matlab import *
import matplotlib.pyplot as plt
import numpy as np
num=[1]
den=[0.5,1]
sys = tf(num,den) #構(gòu)建的傳遞函數(shù)′1/(0.5s+1)′4A02A196-6C83-430C-8B2B-6CDFDD91B1EA
nichols(sys) #繪制系統(tǒng)的Nichols曲線
plt.show()
4? ?控制系統(tǒng)的校正
4.1? ?前饋校正
為了提高系統(tǒng)的性能,可以在系統(tǒng)中增加一個校正網(wǎng)絡(luò)[Gc=(s+z)/(s+p)],但是新增的極點可能會降低系統(tǒng)的性能,為了消除這種影響,可以再增加一個前置濾波器。以兩相伺服電動機為研究對象,抽象出數(shù)學(xué)表達(dá)式,假定被控的傳遞函數(shù)為[Gs=k/s],其中[k=1],要求系統(tǒng)的阻尼比為0.707,階躍響應(yīng)的超調(diào)量[σ≤5%],調(diào)節(jié)時間[ts≤0.6]s(秒),系統(tǒng)的閉環(huán)傳遞函數(shù)為[Φs=(k1s+k2)Gp(s)/(s2+k1s+k2)],求得參數(shù)[k1=16],[k2=128],[Gps=8/(s+8)]。在無前置濾波器時對系統(tǒng)進(jìn)行仿真得到圖8,對有前置濾波器的控制系統(tǒng)使用PYTHON語言進(jìn)行仿真得到圖9。從圖8和圖9可以明顯地看出系統(tǒng)響應(yīng)曲線的變化。
※基于PYTHON的無前置濾波器系統(tǒng)階躍響應(yīng)代碼如下:
from scipy.signal import lti,step2,impulse2
import matplotlib.pyplot as plt
s1=lti([16,128],[1,16,128]) #傳函′s1=(16s+128)/(s^2+16s+128)′
t1,y1=step2(s1) #系統(tǒng)階躍輸出
plt.plot(t1,y1,color=′red′,linewidth=1.0) #繪制響應(yīng)曲線
plt.axhline(y=1,color=′green′,linewidth=1.0,linestyle=′--′)
plt.grid()
plt.xlim((0,0.8))
plt.ylim((0,1.3))
plt.show()
※基于PYTHON的有前置濾波器系統(tǒng)階躍響應(yīng)代碼如下:
from scipy.signal import lti,step2,impulse2
import matplotlib.pyplot as plt
s1=lti(128,[1,16,128]) #創(chuàng)建傳函′s1=128/(s^2+16s+128)′
t1,y1=step2(s1) #系統(tǒng)階躍輸出
plt.plot(t1,y1,color=′blue′,linewidth=1.0) #繪制響應(yīng)曲線
plt.axhline(y=1,color=′green′,linewidth=1.0,linestyle=′--′)
plt.grid()
plt.xlim((0,0.8))
plt.ylim((0,1.2))
plt.show()
4.2? ?控制系統(tǒng)PID
PID控制被廣泛地應(yīng)用于航天器的姿態(tài)控制、衛(wèi)星的導(dǎo)航以及工業(yè)生產(chǎn)實際生活中[11]。以無源網(wǎng)絡(luò)為目標(biāo)對象,假定傳遞函數(shù)為[Gs=k/(T1s+1)v],[k=1],[T1=1],[v=3],在參數(shù)[Ti=1],[Pi=1],[Td]分別取0.2,0.5,0.8時,使用PYTHON語言仿真得到圖10。
※基于PYTHON的系統(tǒng)PID控制代碼如下:
from control.matlab import *
from matplotlib import pyplot as plt
import numpy as np
k1=1
Ti=1
Td=0.2
for i in range(1,4):
num=[1]
den1=[1,3,3,1]
sys1=tf(num,den1)
sys2=tf(k1*[Ti*Td,Ti,1],[Ti,0])
sys3=feedback(sys1*sys2,1,-1)
yout,t1=step(sys3)
plt.grid()
if Td==0.2:
plt.plot(t1,yout,color=′red′,label=′Td=0.2′)
if Td==0.5:
plt.plot(t1,yout,color=′blue′,label=′Td=0.5′)
if? Td==0.8:
plt.plot(t1,yout,color=′black′,label=′Td=0.8′)
plt.legend()
plt.xlim((0,45))
plt.ylim((0,1.5))
Td=Td+0.3
5? ? ?結(jié)論
對控制系統(tǒng)從時域、復(fù)域、頻域以及系統(tǒng)的校正四個方面,分別選用不同的線性系統(tǒng)模型進(jìn)行仿真。通過與參考文獻(xiàn)中的仿真圖進(jìn)行比較,發(fā)現(xiàn)PYTHON語言能夠勝任自動控制原理仿真的需求,為大多數(shù)《自動控制原理》課程的學(xué)習(xí)者提供了另一種系統(tǒng)仿真的方式。但是PYTHON語言與MATLAB相比,在圖形化編程中還是處于弱勢地位,特別是MATLAB軟件中圖形化編程模塊Simulink可以快速幫助沒有基礎(chǔ)的學(xué)習(xí)者建立對控制系統(tǒng)的感性認(rèn)識,這是PYTHON語言目前無法做到的,這也是未來PYTHON在控制系統(tǒng)仿真領(lǐng)域的發(fā)展方向。
[參考文獻(xiàn)]
[1] 胡壽松. 自動控制原理(第6版)[M]. 北京: 科學(xué)出版社, 2013.
[2] 肖理慶. 基于《自動控制原理》期末考試軟件的課程考核改革[J]. 廊坊師范學(xué)院學(xué)報(自然科學(xué)版), 2020, 20(3): 120-122+125.
[3] Liang Y D. Python語言程序設(shè)計[M]. 李娜, 譯, 北京: 機械工業(yè)出版社, 2013.
[4] 嵩天,禮欣,黃天羽. Python語言程序設(shè)計基礎(chǔ)(第2版)[M]. 北京: 高等教育出版社, 2017.
[5] 張若愚.Python科學(xué)計算[M]. 北京: 清華大學(xué)出版社, 2012.
[6] 李琴, 彭祖群, 楊鈞. Python在自動控制原理實驗中的應(yīng)用[J]. 信息周刊, 2019(36):138-139.
[7] 胡壽松.自動控制原理基礎(chǔ)教程(第4版)[M]. 北京: 科學(xué)出版社, 2017.
[8] 宋申民, 陳興林. 自動控制原理典型例題解析與習(xí)題精選[M]. 北京: 高等教育出版社, 2004.
[9] Franklin G F, Powell J D, Emami-Naeini A. 自動控制原理與設(shè)計(第5版)[M]. 李中華, 張雨濃, 譯, 北京: 人民郵電出版社, 2007.
[10] 王正林,王勝開,陳國順, 等. MATLAB/Simulink與控制系統(tǒng)仿真(第4版)[M]. 北京: 電子工業(yè)出版社, 2017.
[11] 張德豐. MATLAB自動控制系統(tǒng)設(shè)計[M]. 北京: 機械工業(yè)出版社, 2010.4A02A196-6C83-430C-8B2B-6CDFDD91B1EA