Python 高频正弦函数的优化

Python 高频正弦函数的优化,python,optimization,scipy,Python,Optimization,Scipy,我正在使用Python 2.7。我想知道,当目标是高频正弦波时,为什么SciPy的优化函数不收敛到正确的函数 import numpy as np from scipy import optimize test_func = lambda x: 5*np.sin(15*x+3)+1 t = linspace(0,25,100000) y_t = test_func(t) plot(t,y_t) fitfunc = lambda p, x: p[0]*np.sin(p[1]*x+p[2])+p

我正在使用Python 2.7。我想知道,当目标是高频正弦波时,为什么SciPy的优化函数不收敛到正确的函数

import numpy as np
from scipy import optimize

test_func = lambda x: 5*np.sin(15*x+3)+1
t = linspace(0,25,100000)
y_t = test_func(t)
plot(t,y_t)

fitfunc = lambda p, x: p[0]*np.sin(p[1]*x+p[2])+p[3]
errfunc = lambda p, x, y: fitfunc(p, x) - y 

p0 = [max(y_t),10,2,0]
p1, success = optimize.leastsq(errfunc, p0, args=(t,y_t))


plot(t,fitfunc(p1,t))
人们可以清楚地看到,最终的解决方案明显偏离了目标。我做错什么了吗?错误函数在这里适应不良吗


感谢所有的输入

您的问题是,残差函数中有大量的局部极小值,作为相对于其真实值的相位和频率偏移;如果对相位和频率没有很好的初始猜测,您将收敛为一,而不是陷入更深的全局最小值:

如果你没有关于相位和频率的更多信息,你可以通过数据的FFT来估计它们,或者重写你的公式

Asin(bx+phi)+d=Acos(phi)sin(bx)+Asin(phi)cos(bx)+d

它只有一个非线性参数(b):可以使用网格搜索b,并对其余参数(a1=Acos(phi)、a2=Asin(phi)和d)进行更快、更可靠的线性最小二乘拟合

以下是rms残差随频率变化的曲线图,
b
显示了各种最小值:


嗨,xnx,非常感谢。我通过网格搜索解决了这个问题。当用不同的拟合函数频率绘制成本函数时,大量的局部极小值变得非常清晰。很高兴这有帮助:我刚刚添加了一个快速的绘图,向所有对未来感兴趣的人说明了这个问题。是的,我得到了完全相同的绘图。当做