Я подгоняю следующие данные, где t: время (с), G: количество импульсов в секунду, f: импульсная функция (мм/с):
t G f
0 4.58 0
900 11.73 (11/900)
1800 18.23 (8.25/900)
2700 19.33 (3/900)
3600 19.04 (0.5/900)
4500 17.21 0
5400 12.98 0
6300 11.59 0
7200 9.26 0
8100 7.66 0
9000 6.59 0
9900 5.68 0
10800 5.1 0
Используя следующий интеграл свертки:
И, более конкретно:
Где: lambda_1 = 0.000431062
и lambda_2 = 0.000580525
.
Код, используемый для выполнения этой подгонки:
#Extract data into numpy arrays
t=df['t'].as_matrix()
g=df['G'].as_matrix()
f=df['f'].as_matrix()
#add parameters
params=Parameters()
params.add('a',value=1)
params.add('b',value=0.7)
params.add('c',value =1)
#define functions
def exp(x,k):
return np.exp(-x*k)
def residuals(params,x,y):
A=params['a'].value
B=params['b'].value
C=params['c'].value
dt=x[2]-x[1]
model = A*(np.convolve(exp(x,lambda_1), f))[:len(x)]*dt+B*np.convolve(exp(x,lambda_2), f)[:len(x)]*dt+C
weights=1/np.sqrt(y)
return (model - y)*weights
#perform fit using leastsq
result = minimize(residuals, params, args=(t,g))
final = g + result.residual
print(report_fit(result))
Это работает, однако я получаю очень низкий приведенный хи-квадрат (около 0), когда я умножаю остаток, который нужно минимизировать, на вес (1/np.sqrt (g) (взвешенная подгонка). Если я не приму во внимание веса (невзвешенная подгонка), я получаю приведенный хи-квадрат 0,254. Я хотел бы получить уменьшенный хи-квадрат около 1.