def function_convolution(self, dist_1, dist_2, bins=50): a_1, b_1, a_2, b_2 = 0, 0, 0, 0 if dist_1 in self.bounds: a_1, b_1 = self.bounds[dist_1] else: a_1, b_1 = calculate_bounds_of_probability_distribution(dist_1) self.bounds[dist_1] = a_1, b_1 if dist_2 in self.bounds: a_2, b_2 = self.bounds[dist_2] else: a_2, b_2 = calculate_bounds_of_probability_distribution(dist_2) self.bounds[dist_2] = a_2, b_2 if (type(dist_1.dist), type(dist_2.dist)) == (uniform_gen, uniform_gen): return self.function_convolution_uniform((a_1, b_1), (a_2, b_2)) convolution_bounds_a, convolution_bounds_b = min(a_1, a_2), max(b_1, b_2) delta = fabs(convolution_bounds_a - convolution_bounds_b) / bins convolution_interval = TimeInterval(convolution_bounds_a, convolution_bounds_b, bins) x = [dist_1.pdf(t) for t in convolution_interval] y = [dist_2.pdf(t) for t in reversed(convolution_interval)] c = convolve(x, y) dictionary_convolution = {} for t in xrange(len(c)): dictionary_convolution[delta * t] = c[t] bias = calculateCenterMass(dictionary_convolution)[0] + dist_2.mean() - dist_1.mean() dictionary_convolution_biased = {} for t in dictionary_convolution: dictionary_convolution_biased[t - bias] = dictionary_convolution[t] convolution_function = FunctionPiecewiseLinear(dictionary_convolution_biased, FunctionHorizontalLinear(0)) return convolution_function.normalised()