예제 #1
0
 def test_polymulx(self):
     assert_equal(poly.polymulx([0]), [0])
     assert_equal(poly.polymulx([1]), [0, 1])
     for i in range(1, 5):
         ser = [0]*i + [1]
         tgt = [0]*(i + 1) + [1]
         assert_equal(poly.polymulx(ser), tgt)
예제 #2
0
    def gen_poly(self, n):
        self.order = n

        # zeroth polynomial
        self.poly = [nppoly.polyone]
        alpha = [self.get_alpha(self.poly[0])]
        beta = [1.]

        # first polynomial
        self.poly.append(nppoly.polymulx(self.poly[0]))
        self.poly[1] = nppoly.polyadd(self.poly[1], -alpha[0] * self.poly[0])
        alpha.append(self.get_alpha(self.poly[1]))
        beta.append(self.get_beta(self.poly[1], self.poly[0]))

        # reccurence relation for other polynomials
        for i in range(2, n + 1):
            p_i = nppoly.polymulx(self.poly[i - 1])
            p_i = nppoly.polyadd(p_i, -alpha[i - 1] * self.poly[i - 1])
            p_i = nppoly.polyadd(p_i, -beta[i - 1] * self.poly[i - 2])

            self.poly.append(p_i)

            alpha.append(self.get_alpha(self.poly[i]))
            beta.append(self.get_beta(self.poly[i], self.poly[i - 1]))

        # normalise polynomials
        for i in range(len(self.poly)):
            self.poly[i] = self.poly[i] / np.prod(beta[:i])

        # create Jacobi matrix
        self.jacobi = (np.diag(np.sqrt(beta[1:]), -1) + np.diag(alpha, 0) +
                       np.diag(np.sqrt(beta[1:]), 1))
예제 #3
0
 def test_polymulx(self):
     assert_equal(poly.polymulx([0]), [0])
     assert_equal(poly.polymulx([1]), [0, 1])
     for i in range(1, 5):
         ser = [0] * i + [1]
         tgt = [0] * (i + 1) + [1]
         assert_equal(poly.polymulx(ser), tgt)
예제 #4
0
def make_hermite():
    # Hermite polynomials, recursion p_n(x)=x*p_(n-1)(x)-(n-1)*p_(n-2), p_0(x)=1, p_1(x)=x
    # _poly_function_basis_recursive((lambda x: 1, lambda x: x),  (lambda n, x: x, lambda n, x: 1 - n)) # as example
    basis = PolyBasis(
        "Hermite",
        _poly_basis_recursive(
            [np.array([1.]), np.array([0., 1.])],  # starting values
            [(0, lambda n, c: npoly.polymulx(c)), (1, lambda n, c: c *
                                                   (1. - n))]),
        lambda degree: calculate_nodes_and_weights(np.zeros(degree),
                                                   np.arange(1, degree)))
    basis.polys = lambda degree: poly_by_roots(
        basis.nodes_and_weights(degree)[0], 1)
    return basis
예제 #5
0
def make_legendre():
    # Legendre polynomials, interval assumed to be [-1,1], recursion p_n(x)=x(2n-1)/n * p_(n-1)(x)-(n-1)/n*p_(n-2)(x)
    # http://math.stackexchange.com/questions/12160/roots-of-legendre-polynomial gives the monic version of the legendre
    # polynomials: p_n(x)=x*p_(n-1)(x)-(n-1)^2/(4(n-1)^2-1)p_(n-2), to get the normal polynomial divide by
    # (n!)^2 * 2^n / (2n)!
    basis = PolyBasis(
        "Legendre",
        _poly_basis_recursive(
            [np.array([1.]), np.array([0., 1.])],  # starting values
            [(0, lambda n, c: (2. * n - 1) / n * npoly.polymulx(c)),
             (1, lambda n, c: (1. - n) / n * c)]),
        lambda degree: calculate_nodes_and_weights(
            np.zeros(degree),
            np.arange(1, degree)**2 / (4 * (np.arange(1, degree)**2) - 1)))
    return basis
예제 #6
0
    def jacobi_basis():
        def get_factor(n):
            return (2 * n + alpha + beta -
                    1) * (2 * n + alpha + beta) / (2 * n * (n + alpha + beta))

        # this doesn't even look nice on paper
        return _poly_basis_recursive(
            [
                np.array([1.]),
                np.array([0.5 * (alpha - beta), 0.5 * (alpha + beta + 2)])
            ],  # starting values
            [(0, lambda n, c: npoly.polyadd(
                npoly.polymulx(c) * get_factor(n), -c * get_factor(n) *
                (beta**2 - alpha**2) / ((2 * n + alpha + beta - 2) *
                                        (2 * n + alpha + beta)))),
             (1, lambda n, c: c *
              (-2 * get_factor(n) * (n + alpha - 1) * (n + beta - 1) /
               ((2 * n + alpha + beta - 2) * (2 * n + alpha + beta - 1))))])
예제 #7
0
def make_laguerre(alpha):
    assert alpha > 0
    # normalized recurrence relation: q_n=xq_(n-1) - (2(n-1) + alpha)q_(n-1) - (n-1)(n - 2 + alpha)q_(n-2)
    # to obtain the regular polynomials multiply by (-1)^n / n!
    basis = PolyBasis(
        "Laguerre",
        _poly_basis_recursive(
            [np.array([1.]), np.array([alpha, -1.])],
            [(0, lambda n, c: npoly.polyadd(c * (2 * (n - 1) + alpha) / n,
                                            -npoly.polymulx(c) / n)),
             (1, lambda n, c: -(n - 1 + alpha - 1) / n * c)]),
        lambda degree: calculate_nodes_and_weights(
            2 * np.arange(0, degree) + alpha,
            np.arange(1, degree) * (np.arange(1, degree) - 1 + alpha)),
        params=(alpha, ))
    basis.polys = lambda degree: poly_by_roots(
        basis.nodes_and_weights(degree)[0],
        (1, -1)[degree % 2] / math.sqrt(rising_factorial(
            alpha, degree)) / math.sqrt(math.factorial(degree)))  # (-1)^n/n!
    return basis
예제 #8
0
파일: __init__.py 프로젝트: Bankq/CS6998
def polymulx(cs):
    from numpy.polynomial.polynomial import polymulx
    return polymulx(cs)
예제 #9
0
파일: __init__.py 프로젝트: 1950/sawbuck
def polymulx(cs):
    from numpy.polynomial.polynomial import polymulx
    return polymulx(cs)
예제 #10
0
    def get_alpha(self, p):
        p2 = nppoly.polypow(p, 2)
        xp2 = nppoly.polymulx(p2)

        return (self.integrate(xp2, self.intlims[0], self.intlims[1]) /
                self.integrate(p2, self.intlims[0], self.intlims[1]))