如何用调和函数拟合这些数据?
How to fit those datas with harmonic functions?
我想做一个曲线拟合,我将曲线拟合为正弦和余弦之和。但即使只是适合余弦也是完全错误的。
这是我的代码:
使用来自 nc 文件的数据(使用 xarray 打开):
ds_s_tagesgang['hour'] = 数组([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 , 15, 16, 17,
18、19、20、21、22、23])
ds_s_tagesgang['T2m'] = array([-0.60313714, -0.6527668 , -0.669063 , -0.6045208 , -0.46157956,
-0.36819172, -0.17480397, 0.00283241, 0.15954256, 0.33030534,
0.43397593、0.54781055、0.61995673、0.59603477、0.610795、
0.5800109、0.4601419、0.29350758、0.20055556、0.03135109、
-0.15563202, -0.27981472, -0.4027779 , -0.4945315 ], dtype=float32)
# 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()
这是我的代码,但是拟合完全错误,就像您在图片中看到的那样:蓝点是我的数据。红线是 'fitted' 曲线
困难可能来自于形式
的模型方程
y = A * sin(B * x) + C
其中不包括相移。建议型号为:
y = A * sin(B * x + F) + C
涉及四个参数(A、B、C、F)而不是三个。
另一个困难的原因是软件中使用的非线性回归方法。这是一个迭代演算,需要参数的初始猜测值。如果这些值与正确值相差太大,则数值计算可能会失败。
为了克服困难,可以使用如下所示的not-iterative方法。
请注意,模型函数以不同但等效的形式编写:
y = a + b * sin(w * x) + c * cos(w * x) = A * sin(B * x + F) + C
A^2 = a^2+b^2
棕褐色(F) = b/c
C=一个
根据你的数据,数值计算是:
注意:上述方法涉及与普通最小均方不同的拟合标准。如果严格要求 LMS 拟合,则必须回到 non-linear 回归方法(迭代)。但是已经不用再去猜测初始值了,因为上面查到的值都非常适合作为初始值。
参考:
https://fr.scribd.com/doc/14674814/Regressions-et-equations-integrales
此外:NON-LINEAR回归结果
我想做一个曲线拟合,我将曲线拟合为正弦和余弦之和。但即使只是适合余弦也是完全错误的。
这是我的代码: 使用来自 nc 文件的数据(使用 xarray 打开):
ds_s_tagesgang['hour'] = 数组([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 , 15, 16, 17, 18、19、20、21、22、23])
ds_s_tagesgang['T2m'] = array([-0.60313714, -0.6527668 , -0.669063 , -0.6045208 , -0.46157956, -0.36819172, -0.17480397, 0.00283241, 0.15954256, 0.33030534, 0.43397593、0.54781055、0.61995673、0.59603477、0.610795、 0.5800109、0.4601419、0.29350758、0.20055556、0.03135109、 -0.15563202, -0.27981472, -0.4027779 , -0.4945315 ], dtype=float32)
# 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()
这是我的代码,但是拟合完全错误,就像您在图片中看到的那样:蓝点是我的数据。红线是 'fitted' 曲线
困难可能来自于形式
的模型方程y = A * sin(B * x) + C
其中不包括相移。建议型号为:
y = A * sin(B * x + F) + C
涉及四个参数(A、B、C、F)而不是三个。
另一个困难的原因是软件中使用的非线性回归方法。这是一个迭代演算,需要参数的初始猜测值。如果这些值与正确值相差太大,则数值计算可能会失败。
为了克服困难,可以使用如下所示的not-iterative方法。
请注意,模型函数以不同但等效的形式编写:
y = a + b * sin(w * x) + c * cos(w * x) = A * sin(B * x + F) + C
A^2 = a^2+b^2
棕褐色(F) = b/c
C=一个
根据你的数据,数值计算是:
注意:上述方法涉及与普通最小均方不同的拟合标准。如果严格要求 LMS 拟合,则必须回到 non-linear 回归方法(迭代)。但是已经不用再去猜测初始值了,因为上面查到的值都非常适合作为初始值。
参考:
https://fr.scribd.com/doc/14674814/Regressions-et-equations-integrales
此外:NON-LINEAR回归结果