Я пытаюсь подобрать 3d-матрицу с мультиэкспоненциальной функцией, так как
S (w1, w2, T) = сумма (A_i (w1, w2) * exp (-T / tau_i))
Чтобы сократить время подгонки, я разделил его на два шага.
Определите целевую функцию только с использованием времени жизни (tau_i) в качестве параметров, в то же время внедрив минимизацию подгонки в целевую функцию, как показанов коде.
Проблема в том, что "когда я минимизирую целевую функцию, параметры не меняются?"
#data, is 3d matrix, data[k,i,j]
ltn = 4
#build the amplifer fitting model
def fit_2ddas_amp(params, dat, dec):
model_amp = np.zeros(len(waitT),np.float)
for k in range(ltn):
model_amp = model_amp + params['amp_%i'%(k)] * np.exp(-waitT/dec[k])
resid_amp = dat - model_amp
return resid_amp
#build the decay time fitting model
def fit_2ddas_decay(par_decay):
decay_fit = np.zeros(ltn,np.float)
for i in range(ltn):
decay_fit[i] = par_decay['decay_%i'%(i)]
print('Decay', str(i+1), ':', '%.6f'%(decay_fit[i]), 'ps' )
resid = np.zeros_like(data)
#do the amplifier fitting
for i in range(len(wt)):
for j in range(len(wtau)):
#create initial value of amplifier
par_amp = Parameters()
for k in range(ltn):
par_amp.add('amp_%i'%(k), value = 2 )
#do the amplifer fit
minner_amp = Minimizer(fit_2ddas_amp, par_amp, fcn_args=(data[:,i,j], decay_fit), nan_policy='propagate')
result_amp = minner_amp.minimize(method='least_squares')
resid[:,i,j] = result_amp.residual
return resid.flatten()
#create parameters of decay
par_2ddas_decay = Parameters()
for i in range(ltn):
par_2ddas_decay.add('decay_%i'%(i), value = 2, min = 0.0)
#do the decay time fit
minner_decay = Minimizer(fit_2ddas_decay, par_2ddas_decay, nan_policy='propagate')
result_decay = minner_decay.minimize()
the decay time always the same.
Decay 1 : 2.000000 ps
Decay 2 : 2.000000 ps
Decay 3 : 2.000000 ps
Decay 4 : 2.000000 ps
Decay 1 : 2.000000 ps
Decay 2 : 2.000000 ps
Decay 3 : 2.000000 ps
Decay 4 : 2.000000 ps
Decay 1 : 2.000000 ps
Decay 2 : 2.000000 ps
Decay 3 : 2.000000 ps
Decay 4 : 2.000000 ps