尧图精选

NumPy Chebyshev 级数模块实战指南:从切比雪夫多项式到函数逼近与拟合

🕒 发布时间:2026/9/20 23:31:21 📁 来源:尧图网络
NumPy Chebyshev 级数模块实战指南从切比雪夫多项式到函数逼近与拟合【免费下载链接】numpyThe fundamental package for scientific computing with Python.项目地址: https://gitcode.com/gh_mirrors/nu/numpy本篇技术指南围绕 NumPy 的numpy.polynomial.chebyshev模块展开该模块是 NumPy 多项式子包中专门处理切比雪夫Chebyshev级数的实现为科学计算中函数逼近、最小二乘拟合、求积与求根提供了一套完整工具。读完本文你将掌握 Chebyshev 便捷类的面向对象用法、全部cheb*底层函数族的参数细节、z-series 代数恒等式的实现原理以及如何用它们完成从数据拟合到函数插值的完整工作流。文中所有结论均可在当前仓库的 numpy/polynomial/chebyshev.py 源码与其测试 numpy/polynomial/tests/test_chebyshev.py 中得到验证。模块概览与 API 全景numpy.polynomial.chebyshev是numpy.polynomial子包对应文档页 doc/source/reference/routines.polynomials.rst提供的六类正交多项式实现之一。该模块的公开 API 由源码开头的__all__列表numpy/polynomial/chebyshev.py完整声明按功能可划分为四组类别成员便捷类Chebyshev常量chebdomain、chebzero、chebone、chebx算术chebadd、chebsub、chebmulx、chebmul、chebdiv、chebpow、chebval、chebval2d、chebval3d、chebvalnd、chebgrid2d、chebgrid3d微积分chebder、chebint其他功能chebfromroots、chebroots、chebvander、chebvander2d、chebvander3d、chebgauss、chebweight、chebcompanion、chebfit、chebpts1、chebpts2、chebtrim、chebline、cheb2poly、poly2cheb、chebinterpolate从源码结构看chebtrim直接别名自polyutils.trimcoefnumpy/polynomial/chebyshev.py而Chebyshev类继承自公共基类ABCPolyBase位于 numpy/polynomial/_polybase.py把上述cheb*函数族静态绑定为类的运算原语从而获得与Polynomial、Legendre、Hermite等类完全一致的统一接口。系数表示约定与 domain/window 机制理解本模块的第一关键是系数表示约定。与旧式numpy.poly1d的高阶在前不同numpy.polynomial包内的所有系列均约定系数从低次到高次排列coef[i]就是第i次项的系数。即[1, 2, 3]代表级数T_0 2*T_1 3*T_2numpy/polynomial/chebyshev.py 中的 docstring 明确给出了这一约定。numpy.polynomial包的整体表示约定还可参见其包级 docstringnumpy/polynomial/init.py。第二个关键是domain与window属性。Chebyshev类的构造函数接受三个参数numpy/polynomial/chebyshev.pycoef按次数递增排列的 Chebyshev 系数例如(1, 2, 3)表示1*T_0(x) 2*T_1(x) 3*T_2(x)domain定义域区间[domain[0], domain[1]]默认[-1., 1.]会通过平移和缩放映射到window区间window窗口区间默认同样为[-1., 1.]symbol字符串表示中使用的自变量符号必须是合法的 Python 标识符默认x自 NumPy 1.24 起加入。domain与window在拟合场景下尤为关键。例如用Chebyshev.fit(x, y, deg)拟合数据时拟合过程在window区间上执行此时切比雪夫基的性质最好而拟合得到的系数在domain区间上有效Chebyshev实例被调用时会自动完成区间映射。注意domain/window不同的两个多项式实例不相等也不能混在一起做算术运算会抛出TypeError: Domains differ该行为在 doc/source/reference/routines.polynomials.rst 的示例中有完整演示。底层数学原理z-series 代数恒等式模块 docstring 的 Notes 部分numpy/polynomial/chebyshev.py揭示了实现乘法、除法、积分与微分所用的核心数学工具。其原理基于以下代数恒等式T_n(x) (z^n z^{-n}) / 2 z·dx/dz (z - z^{-1}) / 2其中x (z z^{-1}) / 2。借助这些恒等式任意 Chebyshev 级数都可以表示为一个有限、对称的 Laurent 级数——模块内部称之为 z-series。该机制由一组私有函数实现numpy/polynomial/chebyshev.py_cseries_to_zseries把 Chebyshev 系数转为奇数长度、对称的 z-serieszs[n-1:] c / 2再叠加自身反转返回结果恒非空dtype 与输入一致_zseries_to_cseriesz-series 还原为 Chebyshev 系数对称部分翻倍_zseries_mul直接使用np.convolve完成卷积——因为对称/反对称 z-series 的乘积满足S*S, A*A - S、S*A, A*S - A的对称性保持规则_zseries_div除法同样在 z 域进行商与余数都是 z-series但实现上要求两个输入具有相同对称性_zseries_der/_zseries_int利用链式法则和dx/dz完成对x而非z的求导与积分内部对x的 z-series 乘以 2 以规避浮点、兼容Decimal等专用标量类型。正因如此Chebyshev 级数的乘法、除法、求导、积分结果通常不直观但正确——因为一般多项式的乘积不再落在切比雪夫基中必须重新投影回该基。例如取自 docstring from numpy.polynomial import chebyshev as C C.chebmul((1, 2, 3), (3, 2, 1)) # 乘法需要重投影 array([ 6.5, 12. , 12. , 4. , 1.5])Chebyshev 便捷类面向对象的统一接口Chebyshev类是模块的推荐入口继承自ABCPolyBase把chebadd、chebsub、chebmul、chebdiv、chebpow、chebval、chebint、chebder、chebfit、chebline、chebroots、chebfromroots十二个函数逐一静态绑定为类的运算原语numpy/polynomial/chebyshev.py。这使它自动获得标准 Python 数值运算符 - * // % divmod ** ()以及丰富的实例方法包括创建basis(deg)、identity()、fit(x, y, deg)、fromroots(roots)、copy()转换cast(Poly)、convert(kindPoly)后者既可在不同多项式类型间转换也可在domain与window之间映射微积分deriv()、integ()杂项linspace()、mapparms()、roots()、trim()、cutdeg()、truncate()。类级常量方面numpy/polynomial/chebyshev.pydomain chebdomain、window chebdomain均为[-1., 1.]、basis_name T——因此打印/LaTeX 表示中基函数写作T_n。一个值得注意的类方法是Chebyshev.interpolate(cls, func, deg, domainNone, args())numpy/polynomial/chebyshev.py它先在第一类切比雪夫点上对func插值再把结果映射回指定domain返回Chebyshev实例。类属性与方法的完整清单见 numpy/polynomial/init.py 的包级说明。基础算术运算函数族加减法分量式运算chebadd与chebsub是仅有的两类无需重投影的运算因为 Chebyshev 级数之和/差仍是 Chebyshev 级数实现即逐分量相加委托给pu._add/pu._sub from numpy.polynomial import chebyshev as C C.chebadd((1, 2, 3), (3, 2, 1)) array([4., 4., 4.]) C.chebsub((1, 2, 3), (3, 2, 1)) array([-2., 0., 2.])乘以 x 与级数乘法chebmulx把级数乘以自变量x利用递推关系x·T_n (T_{n-1} T_{n1})/2实现对零级数有特判numpy/polynomial/chebyshev.py C.chebmulx([1, 2, 3]) array([1. , 2.5, 1. , 1.5])chebmul则经由 z-series 卷积再还原见上文原理部分结果需重投影 C.chebmul((1, 2, 3), (3, 2, 1)) array([ 6.5, 12. , 12. , 4. , 1.5])除法、幂与直线chebdiv(c1, c2)返回[quo, rem]商与余数两个 ndarray除数为零时抛ZeroDivisionErrornumpy/polynomial/chebyshev.pychebpow(c, pow, maxpower16)将级数提升到非负整数次幂maxpower默认 16用于限制级数膨胀失控pow非负整数校验不通过或超过上限均抛ValueErrornumpy/polynomial/chebyshev.pychebline(off, scl)返回直线off scl*x的级数系数scl 0时只返回[off]numpy/polynomial/chebyshev.py。微积分求导与积分chebder(c, m1, scl1, axis0)沿指定轴对级数求导m次numpy/polynomial/chebyshev.py。关键参数m求导次数必须非负默认 1scl每次求导后乘以的缩放因子最终等效乘以scl**m专为线性换元设计axis求导所沿的轴默认 0多维系数数组的不同轴对应不同变量。当m n系数长度时直接返回零系数。示例 from numpy.polynomial import chebyshev as C C.chebder((1, 2, 3, 4)) array([14., 12., 24.]) C.chebder((1, 2, 3, 4), 3) array([96.]) C.chebder((1, 2, 3, 4), scl-1) array([-14., -12., -24.])chebint(c, m1, k[], lbnd0, scl1, axis0)对级数积分m次numpy/polynomial/chebyshev.py。四个可选参数的语义必须精确理解k积分常数列表第i次积分在零点的值取k[i]默认[]表示全部取 0m 1时可直接传标量lbnd积分下限默认 0scl每次积分后先乘以scl再加积分常数——做线性换元u ax b时因dx du/ascl应取1/a这与直觉可能相反模块 docstring 专门提示了这一点axis积分所沿的轴默认 0。非法参数会抛ValueErrorm 1、len(k) m、lbnd或scl非标量numpy/polynomial/chebyshev.py。示例 C.chebint((1, 2, 3)) array([ 0.5, -0.5, 0.5, 0.5]) C.chebint((1, 2, 3), k3) array([ 3.5, -0.5, 0.5, 0.5]) C.chebint((1, 2, 3), lbnd-2) array([ 8.5, -0.5, 0.5, 0.5])求值chebval 与多维/网格求值chebval(x, c, tensorTrue)计算p(x) c_0*T_0(x) c_1*T_1(x) ... c_n*T_n(x)numpy/polynomial/chebyshev.py。实现采用Clenshaw 递推又称综合除法即 docstring Notes 明确说明的 The evaluation uses Clenshaw recursion, aka synthetic division. 使用要点x为列表/元组时转为 ndarray否则按标量处理x的元素须支持与系数c的乘加运算c为一维时结果形状与x相同c为多维时结果形状取决于tensor为True时形状为c.shape[1:] x.shape默认每一列系数对每个x元素求值为False时形状为c.shape[1:]x在系数列上广播系数尾部的零也会参与求值追求效率时应先裁剪。多维与网格版本覆盖 2D/3D/N-Dchebval2d(x, y, c)按点(x_i, y_i)配对求值x、y须同形状chebval3d(x, y, z, c)三元组点求值chebvalnd(pts, c)N 维求值pts为元组/列表各元素同形状也支持(n, m)数组chebgrid2d(x, y, c)/chebgrid3d(x, y, z, c)在x、y、z的Cartesian 积网格上求值结果形状为c.shape[N:] x.shape y.shape( z.shape)。它们的实现均委托给 polyutils 的_valnd/_gridndnumpy/polynomial/polyutils.py。拟合chebfit 最小二乘chebfit(x, y, deg, rcondNone, fullFalse, wNone)返回对数据点(x[i], y[i])的 deg 次最小二乘 Chebyshev 级数系数numpy/polynomial/chebyshev.py最终委托给pu._fit。参数细节x形状(M,)的样本点横坐标y形状(M,)或(M, K)后者一次性拟合 K 组共享 x 的数据集每组一列结果存于返回系数的对应列deg可为单个整数包含 0 到 deg 的所有项NumPy ≥ 1.11 起也可传整数列表指定要包含的项如[0, 2, 4]只拟合偶次项rcond相对条件数小于最大奇异值rcond倍的奇异值被忽略默认len(x)*epseps为浮点相对精度通常约2e-16full为False默认只返回系数为True额外返回[residuals, rank, singular_values, rcond]诊断信息细节见numpy.linalg.lstsqw权重数组形状(M,)w[i]作用于未平方残差y[i] - y_hat[i]做反方差加权时应取w[i] 1/sigma(y[i])。数学上该拟合最小化加权平方误差E Σ_j w_j²·|y_j - p(x_j)|²等价于求解加权伪 Vandermonde 方程V(x)·c w·y用奇异值分解求解。若某些奇异值过小被忽略会发出RankWarning仅当full False时可用更低阶数拟合消除或用warnings.simplefilter(ignore, np.exceptions.RankWarning)关闭。模块注释还特别指出Chebyshev 基的拟合通常比幂基power series拟合条件数更好但效果仍取决于采样点分布与数据光滑性。测试 numpy/polynomial/tests/test_chebyshev.py 验证了deg为整数与列表两种形式结果一致、deg列表无序时仍正确、二维y按列拟合、权重w生效、复采样点[1, 1j, -1, -1j]的拟合、以及只拟合偶次项[0, 2, 4]与全项4结果一致等场景。面向对象等效写法官方推荐 from numpy.polynomial import Chebyshev xdata [1, 2, 3, 4] ydata [1, 4, 9, 16] c Chebyshev.fit(xdata, ydata, deg1)注意fit返回的实例带domain/window求值务必用p(x)而不是直接把p.coef交给chebval后者不会做区间映射详见 doc/source/reference/routines.polynomials.rst。插值chebinterpolate 与第一类切比雪夫点chebinterpolate(func, deg, args())在区间[-1, 1]上的第一类切比雪夫点处插值任意函数func返回deg 1个系数numpy/polynomial/chebyshev.py。实现思路是取order deg 1个第一类点xcheb chebpts1(order)计算yfunc func(xcheb, *args)构造 Vandermonde 矩阵m chebvander(xcheb, deg)通过c np.dot(m.T, yfunc)并除以order首项与0.5*order其余项得到系数——利用了切比雪夫多项式在第一类点上的正交性。docstring 强调插值完成后若想约束某些系数例如偶函数可把奇次项系数直接置零直接修改系数即可无需重新插值或拟合。对连续函数随着deg增大插值级数趋向于对func的 minmax最佳一致逼近 import numpy.polynomial.chebyshev as C C.chebinterpolate(lambda x: np.tanh(x) 0.5, 8) array([ 5.00000000e-01, 8.11675684e-01, -9.86864911e-17, -5.42457905e-02, -2.71387850e-16, 4.51658839e-03, 2.46716228e-17, -3.79694221e-04, -3.26899002e-16])测试numpy/polynomial/tests/test_chebyshev.py验证了对x^p的任意deg插值都能以 12 位小数精度还原原函数。求根与伴随矩阵chebroots(c)返回级数的根零点实现为伴随矩阵的特征值且使用旋转后的伴随矩阵chebcompanion(c)[::-1, ::-1]以降低误差结果升序排列numpy/polynomial/chebyshev.py。docstring 提醒远离原点的复平面根、以及重根因级数数值稳定性问题误差会偏大孤立近原点根可用若干次牛顿迭代改进。由于切比雪夫基不是x的幂结果可能看起来不直观。chebcompanion(c)numpy/polynomial/chebyshev.py返回缩放后的伴随矩阵基多项式经缩放后矩阵对称因此对基多项式用numpy.linalg.eigvalsh求得的特征值保证为实数输入不足 2 个系数时抛ValueError。测试验证了维度(i, i)与线性根chebcompanion([1, 2])[0, 0] -0.5numpy/polynomial/tests/test_chebyshev.py。chebfromroots(roots)是求根的逆操作给定根序列重根需重复出现顺序不限生成对应 Chebyshev 级数。注意即使输入全为实根只要根的生成过程涉及复数如(-j, j)返回值就是复数数组numpy/polynomial/chebyshev.py 示例可见。采样点与 Gauss-Chebyshev 求积两类切比雪夫点chebpts1(npts)第一类切比雪夫点即cos(x)其中x [pi*(k 0.5)/npts for k in range(npts)]要求npts 1非整数抛ValueErrornumpy/polynomial/chebyshev.pychebpts2(npts)第二类切比雪夫点即cos(x)其中x [pi*k/(npts - 1) for k in range(npts)]升序排列含端点±1要求npts 2numpy/polynomial/chebyshev.py。测试给出了npts 1..4第一类与npts 2..5第二类的精确点值numpy/polynomial/tests/test_chebyshev.py例如第一类 3 点为[-0.8660254, 0, 0.8660254]第二类 5 点为[-1, -0.70710678, 0, 0.70710678, 1]。Gauss-Chebyshev 求积chebgauss(deg)计算 Gauss-Chebyshev 求积的采样点与权重可对[-1, 1]上带权函数f(x) 1/sqrt(1 - x²)的多项式次数 ≤2*deg - 1精确积分numpy/polynomial/chebyshev.py。该函数存在闭式解x_i cos(pi·(2i - 1) / (2n)) w_i pi / n要求deg 1测试仅验证到 100 阶更高阶可能有问题。chebweight(x)返回权函数1/sqrt(1 - x²)在x处的值numpy/polynomial/chebyshev.py实现为1/(sqrt(1x)·sqrt(1-x))测试numpy/polynomial/tests/test_chebyshev.py与该公式逐点对照验证。Vandermonde 矩阵与基函数转换chebvander(x, deg)返回伪 Vandermonde 矩阵定义为V[..., i] T_i(x)0 i deg形状为x.shape (deg 1,)numpy/polynomial/chebyshev.py。实现用前向递推v[i] v[i-1]*x2 - v[i-2]x2 2x生成deg为负抛ValueError。关键性质np.dot(V, c)与chebval(x, c)在舍入误差范围内一致——这一等价关系既是最小二乘拟合的基础也适合一次性求值大量同阶同采样点的级数。chebvander2d(x, y, deg)与chebvander3d(x, y, z, deg)是二维/三维版本列按c_{00}, c_{01}, c_{02}, ...2D或c_{000}, c_{001}, c_{002}, ...3D顺序编码多重次数同样满足np.dot(V, c.flat)与chebval2d/3d的等价性返回形状为x.shape (order,)其中order为各维(deg1)之积numpy/polynomial/chebyshev.py。基函数转换由一对互逆函数提供poly2cheb(pol)把标准幂基多项式系数转为等效 Chebyshev 系数实现为自高次向低次的 Horner 式迭代res chebadd(chebmulx(res), pol[i])numpy/polynomial/chebyshev.pycheb2poly(c)反向转换用三项递推c0 polysub(c[i-2], c1); c1 polyadd(tmp, polymulx(c1)*2)完成numpy/polynomial/chebyshev.py。不过 docstring 明确推荐跨基转换最简单的方式是使用实例方法convert from numpy import polynomial as P p P.Polynomial(range(4)) c p.convert(kindP.Chebyshev) Chebyshev([1. , 3.25, 1. , 0.75], domain[-1., 1.], window[-1., 1.], symbolx) P.chebyshev.poly2cheb(range(4)) array([1. , 3.25, 1. , 0.75])测试验证与进一步阅读模块的功能正确性由 numpy/polynomial/tests/test_chebyshev.py 系统保障测试覆盖了四组常量test_chebdomain、test_chebzero、test_chebone、test_chebx、全部算术与微积分函数含axis参数、零阶求导/积分、多维求值与网格求值、Vandermonde 矩阵维度、拟合的异常分支与加权/复点/分项拟合、插值精度、伴随矩阵与求根、两类采样点的精确取值、权重函数等z-series 内部机制也有test__cseries_to_zseries/test__zseries_to_cseries专门测试。打印与字符串表示T_n基函数、unicode/ascii 风格、symbol属性由 numpy/polynomial/tests/test_printing.py 覆盖。如需深入类通用机制与domain/window语义numpy/polynomial/_polybase.py共享底层工具_fit、_valnd、_gridnd、_vander_nd_flat等numpy/polynomial/polyutils.pynumpy.polynomial包级总览与六类多项式对照numpy/polynomial/init.py多项式包文档主页doc/source/reference/routines.polynomials.rst。小结numpy.polynomial.chebyshev是一个覆盖表示—运算—微积分—求值—拟合—插值—求根—求积—基转换全链路的完备模块。掌握三个要点即可熟练使用其一系数一律按低次到高次排列其二Chebyshev便捷类与cheb*函数族是同一套数学的面向对象/函数式两种界面fit产生的实例务必通过调用求值以正确处理domain/window映射其三乘法、除法、求导、积分的不直观结果是 Chebyshev 基重投影的必然结果其底层 z-series 恒等式保证了运算的正确性与数值稳定性。对于函数逼近与数据拟合场景Chebyshev 基通常比幂基条件数更优是数值实践中的首选。【免费下载链接】numpyThe fundamental package for scientific computing with Python.项目地址: https://gitcode.com/gh_mirrors/nu/numpy创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
上一篇/下一篇内容由系统自动关联 返回资讯列表 →