尧图精选

SymPy Integrals 模块完整指南:从不定积分、积分变换到多胞体数值积分

🕒 发布时间:2026/9/15 2:35:28 📁 来源:尧图网络
SymPy Integrals 模块完整指南从不定积分、积分变换到多胞体数值积分【免费下载链接】sympyA computer algebra system written in pure Python项目地址: https://gitcode.com/GitHub_Trending/sy/sympySymPy 的sympy.integrals模块实现了对表达式进行定积分与不定积分计算的完整方法体系其核心入口integrate函数支持从多项式、有理函数到指数—三角函数组合乃至含误差函数的非初等积分的广泛求值并提供了 Mellin、Laplace、Fourier、Hankel 等一系列积分变换以及面向 2D/3D 多胞体的多项式精确积分工具。读完本文你将掌握integrate的完整调用语法与内部算法调度顺序、各积分变换的数学定义与用法、manualintegrate的手算步骤提取能力以及高斯求积和polytope_integrate的实操细节。模块概览integrate是唯一的入口integrals模块的核心思想非常朴素——把求积分这件事封装成一个统一接口integrate(f, x)返回不定积分 $\int f,dx$integrate(f, (x, a, b))返回定积分 $\int_{a}^{b} f,dx$。从源码看integrate 定义于 sympy/integrals/integrals.py其签名中已经暴露了可调度的策略参数def integrate(function, *symbols, meijergNone, condspiecewise, rischNone, heurischNone, manualNone, **kwargs):它内部会构造一个未求值的Integral对象再调用integral.doit(**doit_flags)触发实际计算。也就是说integrate只是Integral.doit的便捷封装二者共享同一套算法调度逻辑。Integral未求值积分的对象模型Integral类 继承自AddWithLimits后者又是ExprWithLimits的子类与Sum共用一个超类用于表示未求值的积分。它的限元limit有三种解释(x,)或x—— 不定积分(x, a)—— 求值点形式的抽象原函数结果用a替换x(x, a, b)—— 定积分。几个值得注意的行为如果不给限元且被积表达式只有一个自由符号会自动以该符号为积分变量Integral(x)等价于Integral(x, x)有多个自由符号时会报错被积函数若定义了_eval_Integral钩子Integral.__new__会直接交给该钩子处理这是其他类自定义积分行为的扩展点对Poly调用integrate/Integral自 1.6 版本起已被弃用应改用Poly.integrate()Integral具有free_symbols属性返回求值后仍会存在的符号例如Integral(x, (x, y, 1)).free_symbols返回{y}以及as_dummy方法用于查看不可被subs替换的哑元符号积分变量本身永远不能被subs更改。核心用法示例 from sympy import * init_printing(use_unicodeFalse) x Symbol(x) integrate(x**2 x 1, x) 3 2 x x -- -- x 3 2多项式积分直接给出精确有理系数结果有理函数也走完全算法 integrate(x/(x**22*x1), x) 1 log(x 1) ----- x 1指数—多项式组合教材中需要反复分部积分才能完成的类型同样一次到位 integrate(x**2 * exp(x) * cos(x), x) 2 x 2 x x x x *e *sin(x) x *e *cos(x) x e *sin(x) e *cos(x) ------------ ------------ - x*e *sin(x) --------- - --------- 2 2 2 2甚至部分非初等积分涉及误差函数也能求值 integrate(exp(-x**2)*erf(x), x) ____ 2 \/ pi *erf (x) -------------- 4定积分的收敛条件处理conds参数定积分尤其是反常积分往往牵涉收敛条件。conds参数控制这些条件如何返回对应 integrate 文档字符串中的策略说明condspiecewise默认结果以Piecewise分段函数形式返回condsseparate结果为(结果, 收敛条件)元组condsnone直接丢弃条件只返回公式本身。 integrate(x**a*exp(-x), (x, 0, oo)) # 等价于 condspiecewise Piecewise((gamma(a 1), re(a) -1), (Integral(x**a*exp(-x), (x, 0, oo)), True)) integrate(x**a*exp(-x), (x, 0, oo), condsnone) gamma(a 1) integrate(x**a*exp(-x), (x, 0, oo), condsseparate) (gamma(a 1), re(a) -1)可以看到当参数不满足re(a) -1时默认模式会保留未求值的Integral而不是给出错误结论。多重积分与line_integrateintegrate支持一次传入多个变量实现多重积分若省略变量且被积函数是单变量表达式会自动对该变量做不定积分。此外模块还提供 line_integrate 计算第一类曲线积分 from sympy import Curve, line_integrate, E, ln from sympy.abc import x, y, t C Curve([E**t 1, E**t - 1], (t, 0, ln(2))) line_integrate(x y, C, [x, y]) 3*sqrt(2)其内部实现是对曲线参数求导得到弧长微元把场函数替换为F(r(t))后乘以 $\sqrt{\sum r_i(t)^2}$再对参数做一次定积分。注意该函数要求场函数变量数与曲线维度一致且曲线参数不能与场变量重名。内部算法调度SymPy 如何决定用哪个算法Integral.doit按固定顺序尝试多种算法先快后慢直到得到答案为止。这一调度逻辑在 integrals.py 的策略说明 中有完整描述总顺序为定积分且上下限含 $\pm\infty$ 时优先尝试 Meijer G 函数方法否则先找原函数antiderivative按性能排序多项式积分最先、Meijer G 倒数第二、启发式 Rischheurisch最后若仍未成功再无条件尝试 G 函数方法。meijergTrue/False/None分别表示只用 G 函数方法绝不使用 G 函数方法按上述顺序使用全部方法默认None。有理函数Lazard-Rioboo-Trager 与 Horowitz-Ostrogradsky有理函数积分在 sympy/integrals/rationaltools.py 中实现属于存在完全算法的一类ratint整体入口负责有理函数的不定积分ratint_ratpartHorowitz-Ostrogradsky 算法先把积分拆成有理部分 对数部分ratint_logpartLazard-Rioboo-Trager 算法处理对数部分产生 $\log$ 项。前面的示例x/(x**22*x1)正是这类算法的产物。三角与特殊函数trigintegrate通过模式匹配处理三角函数的乘积、幂次等常见形态deltaintegrate在 sympy/integrals/deltafunctions.py 中处理含DiracDelta的积分singularityintegrate在 sympy/integrals/singularityfunctions.py 中处理含SingularityFunction的积分。Risch 算法能证明不存在初等原函数的决定性过程Risch 算法 是求初等函数原函数的通用方法其强大之处在于它是决策过程要么算出初等原函数要么证明其不存在。不过 SymPy 目前只实现了完整算法的一小部分主要是关于指数和对数的超越部分。risch_integrate 的签名给出了可用参数def risch_integrate(f, x, extensionNone, handle_firstlog, separate_integralFalse, rewrite_complexNone, condspiecewise):关键优势如果返回的是NonElementaryIntegralIntegral的一个子类则算法已证明该积分不可能用指数、对数、三角函数、幂函数、有理函数、代数函数及其复合来表示。在integrate中传入rischTrue可以只走完整 Risch 算法——这在你只关心是否存在初等原函数时很有用因为默认情况下integrate还会用 G 函数等方法尝试把非初等积分表达为特殊函数。Meijer G 函数方法非初等定积分的主力对于非初等定积分SymPy 借助 Meijer G 函数单个 G 函数的不定积分总可计算两个 G 函数乘积在 $0$ 到 $\infty$ 上的定积分也可计算详见 g-functions.rst。integrate的meijerg参数即可开关该策略其实现位于sympy.integrals.meijerint模块。Risch-Norman 启发式算法兜底的最后手段heurisch 实现了简化版的 Risch 算法Risch-Norman 算法与配套的components函数一起在其它算法全部失败后兜底。它通常最慢所以排在最后。由于它能覆盖大量普通函数integrate默认就启用它heurischNone表示自动决定。积分变换Mellin、Laplace、Fourier 与 Hankelsympy.integrals.transforms子模块源码文件 sympy/integrals/transforms.py为定积分和积分变换提供专门支持。所有变换类都继承自 IntegralTransform 基类无法计算时抛出 IntegralTransformError。函数数学定义说明mellin_transform(f, x, s)$F(s)\int_0^\infty x^{s-1}f(x),dx$输出(F(s), 基本带, 收敛条件)三元组逆变换inverse_mellin_transform(F, s, x, strip)需给出基本带strip(a, b)laplace_transform(f, t, s)$F(s)\int_0^\infty e^{-st}f(t),dt$输出(F(s), 收敛条件, 收敛域)配套laplace_correspondence、laplace_initial_conds辅助处理分段/初值问题fourier_transform(f, x, k)酉普通频率 Fourier 变换还有inverse_fourier_transform及内部后端的_fourier_transformsine_transform/cosine_transform酉普通频率正弦/余弦变换各自配有InverseSineTransform/InverseCosineTransformhankel_transform(f, r, k, nu)$F_\nu(k)\int_0^\infty f(r)J_\nu(kr),r,dr$核函数为贝塞尔函数 $J_\nu$配有inverse_hankel_transform每个变换都同时提供函数形式立即计算与类形式如MellinTransform、LaplaceTransform、FourierTransform、SineTransform、CosineTransform、HankelTransform及其逆变换类用于表示未求值的变换、延迟计算或参与符号推导。需要注意Fourier 族变换默认给出的是酉普通频率unitary, ordinary-frequency约定与部分文献/教材的角频率约定不同Laplace 变换默认收敛域约定为 $\mathrm{Re}(s) 0$ 一侧且结果中会返回收敛条件。手算风格积分manualintegrate与integral_steps前面所有算法要么基于模式匹配要么与微积分课上教的方法差异很大。而 manualintegrate 则模拟人工手算的套路分部积分、换元、三角公式等其最大价值在于步骤可提取、可复现。模块内部把每一条积分技术建模为Rule子类见源码中的规则类层次ConstantRule、PowerRule、AddRule、URule换元、PartsRule分部积分、CyclicPartsRule循环分部积分用于exp(x)*sin(x)型、SinRule/CosRule、ExpRule、ReciprocalRule等规则之间可以嵌套组合成完整的求解步骤树。用法上integrate(f, x, manualTrue)只用手算风格算法求值覆盖范围比完整调度小但结果形式更贴近教科书integral_steps(f, x)返回完整的步骤树对象不自动求值便于逐条展示如何手算出来。SymPy Gamma 在线服务正是基于这套机制向用户展示逐步推导过程。注意integral_steps返回的是步骤数据结构若要得到最终表达式需对其进一步展开处理。数值积分辅助高斯求积的节点与权重当符号积分不可行或不需要精确符号结果时sympy/integrals/quadrature.py 提供任意阶数、任意精度的高斯求积节点与权重计算全部为符号精度n_digits控制精度位数gauss_legendre(n, n_digits)区间 $[-1,1]$ 上的 Gauss-Legendre 求积gauss_laguerre(n, n_digits)半无穷区间 $[0,\infty)$权重含 $e^{-x}$gauss_hermite(n, n_digits)全实数轴权重含 $e^{-x^2}$gauss_gen_laguerre(n, alpha, n_digits)广义 Laguerre权重含 $x^\alpha e^{-x}$gauss_chebyshev_t(n, n_digits)与gauss_chebyshev_u(n, n_digits)第一、二类 Chebyshev 求积gauss_jacobi(n, alpha, beta, n_digits)Jacobi 求积Legendre 是其特例gauss_lobatto(n, n_digits)Lobatto 求积端点固定参与。这些函数返回(x, w)节点与权重对可直接用于 $\int f(x),dx \approx \sum_i w_i f(x_i)$ 的数值近似。多胞体Polytope上的多项式积分polytope_integrateintpoly子模块源码 sympy/integrals/intpoly.py实现多项式在 2D/3D 多胞体上的精确积分算法依据 Chin, Lasserre 与 Sukumar (2015) 的论文。主入口为def polytope_integrate(poly, exprNone, *, clockwiseFalse, max_degreeNone):输入表示2D 多边形直接复用sympy.geometry.polygon中的Polygon数据结构3D 多面体最经济的表示是顶点列表 每个面多边形的顶点索引列表。以单位立方体为例unit_cube [[(0, 0, 0), (0, 0, 1), (0, 1, 0), (0, 1, 1), (1, 0, 0), (1, 0, 1), (1, 1, 0), (1, 1, 1)], [3, 7, 6, 2], [1, 5, 7, 3], [5, 4, 6, 7], [0, 4, 5, 1], [2, 0, 1, 3], [2, 6, 4, 0]]第一个子列表是顶点表其余子列表如[3, 7, 6, 2]按顺序给出构成某个面的顶点索引。2D 示例单多项式 from sympy.integrals.intpoly import * init_printing(use_unicodeFalse) polytope_integrate(Polygon((0, 0), (0, 1), (1, 0)), x) 1/6 polytope_integrate(Polygon((0, 0), (0, 1), (1, 0)), x x*y y**2) 7/24传入多项式列表并指定max_degree此时列表中的常数项、浮点系数同样被精确积分 polytope_integrate(Polygon((0, 0), (0, 1), (1, 0)), [3, x*y y**2, x**4], max_degree4) 4 2 {3: 3/2, x : 1/30, x*y y : 1/8}只给max_degree而不给多项式则计算所有次数不超过该值的单项式 polytope_integrate(Polygon((0, 0), (0, 1), (1, 0)), max_degree3) 2 3 2 3 2 2 {0: 0, 1: 1/2, x: 1/6, x : 1/12, x : 1/20, y: 1/6, y : 1/12, y : 1/20, x*y: 1/24, x*y : 1/60, x *y: 1/60}3D 示例 cube [[(0, 0, 0), (0, 0, 5), (0, 5, 0), (0, 5, 5), (5, 0, 0), (5, 0, 5), (5, 5, 0), (5, 5, 5)], ... [2, 6, 7, 3], [3, 7, 5, 1], [7, 6, 4, 5], [1, 5, 4, 0], [3, 1, 0, 2], [0, 4, 6, 2]] polytope_integrate(cube, x**2 y**2 z**2 x*y y*z x*z) -21875/4带符号系数用S(-1)/sqrt(2)构造精确值的八面体 octahedron [[S(-1)/sqrt(2), 0, 0), (0, S(1)/sqrt(2), 0), (0, 0, S(-1)/sqrt(2)), (0, 0, S(1)/sqrt(2)), ... (0, S(-1)/sqrt(2), 0), (S(1)/sqrt(2), 0, 0)], ... [3, 4, 5], [3, 5, 1], [3, 1, 0], [3, 0, 4], [4, 0, 2], [4, 2, 5], [2, 0, 1], [5, 2, 1]] polytope_integrate(octahedron, x**2 y**2 z**2 x*y y*z x*z) ___ \/ 2 ----- 20参数说明polyPolygon对象2D或顶点列表 面索引列表3Dexpr被积多项式一元/二元/三元均可可以是单个表达式、表达式列表或省略此时必须给max_degree返回全部单项式积分结果字典max_degree多项式最高次数用于限制单项式枚举clockwise布尔值指示多边形顶点是否按顺时针排列用于内部方向/法向判断。算法选择速查遇到积分该怎么下手场景建议普通初等函数组合的符号积分integrate(f, x)默认完整调度即可想确认是否存在初等原函数integrate(f, x, rischTrue)返回NonElementaryIntegral即证明非初等想得到手算风格的步骤integral_steps(f, x)或integrate(f, x, manualTrue)0 到 ∞ 的定积分、含特殊函数保持meijergNone自动或meijergTrue强制 G 函数方法需要显式收敛条件使用conds参数默认piecewise数值近似用gauss_*系列获取节点与权重后自行加权求和多项式在凸/非凸多边形、多面体上的精确积分polytope_integrate已知局限该模块仍有大量无法积分的函数完整 Risch 算法也只实现了指数/对数超越部分代数部分未覆盖。若遇到integrate原样返回未求值Integral原因通常是该函数确实无初等原函数、所需算法分支尚未实现或 G 函数改写失败。可以尝试manualTrue、heurischTrue或拆分成多个子表达式分别积分来绕过部分限制。延伸阅读g-functions.rstMeijer G 函数积分方法的详细介绍integrals 模块索引页本模块的文档导航核心实现integrals.pyintegrate/Integral/line_integrate、transforms.py积分变换、rationaltools.py有理函数、manualintegrate.py手算步骤、quadrature.py高斯求积、intpoly.py多胞体积分对应测试sympy/integrals/tests/下的test_integrals.py、test_transforms.py、test_manualintegrate.py、test_intpoly.py等覆盖了本文所有示例与边界情况。【免费下载链接】sympyA computer algebra system written in pure Python项目地址: https://gitcode.com/GitHub_Trending/sy/sympy创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
上一篇/下一篇内容由系统自动关联 返回资讯列表 →