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

时间:2019-07-17 13:19:35

标签: python matplotlib plot system

我想用python控制系统库绘制系统的波特图。这很容易。问题是边际图。绘制相位裕度没有问题。但是如何绘制增益裕度?

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

import control as cn
%matplotlib notebook
import matplotlib.pyplot as 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
gm, pm, wg, wp = cn.margin(L)

_,_,_ = cn.bode(L,dB=True)
plt.axvline(x = wp,color='r')

2 个答案:

答案 0 :(得分:2)

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

{{1}}

答案 1 :(得分:0)

control的0.8版本开始,bode_plot函数(也别名为bode)可以选择打印边距。

import control

sys = control.tf([1], [1, 1]) # example transfer function

control.bode_plot(sys, margins=True)
# or
control.bode(sys, margins=True)

但是,这种方法并不总是看起来像我想要的,特别是在具有多个传递函数的情况下。如果您想要更多控制(双关语),则可以执行与@ monte-carlo的答案类似的操作,但是可以直接在bode_plot / bode命令生成的图上绘制边距。

import control
import matplotlib as plt

sys = control.tf([1], [1, 1]) # example transfer function

control.bode(sys, dB=True)
gm, pm, wg, wp = control.margin(sys)

fig = plt.gcf() # Get a handle to the current figure (the bode plot)
mag_axis, phase_axis = fig.axes # Get the magnitude and phase subplots

mag_axis.plot([wg, wg], [0, control.mag2db(gm)])
phase_axis.plot([wp, wp], [-180, pm])