在GNUPLOT中拟合指数阻尼正弦函数f(x)=A*exp(-b*x)*sin(2πx/T+φ)+S的问题
GNUPLOT指数阻尼正弦函数拟合优化方案
非线性阻尼正弦拟合效果差、收敛到直线的核心原因是非线性拟合对初始值敏感度极高,容易陷入局部最优,可按以下步骤调整:
- 先手动估算合理初始值,这是决定拟合成败的核心:
- 直流偏置S:直接计算所有采样点y值的平均值,或取曲线尾段平稳区域的y值均值即可。
- 周期T:从实测曲线中取两个相邻波峰/波谷的x坐标差值,就是T的初值,误差控制在10%以内即可。
- 初始振幅A:取第一个波峰的y值减去S,就是A的近似值。
- 阻尼系数b:取间隔N个周期的两个波峰的振幅A1、A2,代入公式
b = ln(A1/A2)/(N*T)计算即可得到准确初值。 - 相位phi:代入x=0附近的y值,由
y(0)-S = A*sin(phi)反算得到phi的初值范围。
- 调整拟合收敛参数,避免提前终止迭代:
运行拟合前先执行以下命令拉高迭代上限、收紧收敛阈值:set fit maxiter 1000 set fit limit 1e-6 - 增加参数范围约束,避免参数跑飞:
给参数设置合理的上下界,防止拟合过程中参数偏离物理意义,例如:set fit bounds A > 0, b > 0, T > 估算周期*0.8, T < 估算周期*1.2, phi >= 0, phi <= 2*pi - 分步拟合降低局部最优概率:
可以先固定估算出来的T和S,只拟合A、b、phi三个参数,等到收敛后再放开所有参数联合拟合,大幅降低收敛到直线这类局部最优解的概率。
如果数据存在明显噪声,还可以给拟合添加权重,降低尾段平稳区域或噪声明显区域的拟合权重,让拟合优先匹配前段的振荡特征。
内容的提问来源于stack exchange,提问作者Majkl
相关产品推荐
相关产品推荐

