【发布时间】:2021-03-24 07:13:14
【问题描述】:
我正在尝试使用 lmfit 包对我的数据进行拟合。但是我找不到任何用于多指数衰减的内置模型。我试图创建自己的函数,然后适应它。 我的代码如下:
import os
import time
import numpy as np
import pandas as pd
import lmfit
from lmfit.models import ExponentialModel, LinearModel
from lmfit import Model, Parameter, report_fit
def MultiExpDecay(tiempo,C1,tau1,C2,tau2):
return C1*np.exp(-tiempo/tau1)+C2*np.exp(-tiempo/tau2)
def MultiExpDecay_fit():
C1s = []
C1s_error = []
C2s = []
C2s_error = []
tau1s = []
tau1s_error = []
tau2s = []
tau2s_error = []
Fit_MultiExpDecays = []
model = Model(MultiExpDecay, independent_vars=['tiempo'])
for c in range(len(V_APD.columns)):
xdat = tiempo.iloc[:, c]
ydat = V_APD.iloc[:, c]
pars = model.guess(ydat, x=xdat)
fit = model.fit(ydat, pars, x=xdat)
fit_values = model.eval(pars, x=xdat)
Fit_MultiExpDecays.append(fit_values)
for key in fit.params:
if key == 'C1':
#print(key, "=", out.params[key].value, "+/-", out.params[key].stderr)
C1s.append(fit.params[key].value)
C1s_error.append(fit.params[key].stderr)
elif key == 'C2':
C2s.append(fit.params[key].value)
C2s_error.append(fit.params[key].stderr)
elif key == 'tau1':
tau1s.append(fit.params[key].value)
tau1s_error.append(fit.params[key].stderr)
elif key == 'tau2':
tau2s.append(fit.params[key].value)
tau2s_error.append(fit.params[key].stderr)
Fit_MultiExpDecays = np.transpose(pd.DataFrame(Fit_MultiExpDecays, index=labels))
C1 = np.transpose(pd.DataFrame(C1s, index = labels, columns = ['C1']))
C2 = np.transpose(pd.DataFrame(C2s, index=labels, columns=['C2']))
tau1 = np.transpose(pd.DataFrame(tau1s, index=labels, columns=['tau1']))
tau2 = np.transpose(pd.DataFrame(tau2s, index=labels, columns=['tau2']))
C1_error = np.transpose(pd.DataFrame(C1s_error, index = labels, columns=['C1 error']))
C2_error = np.transpose(pd.DataFrame(C2s_error, index=labels, columns=['C2 error']))
tau1_error = np.transpose(pd.DataFrame(tau1s_error, index=labels, columns=['tau1 error']))
tau2_error = np.transpose(pd.DataFrame(tau2s_error, index=labels, columns=['tau2 error']))
C1 = pd.concat([C1, C1_error])
C2 = pd.concat([C2, C2_error])
tau1 = pd.concat([tau1, tau1_error])
tau2 = pd.concat([tau2, tau2_error])
return C1, C2, tau1, tau2, Fit_MultiExpDecays
C1, C2, tau1, tau2, Fit_MultiExpDecays = MultiExpDEcay_fit():
出现错误但无法识别问题。
File "C:\ProgramData\Anaconda3\Lib\site-packages\lmfit\model.py", line 737, in guess
raise NotImplementedError(msg)
NotImplementedError: guess() not implemented for Model
【问题讨论】:
-
standard example for fitting your own function 不能解决问题吗?你能更详细地解释一下你的情况会有什么不同吗?干杯
-
感谢您回答@mikuszefski。内置指数模型具有参数:A(幅度)和 Tau(衰减)。它适用于初始猜测参数“pars = model.guess(ydat, x=xdat)”。但是,我想将我的数据拟合到双指数模型(不是内置函数),参数 C1 和 C2 作为幅度,ta1 和 tau2 作为衰减常数。在同一行代码中,它对我说:“分配函数调用的结果,函数没有返回”
-
是的,我明白了。链接中的示例实际上是针对高斯的,但关键是这是任意函数的占位符,我不明白为什么它不适用于双指数。
标签: python-3.x math physics curve-fitting lmfit