python control控制系统库
python实现自动控制的一些常用函数
python control控制系统库
参考:Docs » Python Control Systems Library
系统创建
①control.tf(num, den) 传递函数方式
control.tf([1,2],[3,4]) # 方式1 通过分子分母系数创建
s = control.tf('s') # 方式2 先创建传递函数为s
sys = (s+2)/(s**2+3*s+4) # 再通过s的运算创建
②control.ss(A, B, C, D) 状态空间方式
③control.frd(‘响应’, ‘频率’) 频率响应方式
个人理解这种方式,是用测量得到的源数据做为输入
系统互连
①control.series(sys1, sys2,…) 系统串联
②control.parallel(sys1, sys2,…) 系统并联
③control.feedback(sys1, sys2) 负反馈连接,sys1是前向通路,sys2是反馈通路
④control.negate(sys1) 系统取反,即-sys1
复频域绘图
伯德图
①control.bode_plot(syslist) 绘制伯德图/波特图(幅频+相频曲线)
参数:
omega=np.logspace(start=-1,stop=1,num=200) 自定义频率范围
dB=1 幅度以对数坐标显示
Hz=1 频率以Hz为单位,默认为弧度rad/s
magrins=1 显示增益相位裕量
# 绘制一个低通加一个高通并联系统的伯德图
import control as ctrl
import matplotlib.pyplot as plt
import math
pi = math.pi
sys1 = ctrl.tf(10*2*pi,[1,10*2*pi]) # 低通,截止频率10,注意默认为弧度制
sys2 = ctrl.tf([1,0],[1,100*2*pi]) # 高通,截止频率100
sys3 = ctrl.parallel(sys1,sys2) # 两系统并联
ctrl.bode_plot(sys3,dB=1,Hz=1) # 绘制伯德图
plt.show()
奈奎斯特图
②control.nyquist_plot(syslist) 绘制奈奎斯特图 / H轨迹图(H contour)
伯德图的不足:只考虑到了s=jw的情况,即s只在正虚轴的情况;
而其他情况(σ≠0和负虚轴)可以用奈奎斯特图分析。(傅里叶到拉普拉斯变换)
了解奈奎斯特图需要了解的基础知识。。。
㈠ 开环闭环系统:考虑到一个反馈系统如下:
开环传递函数(环路增益) | 闭环传递函数 | 闭环传递函数的分母项 |
---|---|---|
G ( s ) ∗ H ( s ) G(s)*H(s) G(s)∗H(s) | G ( s ) 1 + G ( s ) ∗ H ( s ) \frac {G(s)} {1+G(s)*H(s)} 1+G(s)∗H(s)G(s) | 1 + G ( s ) ∗ H ( s ) 1+G(s)*H(s) 1+G(s)∗H(s) |
这个分母项 1+G(s)*H(s) 的特性:
✱它的极点 = 开环传递函数(环路增益)的极点
✱它的零点 = 闭环传递函数的极点
所以通过研究1+G(s)*H(s)的零极点,就可推断出开环和闭环系统的极点。(当然你也可以直接研究闭环传递函数,但是计算起来确实要比1+G(s)*H(s)要复杂一点)
㈡ 柯西幅角原理
若s的封闭轨迹为顺时针方向(这个轨迹可以是s平面的任意区域,不再限定在正虚轴,即伯德图对应的轨迹),且包围H(s)的P个极点和Z个零点,那么H(s)的H轨迹图将以相同的方向绕原点旋转Z-P圈 。
参考:拉扎维,模块CMOS集成电路设计,第二版,10.8.2~10.8.4
常规的系统稳定性判据:极点位于s平面的左半平面;反过来想,如果构建一个s在右半平面的轨迹,如果不包含极点,也可以判定系统是稳定的。
综合上述:
如果闭环系统稳定:s取右半平面区域对应的H轨迹图:不包含闭环系统极点 ≡ 不包含1+G(s)*H(s)的零点 ≡ G(s)*H(s)不包含(-1,0)点
所以,可以通过开环系统(也即环路增益)G(s)*H(s)的H轨迹图是否通过(-1,0)这个点来判定闭环系统是否稳定。
# 绘制开环函数为典型二阶系统的奈奎斯特图
import control as ctrl
import matplotlib.pyplot as plt
sys4 = ctrl.tf(100,[1,2*(-0.1)*10,100]) # 阻尼比-0.1,自然谐振频率10
ctrl.nyquist_plot(sys4)
plt.show()
这个图没有过(-1,0)这个点,所以尽管开环系统不稳定(因为阻尼比为负),但闭环系统是稳定的。(但最好不要太接近这个点)
根轨迹图
③control.root_locus(syslist) 绘制奈奎斯特图
假设一个系统的反馈量为常数:
当K从0变化到∞时,闭环系统的(稳定性)极点(也就是1+KH(s)=0的根)也随着变化,也就是所谓的根轨迹图。
假设H(s)=N(s)/D(s)
1+KH(s)=0 可以化简为 D(s)+K*N(s)=0
当K=0时,即D(s)=0,代表前向系统极点;(K=0代表反馈断开,电路系统中代表前向放大器)
当K=∞时,即N(s)=0,代表前向系统零点;(电路系统中反馈一般是无源器件分压,K=0➞1,K=1时为单位增益放大器,此时电路带宽=GBW,判断相位裕量的频点最高,此时相位裕量最小,虽然电路中K>1不常见,但可以通过此,预见闭环系统的极点变化的趋势)
所以随着K从0变化到∞,闭环系统的极点变化规律为:从前向系统H(s)的极点指向前向系统H(s)的零点。
# 绘制根轨迹图,
import control as ctrl
import matplotlib.pyplot as plt
s = ctrl.tf('s')
sys5 = (s+100)/(s*s*s+60*s*s+1100*s+6000) #(s+100)/((s+10)*(s+20)*(s+30))
ctrl.root_locus(sys5)
plt.show()
根轨迹图如下:
从图中可以看到,随着K的增加,闭环系统的极点跑到了右半平面,系统会变得不稳定。
零极点图
④control.pzmap(sys)
就简单显示零极点位置图
时域响应
① control.step_response(sys) 阶跃响应
② control.impulse_response(sys) 冲激响应
③ 其它时域响应待研究
④
⑤
import control as ctrl
import matplotlib.pyplot as plt
sys6 = ctrl.tf(1,[1,0.2,1]) # 二阶系统,自然谐振频率为1,阻尼比为0.1,衰减振荡
t1,y1 = ctrl.step_response(sys6)
t2,y2 = ctrl.impulse_response(sys6)
plt.subplot(121)
plt.plot(t1, y1)
plt.title('step response')
plt.ylabel('Amplitude')
plt.xlabel('time (s)')
plt.grid(1)
plt.subplot(122)
plt.plot(t2, y2)
plt.title('impulse response')
plt.ylabel('Amplitude')
plt.xlabel('time (s)')
plt.grid(1)
plt.show()
更多推荐
所有评论(0)