我尝试在Python中使用Matplotlib在Bode图中绘制电路的频率响应。该电路的传递函数生成恒定的20 dB和180度响应。最初,当我在Matplotlib中尝试此操作时,我得到的是-180度响应。我发现我可以在control.bode()
中指定wrap_phase=True
来解决这个问题。然而,我后来意识到,为了在我的图上绘制特定的点(绘制测量的响应),我需要设置plot=False
,这样我就可以创建自己的图并管理自己的点(如果这是不正确的,使它更困难,请让我知道).下面是我使用的代码:
import matplotlib.pyplot as plt
import numpy as np
import control
w = np.logspace(1,8,200)
H = control.tf(-10, 1)
mag, phase, omega = control.bode(H, w, dB=True, wrap_phase=True, plot=False)
freq_points = [628.318, 1256.636, 3141.59, 6283.18, 12566.36, 31415.9, 62831.8, 125663.6, 314159, 628318]
mag_points = [20, 20, 20, 20, 20, 20, 20, 19.172, 12.857, 7.824]
phase_points = [179, 180, 179, 178, 177, 175, 169, 148, 115, 101]
plt.figure(1)
plt.subplot(2, 1, 1)
plt.semilogx(omega, mag, label='Magnitude (dB)')
plt.scatter(freq_points, mag_points, color='red', marker='o', label='Points to Highlight')
plt.legend()
# Plot the phase plot
plt.subplot(2, 1, 2)
plt.semilogx(omega, phase, label='Phase (degrees)')
plt.scatter(freq_points, phase_points, color='blue', marker='o', label='Points to Highlight')
plt.legend()
# Show the Bode plots
plt.tight_layout()
plt.show()
现在我设置了plot=False
,指定db=True
和wrap_phase=True
没有任何效果。也就是说,我再次得到10 dB的幅度线。因此,虽然我测量的响应在正确的位置,但我的实际响应却不是。对此有什么解决办法吗?感谢任何帮助。
下面是我生成的结果的图像:
请注意,如果我设置plot=True
并删除所有无意义的子图,我会得到下面所需的图(但我不认为我可以在这些图上绘制单个点)。
1条答案
按热度按时间dldeef671#
假设你正在使用python-control from this github page。显然,你正在以旧的方式使用这些函数。你可以探索the documentation来找出库的新方法。文档现在建议使用
mag, phase, omega = control.frequency_response(H, w)
来获取参数。如果你想用这些单位绘图,你仍然需要转换为dB(control.mag2db(mag)
)和/或度。control.bode
始终以弧度输出相位(deg=True
仅在创建绘图时作为参数使用)。使用np.degrees(phase)
,您可以将相位转换为度。您可以使用
plt.grid(which='both')
来显示主刻度线和次刻度线的网格线。