我想做一个曲线拟合,把曲线拟合成正弦和余弦之和,但即使是余弦的拟合也是完全错误的。
下面是我的代码:使用nc文件中的数据(使用xarray打开):
数组([ 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23])
数据类型(2)在1998年的统计数据中,0.54781055、0.61995673、0.59603477、0.610795、0.5800109、0.4601419、0.29350758、0.200555556、0.03135109、-0.15563202、-0.27981472、-0.4027779、0.03135109、0.03135109、-0.15563202、-0.27981472、-0.4027779、-0.4027779、-0.4945315 ],数据类型=浮点数32)
# fit a straight line to the economic data
from numpy import arange
from pandas import read_csv
from scipy.optimize import curve_fit
from matplotlib import pyplot
# define the true objective function
def objective(x, a, b, c):
return a * np.sin(b * x) + c
# load the dataset
# choose the input and output variables
x, y = ds_s_tagesgang['hour'], ds_s_tagesgang['T2m']
# curve fit
popt, _ = curve_fit(objective, x, y)
# summarize the parameter values
a, b, c = popt
print('y = %.5f + np.sin(%.5f * x) + %.5f' % (a, b, c))
# plot input vs output
pyplot.scatter(x, y)
# define a sequence of inputs between the smallest and largest known inputs
x_line = arange(min(x), max(x), 1)
# calculate the output for the range
y_line = objective(x_line, a, b, c)
# create a line plot for the mapping function
pyplot.plot(x_line, y_line, '--', color='red')
pyplot.show()
这是我的代码,但拟合完全错误,如图所示:蓝点是我的数据,红线是“拟合”曲线
1条答案
按热度按时间hmae6n7t1#
困难可能来自于以下形式的模型方程
y = A * sin(B * x)+ C
其不包括相移。建议的模型为:
y = A * sin(B * x + F)+ C
涉及四个参数(A、B、C、F)而不是三个。
另一个困难的原因是软件中使用的非线性回归方法。这是一种迭代演算,需要参数的初始猜测值。如果这些值与正确值相差太远,数值演算可能失败。
为了克服这些困难,可以使用如下所示的非迭代方法。
请注意,模型函数采用不同的形式编写,但却是等效的:
y = a + B * sin(w * x)+ c * cos(w * x)= A * sin(B * x + F)+ C
A^2 = a^2+b^2
tan(F)= B/c
C = a
用你的数据进行数值演算:
注:上述方法涉及的拟合标准不同于常用的最小均方。如果严格要求LMS拟合,则必须回归到非线性回归方法(迭代)。但不再需要猜测初始值,因为上述值非常适合用作初始值。
参考编号:
https://fr.scribd.com/doc/14674814/Regressions-et-equations-integrales
此外还有:非线性回归结果