我试图将曲线拟合到一组数据点:

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

xdata = np.array(X)
ydata = np.array(y)
popt, pcov = curve_fit(func, xdata, ydata)
plt.scatter(xdata, ydata, label='data')
plt.plot(xdata, func(xdata, *popt), 'r', label='fit')
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.show()

该数据集包含大约50个点 . 其中2个可能是异常值 . 我生成了两个数据和拟合曲线图:第一个包含异常值,另一个图包括异常值:
enter image description here

enter image description here

但是,两个曲线拟合都包含许多NaN值,这就是为什么红色拟合线太小 . 我在 popt 中为每个变量得到了1的值 . 我尝试了 logexp 适合,如上面的代码所示

我可以尝试使用比指数或对数拟合更好的曲线吗?

编辑:func的定义出现在curve_fit调用之前