示例#1
0
def multiply_multivariate_orthonormal_polynomial_expansions(
        product_coefs_1d, poly_indices1, poly_coefficients1, poly_indices2,
        poly_coefficients2):
    num_indices1 = poly_indices1.shape[1]
    num_indices2 = poly_indices2.shape[1]
    assert num_indices2 <= num_indices1
    assert poly_coefficients1.shape[0] == num_indices1
    assert poly_coefficients2.shape[0] == num_indices2

    # following assumes the max degrees were used to create product_coefs_1d
    max_degrees1 = poly_indices1.max(axis=1)
    max_degrees2 = poly_indices2.max(axis=1)
    basis_coefs, basis_indices = [], []
    for ii in range(num_indices1):
        poly_index_ii = poly_indices1[:, ii]
        for jj in range(num_indices2):
            poly_index_jj = poly_indices2[:, jj]
            product_indices, product_coefs = \
                compute_multivariate_orthonormal_basis_product(
                    product_coefs_1d, poly_index_ii, poly_index_jj,
                    max_degrees1, max_degrees2)
            # print(ii,jj,product_coefs,poly_index_ii,poly_index_jj)
            # TODO for unique polynomials the product_coefs and indices
            # of [0,1,2] is the same as [2,1,0] so perhaps store
            # sorted active indices and look up to reuse computations
            product_coefs_iijj = product_coefs*poly_coefficients1[ii, :] *\
                poly_coefficients2[jj, :]
            basis_coefs.append(product_coefs_iijj)
            basis_indices.append(product_indices)

            assert basis_coefs[-1].shape[0] == basis_indices[-1].shape[1]

    indices, coefs = add_polynomials(basis_indices, basis_coefs)
    return indices, coefs
示例#2
0
 def __sub__(self, other):
     indices_list = [self.indices, other.indices]
     coefs_list = [self.coefficients, -other.coefficients]
     indices, coefs = add_polynomials(indices_list, coefs_list)
     poly = get_polynomial_from_variable(self.var_trans.variable)
     poly.set_indices(indices)
     poly.set_coefficients(coefs)
     return poly