Numpy绘制复方程曲线结果异常问题排查
解决Python绘制对数轴曲线与预期不符的问题
我看了你这段用于图形分析的曲线绘制代码,确实问题出在未处理复数运算上——你提到的分母存在虚部是对的,这类频率响应类的方程本质是复域传递函数,忽略虚部直接做实数计算,自然会和参考图的橙色曲线对不上。
问题核心分析
你当前的代码里,Mg_Dem的计算是纯实数运算,但原方程的分母应该包含虚数单位(Python中用1j表示)。你需要在复平面内计算传递函数,再取它的幅值(模长),而不是简单做实数除法后取绝对值。
修改后的完整代码
import numpy as np import matplotlib.pyplot as plt # 设定测试参数 Ln = 5 Qe = 0.5 # 生成x轴数据:对数刻度范围0.1到10(对数轴无法取0,所以从0.1开始) fn = np.linspace(0.1, 10, 1000) # 修正复域下的分子分母计算 Mg_Num = Ln * fn**2 # 分母加入虚部,还原原方程的复域形式 Mg_Dem = (Ln + 1) * (fn**2 - 1) + 1j * (fn**2 - 1) * fn * Qe * Ln # 计算复数的模长(即幅值),这才是正确的Mg值 Mg = np.abs(Mg_Num / Mg_Dem) # 绘图优化,更贴合参考图风格 plt.plot(fn, Mg) plt.xscale('log') plt.xlabel('fn (log scale)') plt.ylabel('Mg') plt.title(f'Frequency Response Curve (Ln={Ln}, Qe={Qe})') plt.grid(True, which="both", ls="-") # 添加网格,方便对比参考图 plt.show()
关键修改说明
- 复域运算修正:在
Mg_Dem中加入1j,还原了原方程的复域传递函数形式,这是曲线匹配参考图的核心。 - 幅值计算:用
np.abs()计算复数数组的模长,比原生abs()更适合批量处理numpy数组,结果也更准确。 - 绘图优化:添加了坐标轴标签、标题和网格,让你更容易和参考图进行对比验证。
运行这段代码后,生成的曲线应该就和参考图中Ln=5、Qe=0.5对应的橙色曲线完全一致了。
内容的提问来源于stack exchange,提问作者RGB Engineer
相关产品推荐
相关产品推荐

