跳到正文
格致开物MATHWIKI

高斯求积

高斯求积(Gaussian quadrature)同时选择积分节点和权重,使给定节点数的求积公式对尽可能高次数的多项式精确。对正权函数的积分,n 点高斯公式可精确积分次数至多 2n−1 的多项式;节点取相应正交多项式的零点。它不同于先固定等距节点、再计算权重的Newton—Cotes公式。

最简单的非平凡例子是在 [−1,1] 上用两个节点。取节点 ±1/3、权重均为一,得到 ∫−11f(x)dx≈f(−1/3)+f(1/3). 它对三次及以下多项式精确,却只评价两次函数。

两节点公式的矩匹配

利用区间对称性,设节点为 −a,a、权重同为 w。常数函数的积分为二,要求 2w=2,故 w=1。二次函数的积分为 2/3,再要求 2a2=2/3,得 a=1/3。一次与三次函数都是奇函数,对称积分与对称节点求和都为零,所以四个基函数 1,x,x2,x3 全部匹配。

任意三次以下多项式都是这四个基函数的线性组合,积分与求积也都是线性的,故该公式对它们全部精确。这给出两点公式的直接推导,而不只是列出一张节点表。节点也是Legendre多项式 P2(x)=(3x2−1)/2 的两个零点。[1]

二阶Legendre多项式在正负一除以根号三处过零,两节点权重都为一
节点选在正交多项式的零点,而非区间端点或等距分点。

主例取 f(x)=1+x+x2+x3。奇次项在两节点处抵消,常数项给二,二次项给 2/3,所以求积值为 8/3,与逐项积分相同。

变式。 取 f(x)=x4。两点公式给 2(1/3)4=2/9,真积分却为 2/5,误差为 8/45。四次已超出精确次数三;更多次幂不应由前四个矩的匹配自动保证。

正交性给出的通用精确性证明

设 ρ(x) 在有限区间 [a,b] 上可积且几乎处处为正,以 ⟨p,q⟩=∫abρ(x)p(x)q(x)dx 定义多项式内积。令 Pn 为次数 n 的实正交多项式,它与全部次数低于 n 的多项式正交。

先说明其节点合法。若 Pn 在区间内部少于 n 个变号零点,以这些零点构成多项式 Q;它次数小于 n,而 PnQ 在区间内不变号,且不恒为零。正权使其积分严格为正或严格为负,与正交性矛盾。因此 Pn 有 n 个不同的内部零点 xi,所有零点均为单根。

在这些节点上构造拉格朗日基函数 Li,取权重 λi=∫abρLi。此规则已对次数至多 n−1 的多项式精确。对任意次数至多 2n−1 的 p,多项式除法可写为 p=qPn+r,deg⁡q≤n−1,deg⁡r≤n−1. 积分中的 qPn 因正交性消失,节点上的该项因 Pn(xi)=0 也消失。剩余 r 已被求积规则精确积分,所以规则对 p 精确。

权重还必为正:Li2 次数至多 2n−2,可用刚证明的精确性,得到 λi=∑jλjLi(xj)2=∫abρ(x)Li(x)2dx>0. 这里没有预先假设权重为正,正性是由精确性和正权积分推出的。

精确次数的上限

任何使用给定 n 个不同实节点的公式,都不可能精确积分全部 2n 次多项式。考虑 q(x)=∏i=1n(x−xi)2. 全部节点处 q=0,求积值为零;但 q≥0 且不恒为零,在正权下积分严格为正,形成矛盾。高斯公式达到 2n−1,因此在这个意义下达到最大代数精度,并非对每个非多项式被积函数都自动误差最小。

两点公式的余项与光滑性

对 f∈C4[−1,1],两点常权公式还满足 I(f)−Q(f)=f(4)(ξ)135,−1<ξ<1. 这个结论需要四阶连续导数,代数精确性本身没有这项假设。证明可用节点 a=1/3 处的三次Hermite插值 H,令它在 ±a 同时匹配函数值和一阶导数。

对不同于节点的 x,构造 g(t)=f(t)−H(t)−K(t2−a2)2,K=f(x)−H(x)(x2−a2)2. 函数在两个节点各有二重零点,并在 x 为零。反复使用Rolle定理可得某个内部点 ηx 满足 g(4)(ηx)=0,故 f(x)−H(x)=f(4)(ηx)24(x2−1/3)2. 节点处两边都为零。因为求积对三次 H 精确,且 Q(f)=Q(H),积分余项就是 ∫−11(f−H)。非负因子满足 ∫−11(x2−1/3)2dx=845. 用四阶导数的上下界夹住积分,再用其连续性,便得到某个内部点的四阶导数乘 (8/45)/24=1/135。这也与 x4 例子的 24/135=8/45 一致。

映射到有限区间 a<b 时,长度缩放给出 I(f)−Q(f)=(b−a)54320f(4)(ξ),|I(f)−Q(f)|≤(b−a)54320‖f(4)‖∞. 例如 [0,2] 上积分 x4 的误差为 8/45;长度不变,常数四阶导数也不变。若没有四阶光滑性,节点值仍可计算,但不能沿用这个余项界。

可运行的两点Gauss—Legendre实现

将一般区间映射为 x=m+ht,其中 m=(a+b)/2,h=(b−a)/2,得到两次函数评价的公式。下面只实现两点常权版本,端点有限;可反向积分,零长度区间不评价函数。

Python 3
from math import isfinite, sqrt

def gauss_legendre_two(function, a, b):
    a, b = float(a), float(b)
    if not isfinite(a) or not isfinite(b):
        raise ValueError("finite endpoints required")
    if a == b:
        return 0.0
    midpoint, half = (a+b)/2, (b-a)/2
    shift = half / sqrt(3)
    left = float(function(midpoint-shift))
    right = float(function(midpoint+shift))
    if not isfinite(left) or not isfinite(right):
        raise ValueError("nonfinite function value")
    return half * (left + right)

for degree in range(4):
    expected = 0 if degree % 2 else 2/(degree+1)
    assert abs(gauss_legendre_two(lambda x, d=degree: x**d, -1, 1)
               - expected) < 1e-14
assert abs(gauss_legendre_two(lambda x: x**3, 0, 2) - 4) < 1e-13
assert abs(gauss_legendre_two(lambda x: x**3, 2, 0) + 4) < 1e-13
assert gauss_legendre_two(lambda x: 1/0, 2, 2) == 0
assert abs(gauss_legendre_two(lambda x: x**4, -1, 1) - 2/9) < 1e-14
print(gauss_legendre_two(lambda x: 1+x+x*x+x**3, -1, 1))

两点版除函数评价外只有固定数量运算,时间与额外空间均为 O(1)。一般 n 点公式在节点、权重已预计算后需 n 次函数评价;节点构造是另一个计算阶段,不能混入这两个函数调用的成本结论。

若被积函数有内部奇点、跳跃或尖峰,节点可能错过重要结构,代数精度也不再给出实际误差保证。可先分割奇点、使用加权高斯公式,或结合分区与误差估计;选择权函数时应明确把哪一部分纳入 ρ,避免重复计算或遗漏权重。

参考文献

  1. ↑ NIST Digital Library of Mathematical Functions:§3.5(v) Gauss Quadrature,正交多项式节点、权重和精确次数;Legendre情形为常权函数。访问日期:2026-10-22。