示例#1
0
    def gradient_set( self, x, degree, a = None, b = None ):
        if ( ( a is not None ) and ( b is not None ) ):
            x = ( 2. * x - b - a ) / ( b - a );
         
        if ( degree == 0 ):
            grad = 0.;
        elif ( degree == 1 ):
            grad = (self.alpha_poly + self.beta_poly + 2.)/2.;
        elif ( degree == 2 ):
            xm1 = x - 1.;
            grad = ( (self.alpha_poly + self.beta_poly + 3.) * 
                     (self.alpha_poly + self.beta_poly + 4.)*xm1 +
                     2.*(self.alpha_poly + self.beta_poly + 3.) * 
                     (self.alpha_poly + 2.) ) / 4.;

        else:
            # Support higher degree polynomials using the 3 point recursion 
            #formula:
            xm1 = x - 1.
            dPabdx_n = ( (self.alpha_poly + self.beta_poly + 3.) * 
                         (self.alpha_poly + self.beta_poly + 4.)*xm1 + 
                         2.*(self.alpha_poly + self.beta_poly + 3.) * 
                         (self.alpha_poly + 2.) ) / 4.
            dPabdx_nm1 = (self.alpha_poly + self.beta_poly + 2.)/2.;
            for i in xrange( 2, degree ):
                ab2i = self.alpha_poly + self.beta_poly + 2.*i
                pab2i3 = pochhammer(ab2i, 3);
                grad = ( ( (ab2i+1.)*(self.alpha_poly*self.alpha_poly-self.beta_poly*self.beta_poly) + x*pab2i3 ) * dPabdx_n + pab2i3*type1_value(x,i)- 2.*(i+self.alpha_poly)*(i+self.beta_poly)*(ab2i+2.)*dPabdx_nm1 ) / ( 2.*(i+1.)*(i+self.alpha_poly+self.beta_poly+1.)*ab2i );
                if ( i != degree-1 ):
                    dPabdx_nm1 = dPabdx_n;
                    dPabdx_n   = grad;

        return grad
示例#2
0
    def value_set( self, x, degree, a = None, b = None ):
        if ( ( a is not None ) and ( b is not None ) ):
            x = ( 2. * x - b - a ) / ( b - a );

        if ( degree == 0 ):
            value = 1.;
        elif ( degree == 1 ):
            value = (self.alpha_poly + self.beta_poly + 2.)*(x-1.)/2. + \
                self.alpha_poly + 1.;
        elif ( degree == 2 ):
            xm1 = x - 1.;
            value = ( (self.alpha_poly + self.beta_poly + 3.) * 
                      (self.alpha_poly + self.beta_poly + 4.)*xm1*xm1 +
                      4.*(self.alpha_poly + self.beta_poly + 3.) * 
                      (self.alpha_poly + 2.)*xm1 +
                      4.*(self.alpha_poly + 1.)*(self.alpha_poly + 2.) ) / 8.;
        else:
            # Support higher degree polynomials using the 3 point recursion 
            # formula:
            xm1 = x - 1.
            Pab_n = ( (self.alpha_poly + self.beta_poly + 3.) * 
                      (self.alpha_poly + self.beta_poly + 4.)*xm1*xm1
                      + 4*(self.alpha_poly + self.beta_poly + 3.) * 
                      (self.alpha_poly + 2.)*xm1
                      + 4.*(self.alpha_poly + 1.)*(self.alpha_poly + 2.) ) / 8.
            Pab_nm1 = (self.alpha_poly + self.beta_poly + 2.)*xm1/2. + \
                self.alpha_poly + 1.;
            for i in xrange( 2, degree ):
                ab2i = self.alpha_poly + self.beta_poly + 2.*i;
                value = ( ( (ab2i+1.)*(self.alpha_poly*self.alpha_poly-self.beta_poly*self.beta_poly) + x*pochhammer(ab2i,3) )*Pab_n - 2.*(i+self.alpha_poly)*(i+self.beta_poly)*(ab2i+2.)*Pab_nm1 ) / ( 2.*(i+1.)*(i+self.alpha_poly+self.beta_poly+1.)*ab2i );
                if ( i != degree-1 ):
                    Pab_nm1 = Pab_n;
                    Pab_n   = value;

        return value;