def beta_leja_quadrature_rule(alpha_stat, beta_stat, level, growth_rule=leja_growth_rule, samples_filename=None, return_weights_for_all_levels=True, initial_points=None): """ Return the samples and weights of the Leja quadrature rule for the beta probability measure. By construction these rules have polynomial ordering. Parameters ---------- level : integer The level of the isotropic sparse grid. alpha_stat : integer The alpha shape parameter of the Beta distribution beta_stat : integer The beta shape parameter of the Beta distribution samples_filename : string Name of file to save leja samples and weights to Return ------ ordered_samples_1d : np.ndarray (num_samples_1d) The reordered samples. ordered_weights_1d : np.ndarray (num_samples_1d) The reordered weights. """ from pyapprox.multivariate_polynomials import PolynomialChaosExpansion from pyapprox.leja_sequences import get_leja_sequence_1d,\ get_quadrature_weights_from_samples num_vars = 1 num_leja_samples = growth_rule(level) #print(('num_leja_samples',num_leja_samples)) # freezing beta rv like below has huge overhead # it creates a docstring each time which adds up to many seconds # for repeated calls to pdf #univariate_weight_function=lambda x: beta_rv( # alpha_stat,beta_stat).pdf((x+1)/2)/2 #univariate_weight_function = lambda x: beta_rv.pdf( # (x+1)/2,alpha_stat,beta_stat)/2 univariate_weight_function = lambda x: beta_pdf(alpha_stat, beta_stat, (x + 1) / 2) / 2 univariate_weight_function_deriv = lambda x: beta_pdf_derivative( alpha_stat, beta_stat, (x + 1) / 2) / 4 weight_function = partial(evaluate_tensor_product_function, [univariate_weight_function] * num_vars) weight_function_deriv = partial(gradient_of_tensor_product_function, [univariate_weight_function] * num_vars, [univariate_weight_function_deriv] * num_vars) # assert np.allclose( # (univariate_weight_function(0.5+1e-8)- # univariate_weight_function(0.5))/1e-8, # univariate_weight_function_deriv(0.5),atol=1e-6) poly = PolynomialChaosExpansion() # must be imported locally otherwise I have a circular dependency from pyapprox.variable_transformations import \ define_iid_random_variable_transformation from scipy.stats import uniform var_trans = define_iid_random_variable_transformation( uniform(-1, 2), num_vars) poly_opts = { 'poly_type': 'jacobi', 'alpha_poly': beta_stat - 1, 'beta_poly': alpha_stat - 1, 'var_trans': var_trans } poly.configure(poly_opts) if samples_filename is None or not os.path.exists(samples_filename): ranges = [-1, 1] from scipy.stats import beta as beta_rv if initial_points is None: initial_points = np.asarray( [[2 * beta_rv(alpha_stat, beta_stat).ppf(0.5) - 1]]).T leja_sequence = get_leja_sequence_1d(num_leja_samples, initial_points, poly, weight_function, weight_function_deriv, ranges) if samples_filename is not None: np.savez(samples_filename, samples=leja_sequence) else: leja_sequence = np.load(samples_filename)['samples'] #print (leja_sequence.shape[1],growth_rule(level),level) assert leja_sequence.shape[1] >= growth_rule(level) leja_sequence = leja_sequence[:, :growth_rule(level)] indices = np.arange(growth_rule(level))[np.newaxis, :] poly.set_indices(indices) ordered_weights_1d = get_leja_sequence_quadrature_weights( leja_sequence, growth_rule, poly.basis_matrix, weight_function, level, return_weights_for_all_levels) return leja_sequence[0, :], ordered_weights_1d
def pdf(x): return beta_pdf(1, 1, (x + 1) / 2) / 2
def pdf(x): return beta_pdf(alpha_stat, beta_stat, (x + 1) / 2) / 2
def univariate_weight_function(x): return beta_pdf( alpha_stat, beta_stat, (x+1)/2)/2 def univariate_weight_function_deriv(x): return beta_pdf_derivative(