Numerical Riemannn integral of the IMF (stupid simple).

        Parameters:
        -----------
        mass_min: minimum mass bound for integration (solar masses)
        mass_max: maximum mass bound for integration (solar masses)
        log_mode[True]: use logarithmic steps in stellar mass as oppose to linear
            weight[False]: weight the integral by stellar mass
            steps: number of numerical integration steps

        Returns:
        --------
        result of integral

def integrate(self, mass_min, mass_max, log_mode=True, weight=False, steps=1e4):
        """ Numerical Riemannn integral of the IMF (stupid simple).

        Parameters:
        -----------
        mass_min: minimum mass bound for integration (solar masses)
        mass_max: maximum mass bound for integration (solar masses)
        log_mode[True]: use logarithmic steps in stellar mass as oppose to linear
            weight[False]: weight the integral by stellar mass
            steps: number of numerical integration steps

        Returns:
        --------
        result of integral
        """
        if log_mode:
            d_log_mass = (np.log10(mass_max) - np.log10(mass_min)) / float(steps)
            log_mass = np.linspace(np.log10(mass_min), np.log10(mass_max), steps)
            mass = 10.**log_mass

            if weight:
                return np.sum(mass * d_log_mass * self.pdf(mass, log_mode=True))
            else:
                return np.sum(d_log_mass * self.pdf(mass, log_mode=True))
        else:
            d_mass = (mass_max - mass_min) / float(steps)
            mass = np.linspace(mass_min, mass_max, steps)

            if weight:
                return np.sum(mass * d_mass * self.pdf(mass, log_mode=False))
            else:
                return np.sum(d_mass * self.pdf(mass, log_mode=False))