matplotlib 在波特图上绘制特定点

rsaldnfx  于 2023-10-24  发布在  其他
关注(0)|答案(1)|浏览(118)

我尝试在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=Truewrap_phase=True没有任何效果。也就是说,我再次得到10 dB的幅度线。因此,虽然我测量的响应在正确的位置,但我的实际响应却不是。对此有什么解决办法吗?感谢任何帮助。
下面是我生成的结果的图像:

请注意,如果我设置plot=True并删除所有无意义的子图,我会得到下面所需的图(但我不认为我可以在这些图上绘制单个点)。

dldeef67

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')来显示主刻度线和次刻度线的网格线。

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.grid(which='both')
plt.legend()

# Plot the phase plot
plt.subplot(2, 1, 2)
plt.semilogx(omega, np.degrees(phase), label='Phase (degrees)')
plt.scatter(freq_points, phase_points, color='blue', marker='o', label='Points to Highlight')
plt.grid(which='both')
plt.legend()

# Show the Bode plots
plt.tight_layout()
plt.show()

相关问题