Fitting several datasets at once

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", ...)