scipy 如何用调和函数拟合这些数据?

hts6caw3  于 2022-11-10  发布在  其他
关注(0)|答案(1)|浏览(164)

我想做一个曲线拟合,把曲线拟合成正弦和余弦之和,但即使是余弦的拟合也是完全错误的。
下面是我的代码:使用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()

这是我的代码,但拟合完全错误,如图所示:蓝点是我的数据,红线是“拟合”曲线

hmae6n7t

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
此外还有:非线性回归结果

相关问题