如何用Fourier级数拟合非规则周期性脉冲电压数据?
类矩形脉冲周期数据的Fourier级数拟合失败求助
我有一组周期性非规则的类矩形/脉冲形状数据,理论上Fourier级数可以拟合任意形状,但尝试多种方法均未成功:
- 试过4/8/12项余弦分量的Fourier级数,拟合结果完全匹配不上目标形状,尤其完全忽略了-0.3V以下的向下峰值;
- 也尝试过任意数量多项式的线性组合或通用Fourier级数近似,但因理解不足未成功。
以下是我用4项余弦Fourier级数拟合的代码:
import numpy as np from scipy.optimize import curve_fit import matplotlib.pyplot as plt # 定义绘图时间范围,最终函数需覆盖-5e-3到5e-3,给定数据点在(0,4e-3)区间内 t = np.linspace(-5e-3,5e-3,1000) # 手动从示波器图像估算的数据点,每个元组为(时间t,电压U),对应充放电周期脉冲信号 coord1 = [(0,-0.3),(0.185e-3,-0.29775),(0.21e-3,-0.2785),(0.3e-3,-0.27),(0.4e-3,-0.2645),(0.5e-3,-0.26), (0.57e-3,-0.259),(0.595e-3,-0.27),(0.605e-3,-0.28),(0.623e-3,-0.3015),(0.64e-3,-0.316),(0.675e-3,-0.31), (0.7e-3,-0.305),(0.75e-3,-0.3),(0.8e-3,-0.298),(0.9e-3,-0.3),(1e-3,-0.3),(1.2e-3,-0.3),(1.24e-3,-0.279), (1.3e-3,-0.27),(1.4e-3,-0.266),(1.485e-3,-0.259),(1.58e-3,-0.2545),(1.62e-3,-0.269),(1.625e-3,-0.28),(1.65e-3,-0.29), (1.67e-3,-0.3125),(1.7e-3,-0.31),(1.745e-3,-0.301),(1.8e-3,-0.299),(1.985e-3,-0.2985),(2.21e-3,-0.297), (2.25e-3,-0.28),(2.3e-3,-0.2675),(2.4e-3,-0.26),(2.5e-3,-0.2575),(2.6e-3,-0.255),(2.65e-3,-0.26), (2.66e-3,-0.269),(2.665e-3,-0.279),(2.68e-3,-0.3),(2.72e-3,-np.pi/10),(2.75e-3,-0.305),(2.8e-3,-0.3), (3e-3,-0.3),(3.22e-3,-0.299),(3.3e-3,-0.298),(3.33e-3,-0.279),(3.4e-3,-0.268),(3.45e-3,-0.265),(3.5e-3,-0.262), (3.55e-3,-0.26),(3.62e-3,-0.2575),(3.73e-3,-0.2585),(3.745e-3,-0.269),(3.75e-3,-0.28),(3.755e-3,-0.3), (3.76e-3,-0.314),(3.795e-3,-0.309),(3.85e-3,-0.305),(3.92e-3,-0.3),(4e-3,-0.295)] # 提取时间和电压数组 t1 = np.array([point[0] for point in coord1]) U1 = np.array([point[1] for point in coord1]) # 4项余弦Fourier级数拟合函数,U0为y轴偏移量 def fou4(x,tau,a1,a2,a3,a4,U0): return a1*np.cos(np.pi/tau *x) + a2*np.cos(2*np.pi/tau *x) + a3*np.cos(3*np.pi/tau *x) + a4*np.cos(4*np.pi/tau *x) + U0 # 使用curve_fit拟合,p0为初始参数猜测 para1,pcov1 = curve_fit(fou4,t1,U1,p0=[0.0005,1,1,1,1,-0.3]) # 绘图:数据点+拟合曲线 fig,ax = plt.subplots(figsize=(10,10)) ax.plot(t1,U1,marker="x",ls="--",alpha=0.5,markersize=6,color="blue",label="通道2手动估算点") ax.plot(t,fou4(t,*para1),color="#00DDDD",alpha=0.85,ls="-",label=r"通道2拟合曲线") # 设置坐标轴范围以放大数据区域,方便对比 ax.set(title="2023/02/09 15:24图像拟合",xlabel="时间 [s]",ylabel="电压 [V]",xlim=(-0.0005,0.005),ylim=(-0.35,-0.25)) ax.grid() ax.legend() plt.show()
拟合结果和数据点偏差极大,连-0.3V以下的向下峰值都完全没体现。我原本以为是4项精度不够,但换成8项或12项后拟合效果反而更差。怀疑是初始参数p0或者边界设置有问题,但不知道该怎么调整。
内容的提问来源于stack exchange,提问作者Jay
相关产品推荐
相关产品推荐

