Python 中是否有 Gauss-Laguerre 积分例程?

计算科学 Python 插值 正交
2021-11-27 18:21:33

我正在阅读“Fortran 77 中的数值方法:科学计算的艺术”(第二版)一书,我遇到了一些一维函数数值积分的方法。更具体地说,Gauss-Laguerre、Gauss Hermite 和 Gauss Jacobi 权重和横坐标吸引了我。我需要它们,因为我有一些行为不端的被积函数,我需要对它们进行数值积分。据我所知,这些例程没有python实现,最接近这些方法的是http://docs.scipy.org/doc/numpy/reference/generated/numpy.polynomial.hermite.hermgauss.html

但我觉得文档有点不完整。我不确定如何使用这种方法,并且有点困惑为什么在 python 中这些类型的求积没有标准方法。

编辑:

我已经在示例问题上实现并比较了 scipy 正交与 Gauss-Hermite 正交:

I=(iζ(t)+iζ(t)¯)exp(iωt)dt

这里i=1ζ(t)是一个复杂的函数t. overbear 表示复共轭。ζ(t)不是标准函数,它是我计算出来的,样本可以在http://speedy.sh/SX6JU/seData.npy作为 numpy 数组找到。数组中的每一行的形式为 [t real(zeta) imag(zeta)],即函数在时间 t 的采样实部和虚部值。

import numpy as np
import matplotlib.pyplot as plt
from scipy import integrate

T1 =  np.load('seData.npy') #: [Time, x1, x2] from downloaded file


def integrand(t, omega):
    x1 = np.interp(t, T1[:,0], T1[:,1])  
    x2 = np.interp(t, T1[:,0], T1[:,2])    
    z0 = x1+x2*1j
    zeta = z0/np.sqrt(z0**2+1)
    return (1j*zeta+np.conjugate(1j*zeta))*np.exp(1j*omega*t) 



def integral(omega):
    def real_func(x,omega):
        return np.real(integrand(x,omega))
    def imag_func(x,t):
        return np.imag(integrand(x,omega))
    real_integral = integrate.quad(real_func, -80, 80, args=(omega))
    imag_integral = integrate.quad(imag_func, -80, 80, args=(omega))   
    return real_integral[0] + 1j*imag_integral[0]

vintegral = np.vectorize(integral)


omega = np.linspace(-30, 30, 601)  
I = vintegral(omega)

在此处输入图像描述

我不确定正确的结果应该是什么,但我相信结果中不应该存在“噪音”。

相反,我尝试了一个 Gauss-Hermite 例程:

ti_her, wi_her, = np.polynomial.hermite.hermgauss(90)

vintegrand = np.vectorize(integrand)

def integral_hermite(omega):
    real_integral = np.dot(vintegrand(ti_her, omega).real, wi_her)
    imag_integral = np.dot(vintegrand(ti_her, omega).imag, wi_her)
    return real_integral + 1j*imag_integral

vintegral_hermite = np.vectorize(integral_hermite)

I2 = vintegral_hermite(omega)

在此处输入图像描述

在此处输入图像描述

我相信这更符合我应该得到的,但是我不确定我做对了。似乎 Gauss-hermite 的阶数非常高,而在低阶(90)看起来我的结果显示了某种类型的周期性/混叠。

2个回答

在 Python、NumPy 和 SciPy 中,这些类型的求积有标准方法:

和其他例程。

给定一个正交度(本质上,用于逼近被积函数的插值的度数),这些高斯型正交函数返回正交点xi和权重函数wi这样你就可以近似积分

abf(x)dx

为适当ab经过

i=0Nf(xi)wi;

您可以使用求和中的正交点和权重来计算积分的近似值。

quadpy(我的一个小项目)可能会有所帮助。对于线段的正交,它具有

  • 切比雪夫-高斯,
  • 克伦肖-柯蒂斯,
  • Fejér(两种类型),
  • 高斯-埃尔米特,
  • 高斯-拉盖尔,
  • 高斯-勒让德,
  • 高斯-洛巴托,
  • Gauß-Patterson(7 个方案,最高 191 级),
  • 高斯-拉道,
  • 打开和关闭 Newton-Cotes。