Several datasets can be fitted simultaneously by concatenating their residual vectors in a user-defined objective function:
def residuals(P):
values = P.valuesdict()
r1 = data1 - sim_builder1(values).simulate().intensities()
r2 = data2 - sim_builder2(values).simulate().intensities()
return np.concatenate([r1.ravel(), r2.ravel()])
For a full example, see Examples > Fitting > Simultaneous fit.
See the honeycomb fit example, where differential evolution is called with an objective function that has contributions from several reflectometry datasets and models:
def residuals(P):
values = P.valuesdict()
result = []
for dataset in datasets:
simulated = run_simulation(
dataset["q"], dataset["q_resolution"], values,
spin_sign=dataset["spin_sign"],
temperature=dataset["temperature"])
relative_difference = ((dataset["r"] - simulated)
/ (dataset["r"] + simulated))
result.append(relative_difference/np.sqrt(len(simulated)))
return np.concatenate(result)
result = lmfit.minimize(
residuals, P, method="differential_evolution", ...)