我有一个非常具体的任务,我需要找到指数函数的斜率。
我有两个阵列,一个表示 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))
而且它提供了非常好的匹配
我不确定这种方法是否正确,或者我应该采取不同的做法吗? 如何使用最小二乘法或 y 方法中的绝对差进行最小化,以消除重叠的影响?
是否也可以向数据添加随机噪声并重新计算拟合?
最佳答案
您的情况与 documentation 中描述的情况相同对于 scipy 的 curve_fit
。
您遇到的问题是,您的函数定义只接受一个参数,而它应该接收三个参数: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])
关于python - 使用最小二乘法进行指数拟合 Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46812125/