将正弦曲线拟合到我在 python 中的数据,matplotlib

fit a sine curve to my data in python, matplotlib

Here is my data in excel 我想用正弦曲线拟合这些数据

这是我的代码,

#Fitting function
def func(x, offset, A, freq, phi):
    return offset + A * np.sin(freq * x + phi)

#Experimental x and y data points   
# test_df is the input excel df 
x_data = test_df['x_data']
y_data = test_df['y_data']


#Plot input data points
plt.plot(x_data, y_data, 'bo', label='experimental-data')

# Initial guess for the parameters
initial_guess = [.38, 2.3, .76, 2.77]    

#Perform the curve-fit
popt, pcov = curve_fit(func, x_data, y_data, initial_guess)
print(popt)

#x values for the fitted function
x_fit = np.arange(0.0, 31, 0.01)

#Plot the fitted function
plt.plot(x_fit, func(x_fit, *popt), 'r')

plt.show()

这是图表。 我认为这不是最合适的。我想提出改进曲线拟合的建议。

好吧,它似乎不是一个数学函数,例如对于参数值 15 你可能有多个值(f(x) 等于什么?)。因此,它不会成为经典 在这种情况下进行插值。如果你能以某种方式规范化数据,即从中创建一个函数,那么你就可以使用numpy。

最简单的方法是在参数值相等的地方添加一些小干扰。让我们看一下您的数据中的示例:

4   0.0326
4   0.014
4   -0.0086
4   0.0067

因此,如您所见,您无法判断 f(4) 的关系值是多少。如果你稍微打扰一下参数,例如:

3.9     -0.0086
3.95    0.0067
4       0.014
4.05    0.0326

对于您的数据文件中的所有此类示例,依此类推。最简单的方法是 将这些值按 x 参数分组 ,排序并打乱。

这显然会引入一些错误,但是,好吧......无论如何你都是曲线拟合,对吧?

要表示正弦,您必须知道振幅、频率和相位:f(x) = A * sin(F*x + p) 其中 A 是振幅,F是频率,p是相位。如果您准备了适当的数据集,Numpy 有专门的方法: How do I fit a sine curve to my data with pylab and numpy?