最小二乘指数拟合 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_fit
的 documentation 中描述的情况相同。
你遇到的问题是你的函数定义只接受一个参数,而它应该接收三个参数:x
(计算函数的自变量),加上 a_440
和 S
.
清理了一下,功能应该是这样的
def func(x, A, S):
return A*np.exp(-S*(x-440.))
可能是您 运行 收到有关协方差矩阵的警告。您可以通过参数 p0
为 curve_fit
提供一个不错的起点并提供一个列表来解决这个问题。例如在这种情况下 p0=[1,0.01]
并且在拟合调用中它看起来像下面的
curve_fit(func, x, y, p0=[1,0.01])
我有一个非常具体的任务,我需要找到我的指数函数的斜率。
我有两个阵列,一个表示 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_fit
的 documentation 中描述的情况相同。
你遇到的问题是你的函数定义只接受一个参数,而它应该接收三个参数:x
(计算函数的自变量),加上 a_440
和 S
.
清理了一下,功能应该是这样的
def func(x, A, S):
return A*np.exp(-S*(x-440.))
可能是您 运行 收到有关协方差矩阵的警告。您可以通过参数 p0
为 curve_fit
提供一个不错的起点并提供一个列表来解决这个问题。例如在这种情况下 p0=[1,0.01]
并且在拟合调用中它看起来像下面的
curve_fit(func, x, y, p0=[1,0.01])