scipy.curve_fit() 不适用于指数

问题描述 投票:0回答:1

我有四个点:sigma2 = [15, 8, 5.5, 3.21],针对点 [100, 300, 500, 1000] 获得。我想对此拟合一条指数曲线,然后测量 800 的值。

但是,当我尝试这样做时,我只是得到一条水平线。

这是我的代码:


sigma2 = [15, 8, 5.5, 3.21]

def exp_fit(x, a, b, c):
    return a * np.exp(-b * x) + c

x_data = np.asarray([100, 300, 500, 1000], dtype=np.float64)
y_data = np.asarray(sigma2, dtype=np.float64)

param_exp, _ = curve_fit(exp_fit, x_data, y_data)

x_test = np.arange(100, 1100, 100)
print(exp_fit(x_test, *param_exp))
plt.plot(x_test, exp_fit(x_test, *param_exp), 'r-',
         label='fit: a=%5.3f, b=%5.3f, c=%5.3f' % tuple(param_exp))

任何帮助将不胜感激。我意识到这是一件简单的事情,但我无法完全指出我所犯的错误。

我确实尝试按照其他帖子中的建议否定 x 的初始值,但它仍然不起作用。 我尝试按如下方式限制指数:

    param_exp, _ = curve_fit(exp_fit, x_data, y_data, bounds=(0, [0.001, 0.001, 0.001]))

现在我看到一条斜率为负的直线。

curve-fitting scipy-optimize
1个回答
0
投票

SciPy 的曲线拟合方法依赖于梯度信息 - 换句话说,如果调整参数似乎没有任何作用,他们就不会使用它。因此,为优化器提供良好的初始猜测非常重要。

此处为 b 提供的默认猜测为 1,这导致指数项接近于零。

>>> b = 1
>>> np.exp(-b * x_data)
array([3.72007598e-044, 5.14820022e-131, 7.12457641e-218, 0.00000000e+000])

以下初步猜测似乎效果很好:

c0 = a0 = 1
b0 = np.log(np.mean(y_data)) / np.mean(x_data)
p0 = a0, b0, c0
param_exp, _ = curve_fit(exp_fit, x_data, y_data, p0=p0)
© www.soinside.com 2019 - 2024. All rights reserved.