最小二乘指数拟合 Python

Exponential fit with the least squares Python

我有一个非常具体的任务,我需要找到我的指数函数的斜率。

我有两个阵列,一个表示 400 到 750 nm 之间的波长范围,另一个表示吸收光谱。 x = 波长,y = 吸收。

我的拟合函数应该看起来像这样:

y_mod = np.float(a_440) * np.exp(-S*(x - 440.))

其中 S 是斜率,在图像中等于 0.016,它应该在我应该得到的 S 值范围内 (+/- 0.003)。 a_440 是 440 nm 处的参考吸收,x 是波长。

模拟与原始情节:

我想知道如何定义我的函数以获得指数拟合不是对数转换量)无需事先猜测 S 值是多少

到目前为止我尝试过的是这样定义函数:

def func(x, a, b):
    return a * np.exp(-b * (x-440))

它给出了非常好的匹配

fitted vs original。

我不确定这种方法是否正确,或者我应该采用不同的方法吗? 如何使用最小二乘法或 y 中的绝对差法进行最小化以消除叠加效应?

是否也可以向数据中添加随机噪声并重新计算拟合?

您的情况与 scipy 的 curve_fitdocumentation 中描述的情况相同。

你遇到的问题是你的函数定义只接受一个参数,而它应该接收三个参数:x(计算函数的自变量),加上 a_440S.

清理了一下,功能应该是这样的

def func(x, A, S): 
    return A*np.exp(-S*(x-440.))

可能是您 运行 收到有关协方差矩阵的警告。您可以通过参数 p0curve_fit 提供一个不错的起点并提供一个列表来解决这个问题。例如在这种情况下 p0=[1,0.01] 并且在拟合调用中它看起来像下面的

curve_fit(func, x, y, p0=[1,0.01])