Delta and two Lorentzian ∗ Resolution with bumps (2 wavelengths)
Introduction
The objective of this notebook is to show how to use the delta_two_lorentz model .
The data are two sets of water data measured at IN5 (ILL) using two different wavelengths.
Reference: J. Qvist, H. Schober and B. Halle, J. Chem. Phys. 134, 144508 (2011)
Physical units
For information about unit conversion, please refer to the jupyter notebook called Convert_units.ipynb in the tools folder.
Import libraries
[1]:
import ipywidgets
# the following two lines are to remove the warning about too many figures open simultaneously
from matplotlib import rcParams
rcParams.update({'figure.max_open_warning': 0})
import h5py
import QENSmodels
import numpy as np
from scipy.integrate import simps
import bumps.names as bmp
from bumps import fitters
from bumps.formatnum import format_uncertainty_pm
import matplotlib.pyplot as plt
%matplotlib widget
Setting of fitting
Load reference data
[2]:
path_to_data = './data/'
# Data
# Wavelength 5 Angstrom
with h5py.File(path_to_data + 'H2O_293K_5A.hdf', 'r') as f:
hw_5A = f['entry1']['data1']['X'][:]
q_5A = f['entry1']['data1']['Y'][:]
unit_w5A = f['entry1']['data1']['X'].attrs['long_name']
unit_q5A = f['entry1']['data1']['Y'].attrs['long_name']
sqw_5A = np.transpose(f['entry1']['data1']['DATA'][:])
err_5A = np.transpose(f['entry1']['data1']['errors'][:])
# Wavelength 8 Angstrom
with h5py.File(path_to_data + 'H2O_293K_8A.hdf', 'r') as f:
hw_8A = f['entry1']['data1']['X'][:]
q_8A = f['entry1']['data1']['Y'][:]
unit_w8A = f['entry1']['data1']['X'].attrs['long_name']
unit_q8A = f['entry1']['data1']['Y'].attrs['long_name']
sqw_8A = np.transpose(f['entry1']['data1']['DATA'][:])
err_8A = np.transpose(f['entry1']['data1']['errors'][:])
# Resolution
# Wavelength 5 Angstrom
with h5py.File(path_to_data + 'V_273K_5A.hdf', 'r') as f:
res_5A = np.transpose(f['entry1']['data1']['DATA'][:])
# Wavelength 8 Angstrom
with h5py.File(path_to_data + 'V_273K_8A.hdf', 'r') as f:
res_8A = np.transpose(f['entry1']['data1']['DATA'][:])
# Force resolution function to have unit area
# 5 Angstrom
for i in range(len(q_5A)):
area = simps(res_5A[:,i], hw_5A)
res_5A[:,i] /= area
# 8 Angstrom
for i in range(len(q_8A)):
area = simps(res_8A[:,i], hw_8A)
res_8A[:,i] /= area
[3]:
fig, ax = plt.subplots(ncols=2, nrows=2, figsize=(8, 8), sharex=True)
for i in range(len(q_5A)):
ax[0, 0].semilogy(hw_5A, sqw_5A[:,i], label=f"q={q_5A[i]:.1f}")
ax[1, 0].semilogy(hw_5A, res_5A[:,i], label=f"q={q_5A[i]:.1f}")
ax[0, 0].set_title(r'Signal 5 $\AA$')
ax[0, 0].grid()
ax[1, 0].set_title(r'Resolution 5 $\AA$')
ax[1, 0].set_xlabel(f"$\hbar \omega$")
ax[1, 0].grid()
for i in range(len(q_8A)):
ax[0, 1].semilogy(hw_8A, sqw_8A[:,i], label=f"q={q_8A[i]:.1f}")
ax[1, 1].semilogy(hw_8A, res_8A[:,i], label=f"q={q_8A[i]:.1f}")
ax[1, 1].legend(bbox_to_anchor=(1.2,1.5), loc='upper right', shadow=True)
ax[0, 1].set_title(r'Signal 8 $\AA$')
ax[0, 1].grid()
ax[1, 1].set_title(r'Resolution 8 $\AA$')
ax[1, 1].set_xlabel(f"$\hbar \omega$")
ax[1, 1].grid()
Display units of input data
Just for information in order to determine if a conversion of units is required before using the QENSmodels
[4]:
print(f"At 5 Angstroms, the names and units of `w` ( `x`axis) and `q` are: {unit_w5A[0].decode()} and {unit_q5A[0].decode()}, respectively.")
print(f"At 8 Angstroms, the names and units of `w` ( `x`axis) and `q` are: {unit_w8A[0].decode()} and {unit_q8A[0].decode()}, respectively.")
At 5 Angstroms, the names and units of `w` ( `x`axis) and `q` are: Energy Transfer (meV) and Wavevector Transfer (A!U-1!N), respectively.
At 8 Angstroms, the names and units of `w` ( `x`axis) and `q` are: Energy Transfer (meV) and Wavevector Transfer (A!U-1!N), respectively.
Create fitting model
[5]:
# Fit range -1 to +1 meV
idx_5A = np.where(np.logical_and(hw_5A > -1.0, hw_5A < 1.0))
idx_8A = np.where(np.logical_and(hw_8A > -1.0, hw_8A < 1.0))
def model_convol(x, q, scale=1, center=0, A0=1.0, A1=1.0, hwhm1=1.0, hwhm2=1.0, resolution=None):
model = QENSmodels.sqwDeltaTwoLorentz(x, q, scale, center, A0, A1, hwhm1, hwhm2)
return np.convolve(resolution/resolution.sum(), model, mode='same')
# Fit
model_all_qs = []
# First dataset: wavelength=5 Angstrom
for i in range(len(q_5A)):
x = hw_5A[idx_5A]
data = sqw_5A[idx_5A, i]
error = err_5A[idx_5A, i]
resol = res_5A[idx_5A, i]
# Select only valid data (error = -1 for Q, w points not accessible)
valid = np.where(error > 0.0)
x = x[valid[1]]
if len(valid[1]) != len(x):
print(i, "truncate to make vectors symmetric with respect to max")
data = data[valid]
error = error[valid]
resol = resol[valid]
# Dirac + 2 Lorentzians model
model_q = bmp.Curve(
model_convol,
x, data, error,
name=f'q5A_{q_5A[i]:.2f}',
q=q_5A[i],
scale=20,
center=0.0,
A0=0.0,
A1=0.9,
hwhm1=0.05,
hwhm2=0.3,
resolution=resol
)
# Fitted parameters
model_q.scale.range(1.e-12, 20)
model_q.center.range(-0.1, 0.1)
model_q.A0.range(0, 0.05)
model_q.A1.range(0, 1)
model_q.hwhm1.range(0, 0.5)
model_q.hwhm2.range(0, 3)
# Q-independent parameters
if i == 0:
A0_q = model_q.A0
else:
model_q.A0 = A0_q
model_all_qs.append(model_q)
# Second dataset: wavelength=8 Angstrom
for i in range(len(q_8A)):
x = hw_8A[idx_8A]
data = sqw_8A[idx_8A, i]
error = err_8A[idx_8A, i]
resol = res_8A[idx_8A, i]
# Select only valid data (error = -1 for Q, w points not accessible)
valid = np.where(error > 0.0)
if len(valid[1]) != len(x):
print(i, "truncate to make vectors symmetric with respect to max")
x = x[valid[1]]
data = data[valid]
error = error[valid]
resol = resol[valid]
model_q = bmp.Curve(
model_convol,
x, data, error,
name=f'q8A_{q_8A[i]:.2f}',
q=q_8A[i],
scale=35,
center=0.0,
A0=0.0,
A1=0.9,
hwhm1=0.05,
hwhm2=0.3,
resolution=resol
)
# Fitted parameters
model_q.scale.range(0.1, 40)
model_q.center.range(-0.1, 0.1)
model_q.A0.range(0, 0.05)
model_q.A1.range(0, 1)
model_q.hwhm1.range(0, 0.5)
model_q.hwhm2.range(0, 3)
# Q-independent parameters
if i == 0:
A0_q = model_q.A0
else:
model_q.A0 = A0_q
model_all_qs.append(model_q)
problem = bmp.FitProblem(model_all_qs)
0 truncate to make vectors symmetric with respect to max
9 truncate to make vectors symmetric with respect to max
10 truncate to make vectors symmetric with respect to max
Display initial configuration: experimental data, fitting model with initial guesses
[6]:
slider = ipywidgets.IntSlider(value=0, min=0, max=len(q_5A)+len(q_8A)-1, continuous_update=False)
output = ipywidgets.Output()
def fig_q(model, ax, q_index=0):
"""
Plot of experimental data, fitting model and residual for a selected q value
Parameters
----------
model: list of bumps.curve.Curves for all q
ax: matplotlib.axes to be updated when changing the ipywidgets
q_index: int
index of q to be plotted
"""
model = model[q_index]
ax[0].errorbar(model.x,
model.y,
yerr=model.dy,
label='experimental data',
color='C0')
ax[0].plot(model.x,
model.theory(),
label='theory (model)',
color='C1')
ax[0].set_title(f'Model {model.name} - $\chi^2$={problem.chisq_str()}')
ax[0].legend()
ax[1].plot(model.x, model.residuals(), marker='o', linewidth=0, markersize=3, color='C0')
with output:
fig, ax = plt.subplots(nrows=2, ncols=1, sharex=True)
ax[0].grid(); ax[1].grid()
ax[1].set_ylabel('Residual')
ax[1].set_xlabel(f"$\hbar \omega$")
fig_q(model_all_qs, ax, 0)
def update_profile(change):
"""
Update plots for a new q-value
"""
with output:
ax[0].clear(); ax[1].lines.clear()
ax[0].grid()
fig_q(model_all_qs, ax,change['new'])
slider.observe(update_profile, names="value")
slider_label = ipywidgets.Label("q value to display")
slider_comp = ipywidgets.HBox([slider_label, slider])
ipywidgets.VBox([slider_comp, output])
[6]:
[7]:
problem.summarize().splitlines()
[7]:
[' A0 |......... 0 in (0,0.05)',
' A1 ........|. 0.9 in (0,1)',
' center ....|..... 0 in (-0.1,0.1)',
' hwhm1 |......... 0.05 in (0,0.5)',
' hwhm2 |......... 0.3 in (0,3)',
' scale .........| 20 in (1e-12,20)',
' A1 ........|. 0.9 in (0,1)',
' center ....|..... 0 in (-0.1,0.1)',
' hwhm1 |......... 0.05 in (0,0.5)',
' hwhm2 |......... 0.3 in (0,3)',
' scale .........| 20 in (1e-12,20)',
' A1 ........|. 0.9 in (0,1)',
' center ....|..... 0 in (-0.1,0.1)',
' hwhm1 |......... 0.05 in (0,0.5)',
' hwhm2 |......... 0.3 in (0,3)',
' scale .........| 20 in (1e-12,20)',
' A1 ........|. 0.9 in (0,1)',
' center ....|..... 0 in (-0.1,0.1)',
' hwhm1 |......... 0.05 in (0,0.5)',
' hwhm2 |......... 0.3 in (0,3)',
' scale .........| 20 in (1e-12,20)',
' A1 ........|. 0.9 in (0,1)',
' center ....|..... 0 in (-0.1,0.1)',
' hwhm1 |......... 0.05 in (0,0.5)',
' hwhm2 |......... 0.3 in (0,3)',
' scale .........| 20 in (1e-12,20)',
' A1 ........|. 0.9 in (0,1)',
' center ....|..... 0 in (-0.1,0.1)',
' hwhm1 |......... 0.05 in (0,0.5)',
' hwhm2 |......... 0.3 in (0,3)',
' scale .........| 20 in (1e-12,20)',
' A1 ........|. 0.9 in (0,1)',
' center ....|..... 0 in (-0.1,0.1)',
' hwhm1 |......... 0.05 in (0,0.5)',
' hwhm2 |......... 0.3 in (0,3)',
' scale .........| 20 in (1e-12,20)',
' A1 ........|. 0.9 in (0,1)',
' center ....|..... 0 in (-0.1,0.1)',
' hwhm1 |......... 0.05 in (0,0.5)',
' hwhm2 |......... 0.3 in (0,3)',
' scale .........| 20 in (1e-12,20)',
' A1 ........|. 0.9 in (0,1)',
' center ....|..... 0 in (-0.1,0.1)',
' hwhm1 |......... 0.05 in (0,0.5)',
' hwhm2 |......... 0.3 in (0,3)',
' scale .........| 20 in (1e-12,20)',
' A1 ........|. 0.9 in (0,1)',
' center ....|..... 0 in (-0.1,0.1)',
' hwhm1 |......... 0.05 in (0,0.5)',
' hwhm2 |......... 0.3 in (0,3)',
' scale .........| 20 in (1e-12,20)',
' A1 ........|. 0.9 in (0,1)',
' center ....|..... 0 in (-0.1,0.1)',
' hwhm1 |......... 0.05 in (0,0.5)',
' hwhm2 |......... 0.3 in (0,3)',
' scale .........| 20 in (1e-12,20)',
' A1 ........|. 0.9 in (0,1)',
' center ....|..... 0 in (-0.1,0.1)',
' hwhm1 |......... 0.05 in (0,0.5)',
' hwhm2 |......... 0.3 in (0,3)',
' scale .........| 20 in (1e-12,20)',
' A1 ........|. 0.9 in (0,1)',
' center ....|..... 0 in (-0.1,0.1)',
' hwhm1 |......... 0.05 in (0,0.5)',
' hwhm2 |......... 0.3 in (0,3)',
' scale .........| 20 in (1e-12,20)',
' A1 ........|. 0.9 in (0,1)',
' center ....|..... 0 in (-0.1,0.1)',
' hwhm1 |......... 0.05 in (0,0.5)',
' hwhm2 |......... 0.3 in (0,3)',
' scale .........| 20 in (1e-12,20)',
' A1 ........|. 0.9 in (0,1)',
' center ....|..... 0 in (-0.1,0.1)',
' hwhm1 |......... 0.05 in (0,0.5)',
' hwhm2 |......... 0.3 in (0,3)',
' scale .........| 20 in (1e-12,20)',
' A1 ........|. 0.9 in (0,1)',
' center ....|..... 0 in (-0.1,0.1)',
' hwhm1 |......... 0.05 in (0,0.5)',
' hwhm2 |......... 0.3 in (0,3)',
' scale .........| 20 in (1e-12,20)',
' A1 ........|. 0.9 in (0,1)',
' center ....|..... 0 in (-0.1,0.1)',
' hwhm1 |......... 0.05 in (0,0.5)',
' hwhm2 |......... 0.3 in (0,3)',
' scale .........| 20 in (1e-12,20)',
' A0 |......... 0 in (0,0.05)',
' A1 ........|. 0.9 in (0,1)',
' center ....|..... 0 in (-0.1,0.1)',
' hwhm1 |......... 0.05 in (0,0.5)',
' hwhm2 |......... 0.3 in (0,3)',
' scale ........|. 35 in (0.1,40)',
' A1 ........|. 0.9 in (0,1)',
' center ....|..... 0 in (-0.1,0.1)',
' hwhm1 |......... 0.05 in (0,0.5)',
' hwhm2 |......... 0.3 in (0,3)',
' scale ........|. 35 in (0.1,40)',
' A1 ........|. 0.9 in (0,1)',
' center ....|..... 0 in (-0.1,0.1)',
' hwhm1 |......... 0.05 in (0,0.5)',
' hwhm2 |......... 0.3 in (0,3)',
' scale ........|. 35 in (0.1,40)',
' A1 ........|. 0.9 in (0,1)',
' center ....|..... 0 in (-0.1,0.1)',
' hwhm1 |......... 0.05 in (0,0.5)',
' hwhm2 |......... 0.3 in (0,3)',
' scale ........|. 35 in (0.1,40)',
' A1 ........|. 0.9 in (0,1)',
' center ....|..... 0 in (-0.1,0.1)',
' hwhm1 |......... 0.05 in (0,0.5)',
' hwhm2 |......... 0.3 in (0,3)',
' scale ........|. 35 in (0.1,40)',
' A1 ........|. 0.9 in (0,1)',
' center ....|..... 0 in (-0.1,0.1)',
' hwhm1 |......... 0.05 in (0,0.5)',
' hwhm2 |......... 0.3 in (0,3)',
' scale ........|. 35 in (0.1,40)',
' A1 ........|. 0.9 in (0,1)',
' center ....|..... 0 in (-0.1,0.1)',
' hwhm1 |......... 0.05 in (0,0.5)',
' hwhm2 |......... 0.3 in (0,3)',
' scale ........|. 35 in (0.1,40)',
' A1 ........|. 0.9 in (0,1)',
' center ....|..... 0 in (-0.1,0.1)',
' hwhm1 |......... 0.05 in (0,0.5)',
' hwhm2 |......... 0.3 in (0,3)',
' scale ........|. 35 in (0.1,40)',
' A1 ........|. 0.9 in (0,1)',
' center ....|..... 0 in (-0.1,0.1)',
' hwhm1 |......... 0.05 in (0,0.5)',
' hwhm2 |......... 0.3 in (0,3)',
' scale ........|. 35 in (0.1,40)',
' A1 ........|. 0.9 in (0,1)',
' center ....|..... 0 in (-0.1,0.1)',
' hwhm1 |......... 0.05 in (0,0.5)',
' hwhm2 |......... 0.3 in (0,3)',
' scale ........|. 35 in (0.1,40)',
' A1 ........|. 0.9 in (0,1)',
' center ....|..... 0 in (-0.1,0.1)',
' hwhm1 |......... 0.05 in (0,0.5)',
' hwhm2 |......... 0.3 in (0,3)',
' scale ........|. 35 in (0.1,40)']
Choice of minimizer for bumps
[8]:
options_dict = {}
for item in fitters.__dict__.keys():
if item.endswith('Fit') and fitters.__dict__[item].id in fitters.FIT_AVAILABLE_IDS:
options_dict[fitters.__dict__[item].name] = fitters.__dict__[item].id
w_choice_minimizer = ipywidgets.Dropdown(
options=list(options_dict.keys()),
value='Levenberg-Marquardt',
description='Minimizer:',
layout=ipywidgets.Layout(height='40px'))
w_choice_minimizer
[8]:
Number of steps for running fit using bumps
[9]:
steps_fitting = ipywidgets.IntText(
value=100,
step=100,
description='Number of steps when fitting',
style={'description_width': 'initial'})
steps_fitting
[9]:
Running the fit
Run the fit using the minimizer defined above with a number of steps also specified above
[10]:
# Preview of the settings
print('Initial chisq', problem.chisq_str())
Initial chisq 20737.440(31)
[11]:
def settings_selected_optimizer(chosen_minimizer):
"""
List the settings available for the selected optimizer
This list can be used as arguments for the `fit` function
"""
assert type(chosen_minimizer) == ipywidgets.widgets.widget_selection.Dropdown
for item in fitters.__dict__.keys():
if item.endswith('Fit') and \
fitters.__dict__[item].id == options_dict[chosen_minimizer.value]:
return [elt[0] for elt in fitters.__dict__[item].settings]
[12]:
print((f"With {w_choice_minimizer.value} optimizer, "
f"you can use {settings_selected_optimizer(w_choice_minimizer)} as arguments of `fit`"))
With Levenberg-Marquardt optimizer, you can use ['steps', 'ftol', 'xtol'] as arguments of `fit`
[13]:
result = fitters.fit(
problem,
starts=10,
keep_best=True,
method=options_dict[w_choice_minimizer.value],
steps=int(steps_fitting.value)
)
/home/docs/checkouts/readthedocs.org/user_builds/qensmodels/envs/latest/lib/python3.8/site-packages/scipy/optimize/_minpack_py.py:486: RuntimeWarning: overflow encountered in matmul
cov_x = invR @ invR.T
Showing the results
[14]:
problem.summarize().splitlines()
[14]:
[' A0 |......... 6.40563e-07 in (0,0.05)',
' A1 ........|. 0.898278 in (0,1)',
' center ....|..... -7.08125e-05 in (-0.1,0.1)',
' hwhm1 |......... 0.0499538 in (0,0.5)',
' hwhm2 .|........ 0.303983 in (0,3)',
' scale .........| 19.9852 in (1e-12,20)',
' A1 .........| 0.901528 in (0,1)',
' center .....|.... 4.53655e-05 in (-0.1,0.1)',
' hwhm1 |......... 0.0493148 in (0,0.5)',
' hwhm2 |......... 0.296466 in (0,3)',
' scale .........| 19.9644 in (1e-12,20)',
' A1 .........| 0.900315 in (0,1)',
' center ....|..... -0.000586752 in (-0.1,0.1)',
' hwhm1 |......... 0.0486912 in (0,0.5)',
' hwhm2 |......... 0.299615 in (0,3)',
' scale .........| 19.9939 in (1e-12,20)',
' A1 .........| 0.900316 in (0,1)',
' center .....|.... 5.12171e-05 in (-0.1,0.1)',
' hwhm1 |......... 0.0497165 in (0,0.5)',
' hwhm2 .|........ 0.301029 in (0,3)',
' scale .........| 19.9809 in (1e-12,20)',
' A1 ........|. 0.897142 in (0,1)',
' center ....|..... -0.000128966 in (-0.1,0.1)',
' hwhm1 .|........ 0.0505589 in (0,0.5)',
' hwhm2 .|........ 0.301772 in (0,3)',
' scale .........| 19.9926 in (1e-12,20)',
' A1 ........|. 0.898941 in (0,1)',
' center ....|..... -0.00043932 in (-0.1,0.1)',
' hwhm1 |......... 0.0494654 in (0,0.5)',
' hwhm2 .|........ 0.302364 in (0,3)',
' scale .........| 19.9861 in (1e-12,20)',
' A1 .........| 0.900841 in (0,1)',
' center ....|..... -4.12156e-05 in (-0.1,0.1)',
' hwhm1 |......... 0.0491177 in (0,0.5)',
' hwhm2 .|........ 0.305618 in (0,3)',
' scale .........| 19.9779 in (1e-12,20)',
' A1 ........|. 0.898702 in (0,1)',
' center .....|.... 0.000113609 in (-0.1,0.1)',
' hwhm1 .|........ 0.0507005 in (0,0.5)',
' hwhm2 |......... 0.297403 in (0,3)',
' scale .........| 19.9803 in (1e-12,20)',
' A1 ........|. 0.89853 in (0,1)',
' center ....|..... -8.64409e-05 in (-0.1,0.1)',
' hwhm1 .|........ 0.0501944 in (0,0.5)',
' hwhm2 .|........ 0.303552 in (0,3)',
' scale .........| 19.9788 in (1e-12,20)',
' A1 .........| 0.900698 in (0,1)',
' center .....|.... 4.01502e-05 in (-0.1,0.1)',
' hwhm1 |......... 0.0499751 in (0,0.5)',
' hwhm2 |......... 0.299563 in (0,3)',
' scale .........| 19.9519 in (1e-12,20)',
' A1 ........|. 0.898485 in (0,1)',
' center ....|..... -0.000161038 in (-0.1,0.1)',
' hwhm1 .|........ 0.0512825 in (0,0.5)',
' hwhm2 .|........ 0.300586 in (0,3)',
' scale .........| 19.9683 in (1e-12,20)',
' A1 ........|. 0.898977 in (0,1)',
' center ....|..... -0.000133716 in (-0.1,0.1)',
' hwhm1 .|........ 0.0500185 in (0,0.5)',
' hwhm2 .|........ 0.301412 in (0,3)',
' scale .........| 19.9652 in (1e-12,20)',
' A1 ........|. 0.897759 in (0,1)',
' center ....|..... -0.000117344 in (-0.1,0.1)',
' hwhm1 .|........ 0.0505495 in (0,0.5)',
' hwhm2 .|........ 0.307523 in (0,3)',
' scale .........| 19.9603 in (1e-12,20)',
' A1 ........|. 0.898874 in (0,1)',
' center .....|.... 0.000193948 in (-0.1,0.1)',
' hwhm1 .|........ 0.0504063 in (0,0.5)',
' hwhm2 .|........ 0.302893 in (0,3)',
' scale .........| 19.9866 in (1e-12,20)',
' A1 ........|. 0.896571 in (0,1)',
' center .....|.... 0.000280484 in (-0.1,0.1)',
' hwhm1 |......... 0.0495552 in (0,0.5)',
' hwhm2 .|........ 0.307106 in (0,3)',
' scale .........| 19.9848 in (1e-12,20)',
' A1 .........| 0.901675 in (0,1)',
' center ....|..... -0.000104905 in (-0.1,0.1)',
' hwhm1 .|........ 0.0509315 in (0,0.5)',
' hwhm2 .|........ 0.302898 in (0,3)',
' scale .........| 19.9771 in (1e-12,20)',
' A1 ........|. 0.898513 in (0,1)',
' center ....|..... -0.000169988 in (-0.1,0.1)',
' hwhm1 .|........ 0.0507559 in (0,0.5)',
' hwhm2 .|........ 0.304344 in (0,3)',
' scale .........| 19.9753 in (1e-12,20)',
' A0 |......... 1.32595e-10 in (0,0.05)',
' A1 ........|. 0.899526 in (0,1)',
' center .....|.... 0.000399457 in (-0.1,0.1)',
' hwhm1 .|........ 0.0503556 in (0,0.5)',
' hwhm2 |......... 0.296365 in (0,3)',
' scale ........|. 35.0602 in (0.1,40)',
' A1 ........|. 0.898901 in (0,1)',
' center ....|..... -6.89823e-05 in (-0.1,0.1)',
' hwhm1 |......... 0.0497165 in (0,0.5)',
' hwhm2 .|........ 0.302221 in (0,3)',
' scale ........|. 34.9585 in (0.1,40)',
' A1 ........|. 0.897172 in (0,1)',
' center ....|..... -0.000180213 in (-0.1,0.1)',
' hwhm1 .|........ 0.0501564 in (0,0.5)',
' hwhm2 .|........ 0.305905 in (0,3)',
' scale ........|. 34.9305 in (0.1,40)',
' A1 .........| 0.901657 in (0,1)',
' center .....|.... 3.60517e-06 in (-0.1,0.1)',
' hwhm1 |......... 0.0492323 in (0,0.5)',
' hwhm2 .|........ 0.306853 in (0,3)',
' scale ........|. 35.046 in (0.1,40)',
' A1 ........|. 0.898587 in (0,1)',
' center .....|.... 5.12415e-05 in (-0.1,0.1)',
' hwhm1 .|........ 0.050411 in (0,0.5)',
' hwhm2 .|........ 0.300086 in (0,3)',
' scale ........|. 35.0089 in (0.1,40)',
' A1 ........|. 0.899559 in (0,1)',
' center ....|..... -0.000243863 in (-0.1,0.1)',
' hwhm1 .|........ 0.0508027 in (0,0.5)',
' hwhm2 .|........ 0.307336 in (0,3)',
' scale ........|. 34.9786 in (0.1,40)',
' A1 ........|. 0.898591 in (0,1)',
' center .....|.... 0.000181708 in (-0.1,0.1)',
' hwhm1 .|........ 0.0501057 in (0,0.5)',
' hwhm2 .|........ 0.305296 in (0,3)',
' scale ........|. 34.9021 in (0.1,40)',
' A1 ........|. 0.897789 in (0,1)',
' center ....|..... -3.07694e-05 in (-0.1,0.1)',
' hwhm1 .|........ 0.0505332 in (0,0.5)',
' hwhm2 |......... 0.294994 in (0,3)',
' scale ........|. 34.9754 in (0.1,40)',
' A1 ........|. 0.899633 in (0,1)',
' center .....|.... 0.00030377 in (-0.1,0.1)',
' hwhm1 |......... 0.0490531 in (0,0.5)',
' hwhm2 |......... 0.296947 in (0,3)',
' scale ........|. 35.0062 in (0.1,40)',
' A1 .........| 0.900139 in (0,1)',
' center ....|..... -0.000145691 in (-0.1,0.1)',
' hwhm1 .|........ 0.0509461 in (0,0.5)',
' hwhm2 .|........ 0.30044 in (0,3)',
' scale ........|. 34.872 in (0.1,40)',
' A1 ........|. 0.899476 in (0,1)',
' center ....|..... -0.000318004 in (-0.1,0.1)',
' hwhm1 |......... 0.049114 in (0,0.5)',
' hwhm2 .|........ 0.305958 in (0,3)',
' scale ........|. 35.0246 in (0.1,40)']
[15]:
# Other method to display the results of the fit (chi**2 and parameters' values)
print("final chisq", problem.chisq_str())
for k, v, dv in zip(problem.labels(), result.x, result.dx):
print(k, ":", format_uncertainty_pm(v, dv))
final chisq 20567.610(31)
A0 : 0.00e-3 +/- 0.66e-3
A1 : 0.8983 +/- 0.0027
center : -71e-6 +/- 82e-6
hwhm1 : 0.04995 +/- 0.00022
hwhm2 : 0.3040 +/- 0.0082
scale : 19.985 +/- 0.023
A1 : 0.9015 +/- 0.0025
center : 45e-6 +/- 64e-6
hwhm1 : 0.04931 +/- 0.00020
hwhm2 : 0.2965 +/- 0.0075
scale : 19.964 +/- 0.019
A1 : 0.9003 +/- 0.0024
center : -587e-6 +/- 60e-6
hwhm1 : 0.04869 +/- 0.00020
hwhm2 : 0.2996 +/- 0.0078
scale : 19.994 +/- 0.019
A1 : 0.9003 +/- 0.0026
center : 51e-6 +/- 55e-6
hwhm1 : 0.04972 +/- 0.00021
hwhm2 : 0.3010 +/- 0.0084
scale : 19.981 +/- 0.019
A1 : 0.8971 +/- 0.0027
center : -129e-6 +/- 58e-6
hwhm1 : 0.05056 +/- 0.00021
hwhm2 : 0.3018 +/- 0.0086
scale : 19.993 +/- 0.019
A1 : 0.8989 +/- 0.0026
center : -439e-6 +/- 55e-6
hwhm1 : 0.04947 +/- 0.00020
hwhm2 : 0.3024 +/- 0.0089
scale : 19.986 +/- 0.019
A1 : 0.9008 +/- 0.0025
center : -41e-6 +/- 82e-6
hwhm1 : 0.04912 +/- 0.00020
hwhm2 : 0.3056 +/- 0.0091
scale : 19.978 +/- 0.019
A1 : 0.8987 +/- 0.0027
center : 114e-6 +/- 52e-6
hwhm1 : 0.05070 +/- 0.00020
hwhm2 : 0.2974 +/- 0.0090
scale : 19.980 +/- 0.019
A1 : 0.8985 +/- 0.0025
center : -86e-6 +/- 37e-6
hwhm1 : 0.05019 +/- 0.00019
hwhm2 : 0.3036 +/- 0.0088
scale : 19.979 +/- 0.019
A1 : 0.9007 +/- 0.0024
center : 40e-6 +/- 40e-6
hwhm1 : 0.04998 +/- 0.00019
hwhm2 : 0.2996 +/- 0.0089
scale : 19.952 +/- 0.019
A1 : 0.8985 +/- 0.0024
center : -161e-6 +/- 37e-6
hwhm1 : 0.05128 +/- 0.00019
hwhm2 : 0.3006 +/- 0.0087
scale : 19.968 +/- 0.018
A1 : 0.8990 +/- 0.0023
center : -134e-6 +/- 38e-6
hwhm1 : 0.05002 +/- 0.00018
hwhm2 : 0.3014 +/- 0.0084
scale : 19.965 +/- 0.018
A1 : 0.8978 +/- 0.0021
center : -117e-6 +/- 30e-6
hwhm1 : 0.05055 +/- 0.00017
hwhm2 : 0.3075 +/- 0.0081
scale : 19.960 +/- 0.018
A1 : 0.8989 +/- 0.0020
center : 194e-6 +/- 35e-6
hwhm1 : 0.05041 +/- 0.00017
hwhm2 : 0.3029 +/- 0.0077
scale : 19.987 +/- 0.017
A1 : 0.8966 +/- 0.0018
center : 280e-6 +/- 27e-6
hwhm1 : 0.04956 +/- 0.00016
hwhm2 : 0.3071 +/- 0.0073
scale : 19.985 +/- 0.017
A1 : 0.9017 +/- 0.0019
center : -105e-6 +/- 25e-6
hwhm1 : 0.05093 +/- 0.00016
hwhm2 : 0.3029 +/- 0.0074
scale : 19.977 +/- 0.017
A1 : 0.8985 +/- 0.0018
center : -170e-6 +/- 27e-6
hwhm1 : 0.05076 +/- 0.00016
hwhm2 : 0.3043 +/- 0.0069
scale : 19.975 +/- 0.016
A0 : 0.000e-3 +/- 0.094e-3
A1 : 0.8995 +/- 0.0016
center : 399e-6 +/- 53e-6
hwhm1 : 0.05036 +/- 0.00011
hwhm2 : 0.296 +/- 0.010
scale : 35.060 +/- 0.046
A1 : 0.8989 +/- 0.0015
center : -69e-6 +/- 41e-6
hwhm1 : 0.049716 +/- 0.000084
hwhm2 : 0.3022 +/- 0.0058
scale : 34.959 +/- 0.022
A1 : 0.8972 +/- 0.0017
center : -180e-6 +/- 45e-6
hwhm1 : 0.05016 +/- 0.00010
hwhm2 : 0.3059 +/- 0.0065
scale : 34.930 +/- 0.026
A1 : 0.9017 +/- 0.0017
center : 0.00e9 +/- 0.10e9
hwhm1 : 0.049232 +/- 0.000097
hwhm2 : 0.3069 +/- 0.0073
scale : 35.046 +/- 0.026
A1 : 0.8986 +/- 0.0019
center : 51e-6 +/- 54e-6
hwhm1 : 0.05041 +/- 0.00011
hwhm2 : 0.3001 +/- 0.0077
scale : 35.009 +/- 0.028
A1 : 0.8996 +/- 0.0020
center : -244e-6 +/- 46e-6
hwhm1 : 0.05080 +/- 0.00011
hwhm2 : 0.3073 +/- 0.0082
scale : 34.979 +/- 0.030
A1 : 0.8986 +/- 0.0020
center : 182e-6 +/- 46e-6
hwhm1 : 0.05011 +/- 0.00011
hwhm2 : 0.3053 +/- 0.0082
scale : 34.902 +/- 0.030
A1 : 0.8978 +/- 0.0021
center : -31e-6 +/- 39e-6
hwhm1 : 0.05053 +/- 0.00012
hwhm2 : 0.2950 +/- 0.0081
scale : 34.975 +/- 0.030
A1 : 0.8996 +/- 0.0018
center : 304e-6 +/- 38e-6
hwhm1 : 0.049053 +/- 0.000098
hwhm2 : 0.2969 +/- 0.0078
scale : 35.006 +/- 0.028
A1 : 0.9001 +/- 0.0018
center : -146e-6 +/- 30e-6
hwhm1 : 0.050946 +/- 0.000095
hwhm2 : 0.3004 +/- 0.0081
scale : 34.872 +/- 0.029
A1 : 0.8995 +/- 0.0019
center : -318e-6 +/- 24e-6
hwhm1 : 0.049114 +/- 0.000076
hwhm2 : 0.3060 +/- 0.0086
scale : 35.025 +/- 0.039
Display final configuration: experimental data, fitting model with output of fitting for the refined parameters
[16]:
slider1 = ipywidgets.IntSlider(value=0, min=0, max=len(q_5A)+len(q_8A)-1, continuous_update=False)
output1 = ipywidgets.Output()
with output1:
fig1, ax1 = plt.subplots(nrows=2, ncols=1, sharex=True)
ax1[0].grid(); ax1[1].grid()
ax1[1].set_ylabel('Residual')
ax1[1].set_xlabel(f"$\hbar \omega$")
fig_q(model_all_qs, ax1, 0)
def update_profile1(change):
"""
Update plots for a new q-value
"""
with output1:
ax1[0].clear(); ax1[1].lines.clear()
ax1[0].grid()
fig_q(model_all_qs, ax1, change['new'])
slider1.observe(update_profile1, names="value")
slider1_label = ipywidgets.Label("q value to display")
slider1_comp = ipywidgets.HBox([slider1_label, slider1])
ipywidgets.VBox([slider1_comp, output1])
[16]:
[ ]: