scipy.optimize高频正弦函数

时间:2015-05-05 13:10:44

标签: 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[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))

可以清楚地看到最终解决方案明显偏离目标。难道我做错了什么 ?这里的错误功能是否适用?

感谢任何输入

1 个答案:

答案 0 :(得分:3)

你的问题是你的残差函数中存在大量的局部最小值,因为相位和频率相对于它们的真实值而变化;没有对阶段和频率进行真正良好的初步猜测,你将会融入一个而不是陷入更深层次的全局最小值:

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

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

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

这是有效值残差图,频率b变化,显示各种最小值:

enter image description here