You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

正弦曲线拟合效果不佳求助:如何获取精准拟合结果

正弦数据集曲线拟合问题及解决方案

我正在对两个具有正弦特性的数据集进行曲线拟合,使用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()

拟合结果

拟合结果1
拟合结果2

从图中可见,两个数据集均呈现明显的正弦特征,但拟合效果较差。我曾尝试删除拟合函数中的一个参数,但并未解决问题。现寻求解决方案,期望得到覆盖0-1区间、包含偏移量的精准正弦拟合曲线。


解决方案

  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)
    
  2. 约束参数范围
    通过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。

  3. 优化数据处理
    原循环+np.append效率极低,改用numpy切片直接提取数据:

    ang = datos[:, 0]
    fib1 = datos[:, 1]
    fib2 = datos[:, 2]
    
  4. 评估拟合质量
    绘制残差图验证拟合效果:

    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 22:39:58