Scipy:Hermite函数与正交权重的积分

时间:2012-12-20 12:40:08

标签: python numpy scipy signal-processing numerical-integration

我想使用scipy.integrate.quad集成两个时间和频率移位的Hermite函数的乘积。

然而,由于包括大的阶多项式,因此存在数值误差。这是我的代码:

import numpy as np
import scipy.integrate
import scipy.special as sp
from math import pi


def makeFuncs():
    # Create the 0th, 4th, 8th, 12th and 16th order hermite function
    return [lambda t, n=n: np.exp(-0.5*t**2)*sp.hermite(n)(t) for n in np.arange(5)*4]

def ambgfun(funcs, i, k, tau, f):
    # Integrate f1(t)*f2(t+tau)*exp(-j2pift) over t from -inf to inf
    f1 = funcs[i]
    f2 = funcs[k]
    func = lambda t: np.real(f1(t) * f2(t+tau) * np.exp(-1j*(2*pi)*f*t))
    return scipy.integrate.quad(func, -np.inf, np.inf)

def main():
    f = makeFuncs()

    print "A00(0,0):", ambgfun(f, 0, 0, 0, 0)
    print "A01(0,0):", ambgfun(f, 0, 1, 0, 0)
    print "A34(0,0):", ambgfun(f, 3, 4, 0, 0)

if __name__ == '__main__':
    main()

hermite函数是正交的,因此所有积分都应该等于零。但是,它们不是,如输出所示:

A00(0,0): (1.7724538509055159, 1.4202636805184462e-08)
A01(0,0): (8.465450562766819e-16, 8.862237123626351e-09)
A34(0,0): (-10.1875, 26.317246925873935)

如何使此计算更准确?来自scipy的hermite函数包含一个权重变量,应该用于高斯求积,如文档(http://docs.scipy.org/doc/scipy/reference/special.html#orthogonal-polynomials)中所给出的。但是,我没有在文档中找到如何使用这些权重的提示。

我希望你能帮忙:)。

谢谢,Max

1 个答案:

答案 0 :(得分:1)

答案是,你得到的结果在数值上接近于零。如果你使用浮点数,我认为真的有可能获得更好的结果 - 你在数值积分中面临一个普遍的问题。

考虑一下:

import numpy as np
from scipy import integrate, special
f = lambda t: np.exp(-t**2) * special.eval_hermite(12, t) * special.eval_hermite(16, t)

abs_ig, abs_err = integrate.quad(lambda t: abs(f(t)), -np.inf, np.inf)
ig, err = integrate.quad(f, -np.inf, np.inf)

print ig
# -10.203125
print abs_ig
# 2.22488114805e+15
print ig / abs_ig, err / abs_ig
# -4.58591912155e-15  1.18053770382e-14

因此,被积函数的值被计算为与浮点epsilon相当的精度。由于减去大幅度振荡被积函数值的舍入误差,实际上不可能得到更好的结果。

那怎么办?根据我的经验,你现在需要做的是以数字方式解决问题,而不是解析问题。重要的是,Hermite多项式的傅立叶变换乘以权函数是已知的,因此您可以在此处一直在傅立叶空间中工作。