def mean_cooperation(self): expr = self.__get_replicator_rhs() if expr == 0: return 0.0 p = Poly(expr, domain='RR') roots = sorted([float(r) for r in p.nroots(n=15, maxsteps=300) if r.is_real and r >= 0.00 and r <= 1.00]) roots = [0.0] + roots + [1.0] coop = 0 p = Poly(x * (1 - x) * expr, domain='RR') for i in range(1, len(roots)): difference = roots[i] - roots[i - 1] poly_val = p.subs(x, roots[i - i] + difference / 2) coop += roots[i - 1] * difference if poly_val < 0 else roots[i] * difference return coop