如何在python bode绘图中绘制边距?

如何在python bode绘图中绘制边距?,python,matplotlib,plot,system,Python,Matplotlib,Plot,System,我想用python控制系统库绘制一个系统的bode图。这相当容易。问题在于利润率的分布。绘制相位裕度没有问题。但是,我如何计算利润率呢 到目前为止,这是我代码的一部分: 作为cn的导入控制 %matplotlib笔记本 将matplotlib.pyplot作为plt导入 Ks=2 T1=5 T2=0.3 T3=0.1 Gs=cn.tf(Ks[T1*T2*T3,T1*T2+T1*T3+T2*T3,T1+T2+T3,1]) Vr=1 Tn=1 plt.close() R=cn.tf([Vr*Tn,V

我想用python控制系统库绘制一个系统的bode图。这相当容易。问题在于利润率的分布。绘制相位裕度没有问题。但是,我如何计算利润率呢

到目前为止,这是我代码的一部分:

作为cn的导入控制
%matplotlib笔记本
将matplotlib.pyplot作为plt导入
Ks=2
T1=5
T2=0.3
T3=0.1
Gs=cn.tf(Ks[T1*T2*T3,T1*T2+T1*T3+T2*T3,T1+T2+T3,1])
Vr=1
Tn=1
plt.close()
R=cn.tf([Vr*Tn,Vr],[1,0])
L=Gs*R
总经理、项目经理、工作组、可湿性粉剂=净利润(L)
_,uu,u=cn.bode(L,dB=True)
plt.axvline(x=wp,color='r')

这不是最优雅的解决方案,但它对我很有用

###Import modules
import numpy as np
import control as ctl
import matplotlib.pyplot as plt

##Functions
def plot_margins(sys):
    mag,phase,omega = ctl.bode(sys,dB=True,Plot=False)
    magdB = 20*np.log10(mag)
    phase_deg = phase*180.0/np.pi
    Gm,Pm,Wcg,Wcp = ctl.margin(sys)
    GmdB = 20*np.log10(Gm)
    ##Plot Gain and Phase
    f,(ax1,ax2) = plt.subplots(2,1)
    ax1.semilogx(omega,magdB)
    ax1.grid(which="both")
    ax1.set_xlabel('Frequency (rad/s)')
    ax1.set_ylabel('Magnitude (dB)')
    ax2.semilogx(omega,phase_deg)
    ax2.grid(which="both")
    ax2.set_xlabel('Frequency (rad/s)')
    ax2.set_ylabel('Phase (deg)')
    ax1.set_title('Gm = '+str(np.round(GmdB,2))+' dB (at '+str(np.round(Wcg,2))+' rad/s), Pm = '+str(np.round(Pm,2))+' deg (at '+str(np.round(Wcp,2))+' rad/s)')
    ###Plot the zero dB line
    ax1.plot(omega,0*omega,'k--',lineWidth=2)
    ###Plot the -180 deg lin
    ax2.plot(omega,-180+0*omega,'k--',lineWidth=2)
    ##Plot the vertical line from -180 to 0 at Wcg
    ax2.plot([Wcg,Wcg],[-180,0],'r--',lineWidth=2)
    ##Plot the vertical line from -180+Pm to 0 at Wcp
    ax2.plot([Wcp,Wcp],[-180+Pm,0],'g--',lineWidth=2)
    ##Plot the vertical line from min(magdB) to 0-GmdB at Wcg
    ax1.plot([Wcg,Wcg],[np.min(magdB),0-GmdB],'r--',lineWidth=2)
    ##Plot the vertical line from min(magdB) to 0db at Wcp
    ax1.plot([Wcp,Wcp],[np.min(magdB),0],'g--',lineWidth=2)
    return Gm,Pm,Wcg,Wcp

#%%%Actuator Dynamics
G = ctl.tf([1],[1,2,1,0])
Gm,Pm,Wcg,Wcp=plot_margins(G)
plt.show()

control
的0.8版开始,该函数(别名为
bode
)具有打印边距的选项

导入控制
sys=control.tf([1],[1,1])#传递函数示例
控件。bode_图(sys,边距=真)
#或
control.bode(sys,margins=True)
然而,这种方法并不总是像我所希望的那样,特别是对于多个传递函数。如果你想要更多的控制(双关语),你可以做一些类似于@monte-carlo答案的事情,但是直接在
bode_plot
/
bode
命令生成的绘图上绘制边距

导入控制
将matplotlib作为plt导入
sys=control.tf([1],[1,1])#传递函数示例
control.bode(sys,dB=True)
gm、pm、wg、wp=控制裕度(系统)
fig=plt.gcf()#获取当前图形的句柄(bode图)
mag_轴,相位_轴=图轴#获取幅值和相位子批次
磁轴图([wg,wg],[0,对照.mag2db(gm)])
相位轴图([wp,wp],-180,pm])