function estimate_parameters
    initial_guess = [1000, 0.1, 0.1];
    initial_conditions = [T0_initial, T1_initial];
    objective = @(params) model_error(params, tspan, initial_conditions, T0_ss, T1_ss);
    options = optimoptions('lsqnonlin', 'Display', 'iter', 'TolFun', 1e-6, 'TolX', 1e-6);
    [estimated_params, resnorm] = lsqnonlin(objective, initial_guess, [], [], options);
    fprintf('Estimated Parameters:\n');
    fprintf('s = %.4f\n', estimated_params(1));
    fprintf('d = %.4f\n', estimated_params(2));
    fprintf('gamma = %.4f\n', estimated_params(3));
function error = model_error(params, tspan, initial_conditions, T0_ss, T1_ss)
    [~, T] = ode45(@(t, y) odesystem(t, y, s, d, gamma), tspan, initial_conditions);
    T0_error = T(end, 1) - T0_ss;
    T1_error = T(end, 2) - T1_ss;
    error = [T0_error; T1_error];
function dydt = odesystem(t, y, s, d, gamma)
    dT0dt = s - d * T0 - gamma * T0;
    dT1dt = 2 * d * T0 + d * T1 - gamma * T1;