def mon_mult(self, mon, returnType='Poly'): ''' Multiplies a polynomial by a monomial. Parameters ---------- mon : tuple The powers in the monomial. Ex: x^3*y^4*z^2 would be input as (3,4,2) returnType : str Which type of object to return. Returns ------- MultiPower object if returnType is 'Poly' ndarray if returnType is 'Matrix' ''' mon = np.array(mon) result = np.zeros(self.shape + mon) result[slice_bottom(self.coeff)] = self.coeff if returnType == 'Poly': return MultiPower(result, clean_zeros=False, lead_term=self.lead_term + mon) elif returnType == 'Matrix': return result
def _mon_mult1(initial_matrix, idx, dim_mult): """ Executes monomial multiplication in one dimension. Parameters ---------- initial_matrix : array_like Matrix of coefficients that represent a Chebyshev polynomial. idx : tuple of ints The index of a monomial of one variable to multiply by initial_matrix. dim_mult : int The location of the non-zero value in idx. Returns ------- ndarray Coeff that are the result of the one dimensial monomial multiplication. """ p1 = np.zeros(initial_matrix.shape + idx) p1[slice_bottom(initial_matrix)] = initial_matrix largest_idx = [i - 1 for i in initial_matrix.shape] new_shape = [ max(i, j) for i, j in itertools.zip_longest(largest_idx, idx, fillvalue=0) ] #finds the largest length in each dimmension if initial_matrix.shape[dim_mult] <= idx[dim_mult]: add_a = [ i - j for i, j in itertools.zip_longest( new_shape, largest_idx, fillvalue=0) ] add_a_list = np.zeros((len(new_shape), 2)) #changes the second column to the values of add_a and add_b. add_a_list[:, 1] = add_a #uses add_a_list and add_b_list to pad each polynomial appropriately. initial_matrix = np.pad(initial_matrix, add_a_list.astype(int), 'constant') number_of_dim = initial_matrix.ndim shape_of_self = initial_matrix.shape #Loop iterates through each dimension of the polynomial and folds in that dimension for i in range(number_of_dim): if idx[i] != 0: initial_matrix = MultiCheb._fold_in_i_dir( initial_matrix, number_of_dim, i, shape_of_self[i], idx[i]) if p1.shape != initial_matrix.shape: idx = [i - j for i, j in zip(p1.shape, initial_matrix.shape)] result = np.zeros(np.array(initial_matrix.shape) + idx) result[slice_top(initial_matrix)] = initial_matrix initial_matrix = result Pf = p1 + initial_matrix return .5 * Pf