9. Preblur for bosonic continuation

Demo notebook that shows that preblur for bosonic functions is correctly implemented and has the desired effect.

[1]:
import sys, os
import numpy as np
import matplotlib.pyplot as plt

sys.path.insert(0, os.environ['HOME'] + '/Programs/ana_cont')
from ana_cont import continuation as cont
[2]:
nw_full = 801
w_full = np.linspace(0., 8., num=nw_full, endpoint=True)
spectrum = np.exp(-(w_full - 2.)**2 / 2.) + np.exp(-(w_full + 2.)**2 / 2.)
spectrum /= 2. * np.trapz(spectrum, w_full)

beta = 20.
niw = 20
wn = 2. * np.pi / beta * np.arange(niw)
with np.errstate(invalid="ignore"):
    kernel = (w_full**2)[None, :] / ((w_full**2)[None, :] + (wn**2)[:, None])
kernel[0, 0] = 1.
chi_exact = np.trapz(kernel * spectrum, w_full, axis=1)
rng = np.random.RandomState(4712)
noise_unscaled = rng.randn(niw)
noise_amplitude = 1e-3
chi = chi_exact + noise_amplitude * noise_unscaled

fig, ax = plt.subplots(ncols=2, nrows=1, figsize=(8, 4))
ax[0].plot(w_full, spectrum)
ax[1].plot(wn, chi)
plt.show()
_images/preblur_bosonic_2_0.png
[3]:
nw = 801
w = np.linspace(0, 8., num=nw, endpoint=True)
probl = cont.AnalyticContinuationProblem(im_axis=wn, re_axis=w, im_data=chi, kernel_mode='freq_bosonic')
model = np.ones_like(w)
model /= np.trapz(model, w)
err = np.ones_like(wn) * noise_amplitude
[4]:
sol_noblur, _ = probl.solve(method='maxent_svd', alpha_determination='chi2kink', optimizer='newton',
                    stdev=err, model=model,
                    preblur=False, blur_width=0.01,
                    alpha_start=1e12, alpha_end=1e-2, alpha_div=5.,
                    interactive=True, fit_position=2.5)
sol_preblur, _ = probl.solve(method='maxent_svd', alpha_determination='chi2kink', optimizer='newton',
                    stdev=err, model=model,
                    preblur=True, blur_width=0.8,
                    alpha_start=1e12, alpha_end=1e-2, alpha_div=5.,
                    interactive=True, fit_position=2.5)
