def pdf_moments(cnt):
    """Return the Gaussian expanded pdf function given the list of central
    moments (first one is mean).
    """
    N = len(cnt)
    if N < 2:
        raise ValueError, "At least two moments must be given to" + \
              "approximate the pdf."
    totp = poly1d(1)
    sig = sqrt(cnt[1])
    mu = cnt[0]
    if N > 2:
        Dvals = _hermnorm(N+1)
    for k in range(3,N+1):
        # Find Ck
        Ck = 0.0
        for n in range((k-3)/2):
            m = k-2*n
            if m % 2: # m is odd
                momdiff = cnt[m-1]
            else:
                momdiff = cnt[m-1] - sig*sig*scipy.factorial2(m-1)
            Ck += Dvals[k][m] / sig**m * momdiff
        # Add to totp
        totp = totp +  Ck*Dvals[k]

    def thisfunc(x):
        xn = (x-mu)/sig
        return totp(xn)*exp(-xn*xn/2.0)/sqrt(2*pi)/sig
    return thisfunc
Beispiel #2
0
def pdf_moments_st(cnt):
    """Return the Gaussian expanded pdf function given the list of central
    moments (first one is mean).

    version of scipy.stats, any changes ?
    the scipy.stats version has a bug and returns normal distribution

    """

    N = len(cnt)
    if N < 2:
        raise ValueError("At least two moments must be given to" + \
              "approximate the pdf.")

    totp = poly1d(1)
    sig = sqrt(cnt[1])
    mu = cnt[0]
    if N > 2:
        Dvals = _hermnorm(N+1)
    for k in range(3,N+1):
        # Find Ck
        Ck = 0.0
        for n in range((k-3)/2):
            m = k-2*n
            if m % 2: # m is odd
                momdiff = cnt[m-1]
            else:
                momdiff = cnt[m-1] - sig*sig*scipy.factorial2(m-1)
            Ck += Dvals[k][m] / sig**m * momdiff
        # Add to totp
        raise
        print(Dvals)
        print(Ck)
        totp = totp +  Ck*Dvals[k]

    def thisfunc(x):
        xn = (x-mu)/sig
        return totp(xn)*exp(-xn*xn/2.0)/sqrt(2*np.pi)/sig
    return thisfunc, totp
	def dfunc0(self,x):
		px=x*twopi
		y=numpy.ones(len(x))
		for i in range(1,self.Para.para[1]+1):
			y+=scipy.factorial2(2*i-1)/scipy.factorial2(2*i)*numpy.sin(px)**(2*i)
		return self.Para.para[0]*numpy.cos(px)*y
	def func0(self,x):
		px=x*twopi
		y=numpy.sin(px)
		for i in range(1,int(self.Para.para[1])+1):
			y+=scipy.factorial2(2*i-1)/scipy.factorial2(2*i)/(2*i+1)*numpy.sin(px)**(2*i+1)
		return self.Para.para[0]/twopi*y