在Python中拟合正弦数据

时间:2017-07-19 21:44:28

标签: python numpy scipy

我希望将下面附带的数据与-a*sin(b*x + c)形式的函数(或者也可以与-a*sin(2*x))一起使用a b c作为要确定的值。我使用了scipy.optimize.curve_fit,但效果并不好(正如您在image中看到的那样)。我怎样才能改善这个?

代码:

import numpy as np
import matplotlib.pylab as plt

data = open('pruebaData.dat', 'r')
lines = data.readlines()[1:]
x = []                
y = []

for line in lines:
pos = line.split()
if pos != []:
    x.append(float(pos[0]))
    y.append(float(pos[1]))

z = []
for k in range(len(x)):
   z.append(np.deg2rad(x[k]))

valX = np.asarray(z)
valY = np.asarray(y)

from scipy.optimize import curve_fit
def fitFunc(X,a,b,c):
   return (- a*np.sin(b*X + c))

fig = plt.figure(2, figsize = (10,8))

init_vals = [1,1,1]    
best_vals, covar = curve_fit(fitFunc, valX, valY, p0=init_vals,  maxfev = 15000)
line1 = plt.plot(x, y, 'o', color = 'k', ms = 6)
fig2 = plt.plot(x,fitFunc(valX,best_vals[0],best_vals[1], best_vals[2]), '-
', color = 'k', lw = 1)
print('PARAMETERS:',best_vals)

plt.ylabel(r'DATA Y',fontsize=30)
plt.xlabel(r'DATA X',fontsize=30)
plt.xlim(min(x),max(x))
locs,labels = plt.xticks()
plt.xticks(locs, fontsize = 20)
locs,labels = plt.yticks()
plt.yticks(locs, fontsize = 20)
plt.savefig('prueba.png', dpi = 500)

PruebaData.dat

1 个答案:

答案 0 :(得分:4)

实际上,我没有看到这是一个不合适的......对于一个正弦。你期待一个双峰功能吗?如果是这样,您需要"解释"通过提供与您的健康感相匹配的错误函数,向fit函数提供该函数。是的,你可以用2.5个正弦波周期更好地拟合这些数据的中心部分,但波的左右两端会再次向上,而数据趋势明显下降。这种不匹配是给你半周期波的原因。

您可以尝试使用错误函数,例如sqrt(错误)而不是错误^ 2。双模高斯分布更适合这种情况。如果你真的需要正弦曲线,可以考虑傅里叶变换,它会给你两个正弦波的组合(和) - 以及许多较小幅度的波来计算噪声。