我有四个点: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]))
现在我看到一条斜率为负的直线。
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)