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
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;