我有一个非常具体的任务,我需要找到指数函数的斜率。
我有两个阵列,一个表示波长范围在400到750纳米之间,另一个表示吸收光谱。 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方法中的绝对差异来最小化以消除过度效应的影响?
是否可以在数据中添加随机噪声并重新计算拟合?
答案 0 :(得分:1)
您的情况与documentation中为scipy curve_fit
描述的情况相同。
您遇到的问题是,当函数的定义应该接收三个时,它只接受一个参数:x
(评估函数的自变量),加上a_440
和S
。
清理一下,功能应该更像这样。
def func(x, A, S):
return A*np.exp(-S*(x-440.))
可能是您遇到有关协方差矩阵的警告。你通过参数curve_fit
向p0
提供一个不错的起点并提供一个列表来解决这个问题。例如,在这种情况下p0=[1,0.01]
,在拟合调用中,它看起来像下面的
curve_fit(func, x, y, p0=[1,0.01])