def METHOD_NAME(Ref, Pert, solve_beam=True):
    """
    Given 2 Info() classes associated to a reference linearisation point Ref and a
    perturbed state Pert, the method produces in output the prediction at the
    Pert state of a linearised model.
    The solution is carried on using both the aero and beam input
    """
    ### define perturbations
    dq = Pert.q - Ref.q
    dqdot = Pert.qdot - Ref.qdot
    dzeta = Pert.zeta - Ref.zeta
    dzeta_dot = Pert.zeta_dot - Ref.zeta_dot
    du_ext = Pert.u_ext - Ref.u_ext
    num_dof_str = len(dq)
    dzeta_exp = np.dot(Ref.Kas[:len(dzeta), :num_dof_str], dq)
    SSaero = Ref.SSaero
    SSbeam = Ref.SSbeam
    # zeta in
    usta = np.concatenate([dzeta, dzeta_dot, du_ext])
    if hasattr(Ref, 'Asteady_inv'):
        #x_sta = A_steady^-1 dot B u_sta
        xsta = np.dot(Ref.Asteady_inv, np.dot(SSaero.B, usta))
    else:
        # x_sta = linsolve(A_steady, Bu)
        Asteady = np.eye(*SSaero.A.shape) - SSaero.A
        xsta = np.linalg.solve(Asteady, np.dot(SSaero.B, usta))
    # y_sta = C x_sta + D u_sta
    ysta = np.dot(SSaero.C, xsta) + np.dot(SSaero.D, usta)
    ftot_aero = Ref.ftot + np.dot(Ref.Kftot, ysta)
    mtot_aero = Ref.mtot + np.dot(Ref.Kmtot, ysta) + np.dot(Ref.Kmtot_disp, dzeta)
    #### beam in
    if solve_beam:
        # warning: we need to add first the contribution due to velocity change!!!
        usta_uinf = np.concatenate([0. * dzeta, 0. * dzeta_dot, du_ext])
        xsta_uinf = np.linalg.solve(Asteady, np.dot(SSaero.B, usta_uinf))
        ysta_uinf = np.dot(SSaero.C, xsta_uinf) + np.dot(SSaero.D, usta_uinf)
        usta = np.concatenate([dq, dqdot])
        if hasattr(Ref, 'Asteady_inv'):
            xsta = np.dot(Ref.Asteady_inv, np.dot(SSbeam.B, usta))
        else:
            Asteady = np.eye(*SSbeam.A.shape) - SSbeam.A
            xsta = np.linalg.solve(Asteady, np.dot(SSbeam.B, usta))
        ysta = ysta_uinf + np.dot(SSbeam.C, xsta) + np.dot(SSbeam.D, usta)
        ftot_beam = Ref.ftot + np.dot(Ref.Kftot, ysta)
        mtot_beam = Ref.mtot + np.dot(Ref.Kmtot, ysta) + np.dot(Ref.Kmtot_disp, dzeta_exp)
    else:
        ftot_beam, mtot_beam = None, None
    return ftot_aero, mtot_aero, ftot_beam, mtot_beam