fig, ax = plt.subplots(ncols=2, nrows=1, figsize=(12, 4))
ax[0].plot(w_full, spectrum)
ax[0].plot(w, sol_noblur.A_opt, label='no blur')
ax[0].plot(w, sol_preblur.A_opt, label='preblur')
ax[0].legend()
ax[0].set_xlim(0., 4.)
ax[1].plot(wn, chi - sol_noblur.backtransform, label='no blur')
ax[1].plot(wn, chi - sol_preblur.backtransform, label='preblur')
ax[1].legend()
plt.show()
801 data points on real axis
20 data points on imaginary axis
16 significant singular values
Precomputation of coefficient matrices...
log10(alpha) = 12.00,   chi2 = 3.044e+06,   S = -1.304e-11,   nfev = 1,   norm = 1.000
log10(alpha) = 11.30,   chi2 = 3.044e+06,   S = -3.259e-10,   nfev = 5,   norm = 1.000
log10(alpha) = 10.60,   chi2 = 3.043e+06,   S = -8.145e-09,   nfev = 7,   norm = 1.000
log10(alpha) = 9.90,    chi2 = 3.038e+06,   S = -2.032e-07,   nfev = 9,   norm = 0.999
log10(alpha) = 9.20,    chi2 = 3.012e+06,   S = -5.027e-06,   nfev = 12,   norm = 0.997
log10(alpha) = 8.51,    chi2 = 2.889e+06,   S = -1.194e-04,   nfev = 14,   norm = 0.986
log10(alpha) = 7.81,    chi2 = 2.391e+06,   S = -2.365e-03,   nfev = 16,   norm = 0.936
log10(alpha) = 7.11,    chi2 = 1.225e+06,   S = -2.615e-02,   nfev = 18,   norm = 0.794
log10(alpha) = 6.41,    chi2 = 2.801e+05,   S = -1.073e-01,   nfev = 19,   norm = 0.604
log10(alpha) = 5.71,    chi2 = 4.677e+04,   S = -1.952e-01,   nfev = 19,   norm = 0.508
log10(alpha) = 5.01,    chi2 = 1.016e+04,   S = -2.678e-01,   nfev = 19,   norm = 0.507
log10(alpha) = 4.31,    chi2 = 1.938e+03,   S = -3.498e-01,   nfev = 29,   norm = 0.509
log10(alpha) = 3.61,    chi2 = 2.674e+02,   S = -4.294e-01,   nfev = 30,   norm = 0.502
log10(alpha) = 2.91,    chi2 = 5.381e+01,   S = -4.774e-01,   nfev = 21,   norm = 0.500
log10(alpha) = 2.21,    chi2 = 3.279e+01,   S = -5.016e-01,   nfev = 21,   norm = 0.499
log10(alpha) = 1.52,    chi2 = 2.875e+01,   S = -5.289e-01,   nfev = 23,   norm = 0.499
log10(alpha) = 0.82,    chi2 = 2.682e+01,   S = -5.940e-01,   nfev = 25,   norm = 0.499
log10(alpha) = 0.12,    chi2 = 2.621e+01,   S = -6.902e-01,   nfev = 26,   norm = 0.499
log10(alpha) = -0.58,   chi2 = 2.604e+01,   S = -8.330e-01,   nfev = 28,   norm = 0.499
log10(alpha) = -1.28,   chi2 = 2.597e+01,   S = -1.118e+00,   nfev = 30,   norm = 0.499
log10(alpha) = -1.98,   chi2 = 2.595e+01,   S = -1.509e+00,   nfev = 32,   norm = 0.499
Fit parameters [1.35524589 5.17828922 4.99108767 1.02207039]
Optimal log alpha 2.5450721793257154
log10(alpha) = 2.55,    chi2 = 3.776e+01,   S = -4.915e-01,   nfev = 17,   norm = 0.499
_images/preblur_bosonic_4_1.png
801 data points on real axis
20 data points on imaginary axis
13 significant singular values
Precomputation of coefficient matrices...
log10(alpha) = 12.00,   chi2 = 3.059e+06,   S = -1.293e-11,   nfev = 1,   norm = 1.000
log10(alpha) = 11.30,   chi2 = 3.058e+06,   S = -3.231e-10,   nfev = 5,   norm = 1.000
log10(alpha) = 10.60,   chi2 = 3.057e+06,   S = -8.075e-09,   nfev = 7,   norm = 1.000
log10(alpha) = 9.90,    chi2 = 3.052e+06,   S = -2.015e-07,   nfev = 9,   norm = 0.999
log10(alpha) = 9.20,    chi2 = 3.027e+06,   S = -4.984e-06,   nfev = 12,   norm = 0.997
log10(alpha) = 8.51,    chi2 = 2.905e+06,   S = -1.184e-04,   nfev = 14,   norm = 0.985
log10(alpha) = 7.81,    chi2 = 2.409e+06,   S = -2.352e-03,   nfev = 16,   norm = 0.936
log10(alpha) = 7.11,    chi2 = 1.243e+06,   S = -2.618e-02,   nfev = 18,   norm = 0.792
log10(alpha) = 6.41,    chi2 = 2.884e+05,   S = -1.082e-01,   nfev = 19,   norm = 0.598
log10(alpha) = 5.71,    chi2 = 5.028e+04,   S = -1.981e-01,   nfev = 19,   norm = 0.500
log10(alpha) = 5.01,    chi2 = 1.194e+04,   S = -2.746e-01,   nfev = 19,   norm = 0.504
log10(alpha) = 4.31,    chi2 = 3.214e+03,   S = -3.624e-01,   nfev = 20,   norm = 0.517
log10(alpha) = 3.61,    chi2 = 7.017e+02,   S = -4.926e-01,   nfev = 21,   norm = 0.511
log10(alpha) = 2.91,    chi2 = 1.122e+02,   S = -6.332e-01,   nfev = 22,   norm = 0.504
log10(alpha) = 2.21,    chi2 = 3.749e+01,   S = -7.160e-01,   nfev = 21,   norm = 0.500
log10(alpha) = 1.52,    chi2 = 3.191e+01,   S = -7.460e-01,   nfev = 37,   norm = 0.499
log10(alpha) = 0.82,    chi2 = 3.129e+01,   S = -7.662e-01,   nfev = 25,   norm = 0.499
log10(alpha) = 0.12,    chi2 = 3.095e+01,   S = -8.286e-01,   nfev = 27,   norm = 0.499
log10(alpha) = -0.58,   chi2 = 3.071e+01,   S = -1.042e+00,   nfev = 29,   norm = 0.499
log10(alpha) = -1.28,   chi2 = 3.060e+01,   S = -1.464e+00,   nfev = 31,   norm = 0.499
log10(alpha) = -1.98,   chi2 = 3.058e+01,   S = -1.875e+00,   nfev = 33,   norm = 0.499
Fit parameters [1.40031346 5.15544171 4.8762637  0.92190143]
Optimal log alpha 2.1644770449810373
log10(alpha) = 2.16,    chi2 = 3.643e+01,   S = -7.194e-01,   nfev = 15,   norm = 0.500
_images/preblur_bosonic_4_3.png
_images/preblur_bosonic_4_4.png
[ ]:

[ ]: