将正弦曲线拟合到我在 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?
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?