如何在SymPy中获取Gauss-Legendre节点与权重的符号形式?
好问题!SciPy的special.roots_*系列函数确实是直接返回数值形式的求积根和权重,但在SymPy里要拿到符号形式的对应内容,得通过正交多项式+符号求解的方式来实现——毕竟求积法的根本质上就是对应正交多项式的零点,权重也能通过正交多项式的性质用符号推导出来。
核心逻辑
所有经典的高斯型求积法(比如勒让德、拉盖尔、厄米特等),它们的求积节点就是对应正交多项式的根,而权重则可以通过正交多项式的导数、阶数等参数用符号公式计算出来。
具体操作步骤(以高斯-勒让德求积为例)
高斯-勒让德求积是最常用的一种,对应区间[-1,1],步骤如下:
- 导入SymPy并定义符号变量
import sympy as sp x = sp.symbols('x') - 生成对应阶数的正交多项式
用sp.legendre(n, x)生成n阶勒让德多项式,比如n=3:n = 3 Pn = sp.legendre(n, x) - 求解多项式的根(即求积节点)
用sp.solve()解多项式方程,得到符号形式的根:roots = sp.solve(Pn, x) # 输出:[-sqrt(3/5), 0, sqrt(3/5)] - 计算符号权重
高斯-勒让德的权重公式是:( w_i = \frac{2}{(1 - x_i^2) \cdot (P_n'(x_i))^2} )
其中( P_n' )是勒让德多项式的一阶导数,用SymPy计算:
可以用Pn_deriv = sp.diff(Pn, x) weights = [2 / ((1 - xi**2) * sp.expand(Pn_deriv.subs(x, xi))**2) for xi in roots] # 输出:[5/9, 8/9, 5/9]sp.simplify()进一步简化结果,确保表达式更整洁。
适配其他求积法
不同的求积法对应不同的正交多项式和权重公式,这里给你几个常用的例子:
- 高斯-拉盖尔求积(区间
[0, ∞),权重函数( e^{-x} ))- 正交多项式:
sp.laguerre(n, x) - 权重公式:( w_i = \frac{(n!)^2 \cdot e{x_i}}{(L_n'(x_i))2} )(( L_n )是拉盖尔多项式)
- 正交多项式:
- 高斯-厄米特求积(区间
(-∞, ∞),权重函数( e{-x2} ))- 正交多项式:
sp.hermite(n, x) - 权重公式:( w_i = \frac{2^{n+1} \cdot n! \cdot \sqrt{\pi}}{(H_n'(x_i))^2} )(( H_n )是厄米特多项式)
- 正交多项式:
注意事项
- 对于低阶(比如n≤5)的正交多项式,SymPy能直接给出根式形式的根;当阶数过高时,某些正交多项式的根无法用初等表达式表示,SymPy会用
RootOf对象保留符号形式。 - 如果需要将符号结果转换为数值,只需要调用
sp.N()函数即可,比如sp.N(roots[0])就能得到对应的浮点数。
内容的提问来源于stack exchange,提问作者homocomputeris
相关产品推荐
相关产品推荐

