scipy convolve取决于x

时间:2017-11-06 12:01:14

标签: python scipy convolution

我正在尝试卷积对数正态PDF和高斯PDF。因此我以下列方式定义了函数:

def PDF_log(x,sig,mu): # log normal PDF
   mu = np.log(mu)
   return( (1/x)*(1/(sig*np.sqrt(2*np.pi))) * np.exp(-(np.log(x)-mu)**2/(2*sig**2)) )   

def gauss(x,sig,mu): # a noraml PDF
   return( 1/(np.sqrt(2*np.pi*sig**2)) * np.exp(-(x-mu)**2/(2.*sig**2)) )

def gauss_log(x, sig, mu, sig0, mu0):
    a = signal.convolve(PDF_log(x,sig,mu),gauss(x,sig0,mu0),mode='same')/np.sum(gauss(x,sig0,mu0)) 


def test():
    mu = 0.6
    sig = 0.2
    sig0 = 0.05
    mu0 = mu
    x = np.linspace( 0.5, 0.6, 10000 )
    plt.plot( x, gauss_log(x, sig, mu, sig0, mu0), '--', label='gauss_X_log', zorder=10 )
    plt.plot( x, gauss(x,sig0,mu0), label='gauss' )
    plt.plot( x, PDF_log(x,sig,mu), label='log' )
    plt.legend()
    plt.show()

这给了我以下结果:

first array domain

红线是对数正态PDF,绿线是高斯。 “卷积”是蓝色虚线。 当我更改x域x = np.linspace( 0.5, 0.8, 10000 )时,我会得到非常不同的结果:

for different domain

显然这里有问题。我的卷积积分F(x) = int (g(t)*f(x-t))dt的结果不应该取决于“x”的范围。 然后我把域名变大了,即x = np.linspace( 0.00001, 100, 10000 ),这给了我这个废话:

large array domain

我的脚本中有一个简单的错误,或者我错过理解离散卷积。

1 个答案:

答案 0 :(得分:1)

我弄明白我的错误在哪里:

而不是具有适当的内核函数gauss(x0,sig0,mu);我对高斯使用了相同的x

我认为这是正确的(使用上面的PDF):

def gauss_log(x, x0, sig, mu, sig0, mu0):
    a = signal.convolve(gauss(x0,sig0,mu0),PDF_log(x,sig,mu),mode='same')/np.sum(gauss(x0,sig0,mu0))
    return( a )

def test(lightcurve,noisecurve):
    mu = 0.1 #can now put arbitrary small values of mu
    sig = 0.1
    sig0 = 0.05
    mu0 = 0
    x = np.linspace( 0.00001, 5, 1000 )
    x0 = np.linspace(-5,5,1000) #note that arrays need to be equal length!
    g_log = gauss_log(x, x0, sig, mu, sig0, mu0)
    plt.plot( x, g_log, '--', label='gauss_X_log', zorder=10 )
    plt.plot( x0, gauss(x0,sig0,mu0), label='gauss' )
    plt.plot( x, PDF_log(x,sig,mu), label='log' )
    plt.legend()
    plt.show()

    ###testing normalization!
    print(np.trapz(gauss(x0,sig0,mu0),x0))
    print(np.trapz(g_log,x))
    print(np.trapz(PDF_log(x,sig,mu),x))

1.0

0.999938903253

1.0

enter image description here