正弦曲线拟合效果不佳求助:如何获取精准拟合结果
正弦数据集曲线拟合问题及解决方案
我正在对两个具有正弦特性的数据集进行曲线拟合,使用Python结合numpy、matplotlib及scipy.optimize.curve_fit工具实现,当前代码如下:
import numpy as np import matplotlib.pyplot as plt from scipy.optimize import curve_fit # Define sinusoidal function def test(x,a,b,c,d): return a*np.sin(b*x+c)+d # Grab data datos = np.loadtxt('data_12_rot_norm',dtype=float) # Convert data into vectors ang = []; fib1 = []; fib2 = [] for i in range(datos.shape[0]): ang = np.append(ang,datos[i][0]) fib1 = np.append(fib1,datos[i][1]) fib2 = np.append(fib2,datos[i][2]) # Perform the curve fit param,param_cov = curve_fit(test,ang,fib1) # fib1 is the variable, repeat for fib2 # Print the fitted parameters print("Sine function coefficients:") print(param) print("Covariance of coefficients:") print(param_cov) # Plot the data and the fitted curve plt.scatter(ang,fib1,s=5,color='blue',label='Data') # idem plt.plot(ang,test(ang, *param),linewidth=1,color='red',label='Fit') plt.ylim(0,1) plt.legend() plt.show()
拟合结果


从图中可见,两个数据集均呈现明显的正弦特征,但拟合效果较差。我曾尝试删除拟合函数中的一个参数,但并未解决问题。现寻求解决方案,期望得到覆盖0-1区间、包含偏移量的精准正弦拟合曲线。
解决方案
提供初始参数猜测
curve_fit默认初始参数全为1,容易陷入局部最优。根据数据范围(y∈[0,1]),给出合理初始值:- 振幅
a:0.5(正弦波动范围±0.5,加偏移后覆盖0-1) - 角频率
b:根据数据周期估算(比如数据有1个完整周期则设为1) - 相位
c:0 - 偏移量
d:0.5
修改拟合代码:
initial_guess = [0.5, 1, 0, 0.5] param, param_cov = curve_fit(test, ang, fib1, p0=initial_guess)- 振幅
约束参数范围
通过bounds限制参数在合理区间,避免拟合出不符合预期的结果:bounds = ([-0.5, 0, -np.pi, 0], [0.5, 10, np.pi, 1]) param, param_cov = curve_fit(test, ang, fib1, p0=initial_guess, bounds=bounds)这里限制振幅
a在±0.5,角频率b为正,相位c在[-π, π],偏移量d在0-1。优化数据处理
原循环+np.append效率极低,改用numpy切片直接提取数据:ang = datos[:, 0] fib1 = datos[:, 1] fib2 = datos[:, 2]评估拟合质量
绘制残差图验证拟合效果:residuals = fib1 - test(ang, *param) plt.scatter(ang, residuals, s=5, color='green') plt.axhline(y=0, color='red', linestyle='--') plt.title('Fit Residuals') plt.show()
内容的提问来源于stack exchange,提问作者jvalzert
相关产品推荐
相关产品推荐

