Ejemplo n.º 1
0
def build_orthogonal_basis(n, p):
	# Build a basis from total degree monomials
	monomial_basis = []
	x = [Symbol('x%d' % k) for k in range(1,n+1)]
	for alpha in MultiIndex(n, p):
		term = 1
		for j in range(n):
			term *= x[j]**alpha[j]
		monomial_basis.append(term)
	
	# Now build the corresponding mass matrix
	M = zeros(len(monomial_basis), len(monomial_basis))
	for i, psi1 in enumerate(monomial_basis):
		for j, psi2 in enumerate(monomial_basis):
			if i <= j:
				out = psi1*psi2
				for k in range(n):
					out = integrate(out, (x[k], -1,1))
				M[i,j] = out
				M[j,i] = out
	
	R = M.cholesky().inv()
	
	# Now build our orthogonal basis
	basis_terms = []
	basis = []
	for i in range(len(monomial_basis)):
		term = 0
		for j, psi in enumerate(monomial_basis):
			term += R[i,j]*psi

		basis.append(term)
		# Make the sparse version
		term = Poly(term, x)
		term = [ (alpha, float(term.coeff_monomial(alpha)) ) for alpha in term.monoms()]
		basis_terms.append(term)
		
	# Now build the derivatives
	basis_terms_der = []
	for i in range(n):
		basis_terms_der_curr = []
		for psi in basis:
			# Make the sparse version
			term = Poly(diff(psi, x[i]), x)
			term = [ (alpha, float(term.coeff_monomial(alpha)) ) for alpha in term.monoms()]
			basis_terms_der_curr.append(term)

			basis_terms_der.append(basis_terms_der_curr)
	
	return basis_terms, basis_terms_der
Ejemplo n.º 2
0
    def get_matrix(self):
        """
        Returns
        -------
        macaulay_matrix: Matrix
            The Macaulay's matrix
        """
        rows = []
        row_coefficients = self.get_row_coefficients()
        for i in range(self.n):
            for multiplier in row_coefficients[i]:
                coefficients = []
                poly = Poly(self.polynomials[i] * multiplier, *self.variables)

                for mono in self.monomial_set:
                    coefficients.append(poly.coeff_monomial(mono))
                rows.append(coefficients)

        macaulay_matrix = Matrix(rows)
        return macaulay_matrix
    def get_matrix(self):
        """
        Returns
        -------
        macaulay_matrix: Matrix
            The Macaulay's matrix
        """
        rows = []
        row_coefficients = self.get_row_coefficients()
        for i in range(self.n):
            for multiplier in row_coefficients[i]:
                coefficients = []
                poly = Poly(self.polynomials[i] * multiplier,
                            *self.variables)

                for mono in self.monomial_set:
                    coefficients.append(poly.coeff_monomial(mono))
                rows.append(coefficients)

        macaulay_matrix = Matrix(rows)
        return macaulay_matrix