Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-lmfit曲线拟合的参数估计_Python_Python 3.x_Curve Fitting_Least Squares_Lmfit - Fatal编程技术网

Python-lmfit曲线拟合的参数估计

Python-lmfit曲线拟合的参数估计,python,python-3.x,curve-fitting,least-squares,lmfit,Python,Python 3.x,Curve Fitting,Least Squares,Lmfit,我正在使用Python对2005-2016年的月平均数据进行最小二乘拟合。我构建了如下函数: 原始代码如下所示: # t is in fractional years, e.g. 2017+122./365. def fun(t, a, b, c, A1, A2, A3, A4, B1, B2, B3, B4): An=[A1,A2,A3,A4] Bn=[B1,B2,B3,B4] sum=np.sum([An[i] * np.sin(2 * np.pi * (i + 1)

我正在使用Python对2005-2016年的月平均数据进行最小二乘拟合。我构建了如下函数: 原始代码如下所示:

# t is in fractional years, e.g. 2017+122./365.
def fun(t, a, b, c, A1, A2, A3, A4, B1, B2, B3, B4):
    An=[A1,A2,A3,A4]
    Bn=[B1,B2,B3,B4]
    sum=np.sum([An[i] * np.sin(2 * np.pi * (i + 1) * t+Bn[i]) for i in range(len(An))])
    return a+b*t+c*t*t+sum

mod = Model(fun)
pars = mod.make_params(a=-10, b=0.003, c=0.01, A1=-1., A2=1., A3=1., A4=1., B1=-1., B2=1., B3=1., B4=1.)

result = mod.fit(y, pars, t=t)
print(result.fit_report())

plt.plot(t, y, 'bo')
plt.plot(t, result.best_fit, 'r-')
plt.show()

看来傅里叶项不起作用了。因此,我很好奇如何对函数参数进行适当的初始估计,例如
A1
A2
A3

np.sum
不会做你想让它做的事。它将把表达式求和为单个标量值,而不是与
t
长度相同的数组。然后,该标量值折叠参数
A1
B4
到单个值上,拟合将无法确定这些值

我想你需要做一个二维的形状数组(4,
len(t)
),然后只在第一个维度上求和,留下一个
len(t)
数组,这是4个傅里叶分量的和

试着更换你的手机

sum=np.sum([An[i]*np.sin(2*np.pi*(i+1)*t+Bn[i]) for i in range(len(An))])


注意:使用
sum
作为变量名不是一个好主意。此外,您应该提供最少的工作示例,即至少一个完整的工作代码,包括所有
导入
s。一个最小的数据集也不错。除此之外,
A
可以从
mean
中检查。
B
s可能最好设置为零
A1
到类似于
0.5*(max()-min())
。另一个
A
为零。(假设您的所有数据看起来与链接中显示的数据相似),
b
c
也为零。您可以尝试使用scipy模块scipy.optimize.Differential_evolution来确定初始参数,感谢mikuszefski和James的有益评论,我举了一个例子,用这个scipy模块来拟合碳纳米管拉曼光谱中一个不稳定的洛伦兹峰方程。我在傅里叶项和的形状上犯了错误。见M Newville的答案。并在万分感谢您的帮助回答中查看fit图!实际上我没有注意到和项的形状。它确实按照你的建议起了作用。
sum=np.array([An[i]*np.sin(2*np.pi*(i+1)*t+Bn[i]) for i in range(len(An))]).sum(axis=0)