1
我想將下面附帶的數據與-a*sin(b*x + c)
(或可能也可以使用-a*sin(2*x)
)與a b c
作爲要確定的值的函數擬合。我使用了scipy.optimize.curve_fit
,但效果不好(如您在image中看到的那樣)。我該如何改進?在Python中擬合正弦數據
代碼:
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)
擬合週期性函數總是很棘手。更改頻率「b」的初始值以更好地匹配預期頻率。 – DyZ
您的數據看起來不像一個正弦曲線。也許兩個高斯的疊加會更好。或者,如果你知道你的數據應該是正弦曲線 - 那麼你的實驗是不好的。 –
你能修好你的縮進嗎? – jacoblaw