def make_residual_func(samples, indices, **params):
'closure for residual func'
fft_size = 2
while fft_size < indices[-1]:
fft_size *= 2
freqs = rfftfreq(fft_size, 5)
ind_from = int(round(1/(params['t_max']*freqs[1])))
ind_to = ind_from+params['n_harm']
def make_series(x):
'Calculates time series from parameterized spectrum'
nonlocal freqs, ind_from, ind_to, params
spectrum = zeros_like(freqs, 'complex')
sign_x0 = 0 if x[0] == 0.5 else abs(x[0]-0.5)/(x[0]-0.5)
spectrum[0] = rect(sign_x0*exp(params['scale'][0]*abs(x[0]-0.5)), 0)
for i in range(ind_from, ind_to):
spectrum[i] = rect(
exp(params['scale'][1]*x[1]+params['slope']*log(freqs[i])),
params['scale'][2]*x[2+i-ind_from]
)
return irfft(spectrum)
def residual_func(x):
'calculates sum of squared residuals'
nonlocal samples, indices
series = make_series(x)
sum_err = 0
for position, ind in enumerate(indices):
sum_err += (series[ind]-samples[position])**2
return sum_err
return make_series, residual_func
评论列表
文章目录