Clenshaw–Curtis & Gauss Quadrature
Clenshaw–Curtis Quadrature 给定一个在区间 上定义的函数 ,Clenshaw–Curtis积分方法通过在Chebyshev点 上对 进行插值,并利用插值得到的多项式的积分来近似原函数的积分。具体来说,设插值多项式为 其中 是Chebyshev多项式,系数 可以通过离散余弦变换(DCT)高效计算得到: Clenshaw–Curtis积分的近似值由以下公式给出: 其中权重 可以通过Chebyshev多项式的积分性质计算得到:
Code : MATLAB code for Clenshaw–Curtis quadrature via Chebfun.
clenshaw_curtis.m 1 2 3 4 5 6 7 function I = clenshaw_curtis (f,n) % (n+1) -pt C -C quadrature of f x = cos (pi *(0 :n)'/n); fx = feval(f,x)/(2 *n); g = real (fft(fx([1 :n+1 , n:-1 :2 ]))); a = [g(1 ); g(2 :n)+g(2 *n:-1 :n+2 ); g(n+1 )]; w = 0 *a'; w(1 :2 :end ) = 2. /(1 -(0 :2 :n).^2 ); I = w*a;
Integral Matrix 现在我们考虑计算以下不定积分: 首先与之前类似地在Chebyshev基下对 进行近似 注意到当 时Chebyshev多项式满足 且 于是 因此,积分 可以表示为 其中 此处的 为Chebyshev基下的积分矩阵,其Matlab实现见下方代码块。
Code : MATLAB code for Chebyshev based integral matrix.
cheb_intmat.m 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 function V = cheb_intmat (N) V = sparse(N+2 , N+1 ); V(2 , 1 ) = 1 ; if N > 0 V(3 , 2 ) = 1 /4 ; end if N >= 2 k = 2 :N; col_idx = k + 1 ; row_idx_lower = k + 2 ; vals_lower = 1 ./ (2 * (k + 1 )); row_idx_upper = k; vals_upper = -1 ./ (2 * (k - 1 )); ind_lower = sub2ind (size (V), row_idx_lower, col_idx); ind_upper = sub2ind (size (V), row_idx_upper, col_idx); V(ind_lower) = vals_lower; V(ind_upper) = vals_upper; end row_indices = 2 :(N+2 ); signs = (-1 ).^(row_indices); scale_factors = (-1 ).^(0 :N); V(1 , :) = scale_factors * V(2 :end , :); end
Gauss Quadrature 给定函数 在 个点处的插值信息,可以构造出唯一一个次数不超过 的插值多项式 作为 的近似,再 进行积分来作为 的积分的近似。特别地,如果 是一个次数不超过 阶多项式,则 在代数上精确成立,于是此类基于多项式的积分方法在使用 个点时,能够至少 精确积分所有不超过 阶的多项式函数。进一步地,通过选择合适的插值节点,Gauss发现通过在一组特别选取的 个节点—积分权重对应的正交多项式的零点—上进行插值,可以使得该积分方法精确积分所有不超过 阶的多项式函数,即具有最高 阶的代数精度。当固定使用 个节点时,可以证明插值积分方法的代数精度最多为 阶,因此Gauss积分方法是所有基于插值多项式的积分方法中代数精度最高的,进而在代数精度的意义下,Gauss积分方法是最优的。
对于积分权重 的情形,Gauss积分方法对应的正交多项式为Legendre多项式,其节点称为Gauss-Legendre节点。具体地来讲,Gauss-Legendre积分实际上对应于首先将 在Gauss-Legendre节点 上进行插值,得到以下插值多项式 然后计算该插值多项式的积分来近似 的积分,即 其中 为Legendre多项式 的第 个零点, 为对应的Lagrange基函数,权重 由下式给出:
对于带有更一般的权重函数 的积分 Gauss积分方法同样适用,只需将对应的正交多项式替换为与权重函数 相关的正交多项式即可。例如,对于权重函数 ,其中 ,对应的正交多项式为Jacobi多项式 ,其节点称为Gauss-Jacobi节点。Gauss-Jacobi积分的形式与Gauss-Legendre积分类似: 其中 为Jacobi多项式 的第 个零点,权重 同样由对应Lagrange基函数的积分给出。
Gauss-Jacobi Quadrature Nodes and Weights 使用Gauss积分方法的关键在于如何高效且准确地计算出Gauss节点和权重。解决这一问题的经典方法是通过求解与正交多项式相关的三对角矩阵的特征值问题来获得节点和权重,即Golub-Welsch算法。
给定归一化的正交多项式序列 ,它们满足三项递推关系: 其中 为递推系数,于是我们有 其中 为大小为 的Jacobi矩阵: 我们将上式简记为 对Jacobi矩阵 进行特征值分解得 其中特征向量 都是归一化的,即 。基于以上分解,Golub和Welsch证明了以下事实:
Jacobi矩阵 的特征值 即为正交多项式 的零点 ;
权重 满足 其中 为特征向量 的第一个分量。
由于Jacobi矩阵 为对称三对角矩阵,利用上这一结构可以在 复杂度内完成特征分解,因此传统的Golub-Welsch算法可以在 的计算成本下稳定地计算出Gauss节点和权重。
Code : MATLAB code for computing Gauss-Legendre quadrature by solving the tridiagonal eigenvalue problem , with a cost of .
gauss.m 1 2 3 4 5 6 7 function I = gauss (f,n) % (n+1) -pt Gauss quadrature of f beta = .5 ./sqrt (1 -(2 *(1 :n)).ˆ(-2 )); T = diag (beta ,1 ) + diag (beta ,-1 ); [V,D] = eig(T); x = diag (D); [x,i ] = sort (x); w = 2 *V(1 ,i ).ˆ2 ; I = w*feval(f,x);
事实上,近年来已经有多种方法被提出以进一步提升Gauss节点和权重的计算效率和精度。例如,Hale和Townsend提出了一种基于正交多项式的渐进表示以及Newton迭代的方法,可以在 的复杂度下高效地计算Gauss-Legendre节点和权重[1] ;Bogaert同样基于渐进展开进一步提出了一种无需迭代的直接计算方法,同样实现了 的复杂度[2] 。这些方法在处理大规模Gauss积分节点和权重的计算时在速度与精度上均远优于传统的Golub-Welsch算法。
References
Hale N, Townsend A. Fast and accurate computation of Gauss–Legendre and Gauss–Jacobi quadrature nodes and weights. SISC, 2013, 35(2): A652-A674.
Bogaert I. Iteration-free computation of Gauss–Legendre quadrature nodes and weights. SISC, 2014, 36(3): A1008-A1026.
Trefethen L N. Is gauss quadrature better than Clenshaw–Curtis? . SIREV, 2008, 50(1): 67-87.
Trefethen L N. Exactness of quadrature formulas. SIREV, 2022, 64(1): 132-150.