我想知道在python中将数据点拟合到非线性函数的正确方法应该是什么。
我在尝试拟合一系列数据点
t = [0., 0.5, 1., 1.5, ...., 4.]
y = [6.3, 4.5,.................]
字符串
使用以下模型函数
f(t, x) = x1*e^(x2*t)
型
我主要想知道哪个库例程适合这个问题,以及如何设置它。我尝试使用以下方法,但没有成功:
t_data = np.array([0.5, 1.0, 1.5, 2.0,........])
y_data = np.array([6.8, 3., 1.5, 0.75........])
def func_nl_lsq(x, t, y):
return [x[0]*np.exp(x[1]*t)] - y
popt, pcov = scipy.optimize.curve_fit(func_nl_lsq, t_data, y_data)
型
我知道这是不成功的,因为我能够解决“等效”线性最小二乘问题(简单地通过取模型函数的对数获得),它的答案甚至不接近我通过上面的方法得到的答案。
谢谢你
3条答案
按热度按时间8yoxcaq71#
如果你使用
curve_fit
,你可以简化它,不需要计算函数内部的错误:字符串
编辑
注意,我使用的是一个接受
*args
的通用签名。为了使它工作,你必须将p0
传递给curve_fit
。常规方法如下所示:
型
的数据
2wnc66cl2#
首先,你使用了错误的函数。你的函数
func_nl_lsq
计算残差,它不是模型函数。要使用scipy.otimize.curve_fit
,你必须定义模型函数,就像@DerWeh和@saullo_castro建议的那样。你仍然可以使用自定义残差函数scipy.optimize.least_squares
而不是scipy.optimize.curve_fit
。字符串
另外,请注意,@MadPhysicist的评论是正确的:你正在考虑的两个问题(初始问题和模型函数为对数的问题)并不等价。请注意,如果您将对数应用于模型函数,则也将其应用于残差,并且 * 残差平方和 * 现在意味着不同的东西。这会导致不同的优化问题和不同的结果。
ergxz8rk3#
scipy.otimize.curve_fit
可以用来拟合数据。我认为你只是没有正确使用它。我假设你有一个给定的t
和y
,并试图拟合一个形式为x1*exp(x2*t) = y
的函数。你需要
字符串
这意味着你的函数没有被正确定义。你的函数应该看起来像
型
这取决于你真正想要拟合什么。这里x1和x2是你的拟合参数。也可以这样做
型
但是你可能需要提供一个初始的猜测p0。