ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

SymPy 入门导读:理解纯 Python 计算机代数系统中的符号计算

SymPy 入门导读:理解纯 Python 计算机代数系统中的符号计算 SymPy 入门导读理解纯 Python 计算机代数系统中的符号计算【免费下载链接】sympyA computer algebra system written in pure Python项目地址: https://gitcode.com/GitHub_Trending/sy/sympySymPy 是一个完全用 Python 编写、在 Python 环境中执行的计算机代数系统Computer Algebra SystemCAS。本教程导读是 SymPy 官方入门教程的第一篇面向「已经掌握 Python 基础、但从未接触过符号计算」的读者讲解什么是符号计算、SymPy 与普通数值计算的本质区别以及它相比 Maple、Mathematica、Sage 等系统的差异化优势。读完本文你将理解为什么sympy.sqrt(8)会精确地返回2*sqrt(2)学会用symbols定义符号表达式并执行求导、积分、极限、解方程、矩阵运算等核心操作为后续深入教程打下基础。什么是符号计算Symbolic Computation符号计算的核心思想是数学对象以精确形式表示而不是近似形式含有未求值变量的数学表达式保持符号形式不做数值化替换。这与数值计算numerical computation形成鲜明对照。以开平方为例。如果使用 Python 内置的math模块 import math math.sqrt(9) 3.0 math.sqrt(8) 2.828427124759是完全平方数math.sqrt(9)得到精确答案3但math.sqrt(8)返回的是近似结果2.82842712475——它不是 8 的真实平方根真实平方根是无理数无法用有限位小数表示。如果只关心 8 的十进制小数形式这个结果已经足够但若想进一步推导出√8 √(4·2) 2√2这一代数关系浮点近似就无能为力了。这正是符号计算发挥作用的场景。在 SymPy 中非完全平方数的平方根默认保持未求值状态并会自动执行符号层面的化简 import sympy sympy.sqrt(3) sqrt(3) sympy.sqrt(8) 2*sqrt(2)从源码结构看sqrt函数定义于 sympy/functions/elementary/miscellaneous.py其关键设计是evaluate参数当它为None时取全局参数global_parameters.evaluate的值决定表达式是否被求值化简。这也是为什么sqrt(x)**2会化简为x而sqrt(x**2)不会化简为x——两者在一般情形如x -1下并不相等SymPy 会忠实地保留这种数学上的差异。一个更有意思的例子符号表达式的基本运算符号计算系统的威力远不止处理无理数。这类系统即计算机代数系统CAS能够对含变量的符号表达式进行精确计算。在 SymPy 中变量必须先定义后使用这与许多自动定义变量的符号系统不同原因在教程 gotchas.rst 的 Symbols 一节有详细讨论。定义变量使用symbols from sympy import symbols x, y symbols(x y) expr x 2*y expr x 2*y注意我们书写x 2*y的方式与普通 Python 变量完全一致但结果不再被求值成某个数而是保留为x 2*y这一符号表达式。接下来可以对它做算术运算 expr 1 x 2*y 1 expr - x 2*yexpr - x没有返回x 2*y - x而是自动化简为2*y——x与-x互相抵消了这与sqrt(8)自动变成2*sqrt(2)同理。不过SymPy 并非对所有情形都自动化简 x*expr x*(x 2*y)这里x(x 2y)并没有自动展开成x² 2xy。这是 SymPy 的一个普遍设计主题除了x - x 0、√8 2√2这类显而易见的化简大部分化简不会自动进行。原因是因式分解形式x(x 2y)与展开形式x² 2xy各有适用场景用户需要按需选择。SymPy 提供了在这两种形式之间转换的函数 from sympy import expand, factor expanded_expr expand(x*expr) expanded_expr x**2 2*x*y factor(expanded_expr) x*(x 2*y)expand负责展开factor负责因式分解二者互为逆操作。符号与 Python 变量的区别Quick Tip新手常犯的错误是混淆 SymPy 的 Symbol 与 Python 变量。考虑下面这段代码x symbols(x) expr x 1 x 2 print(expr)如果猜测输出是3那就错了。实际输出是x 1。原因在于x 2只改变 Python 变量x的指向对创建expr时使用的 SymPy Symbolx没有任何影响。这是 Python 的通用行为——变量被重新赋值后之前用旧值创建的表达式不会自动改变SymPy 与普通 Python 代码在这一点上完全一致。另外注意Symbol 的名字与其绑定的 Python 变量名可以毫无关系如a, b symbols(b a)最佳实践是让两者同名但符号名可以包含 Python 变量名不允许的字符例如crazy symbols(unrelated)中 Symbol 名为unrelated。从源码看symbols函数定义于 sympy/core/symbol.py它接受一个以逗号或空白分隔的字符串或字符串序列并返回对应的 Symbol 序列例如symbols(x,y,z)。符号计算的力量一个能力速览SymPy 的真正力量在于它能够以符号方式完成几乎所有数学运算化简表达式、求导、积分、求极限、解方程、处理矩阵以及绘图、打印如 2D 美观排版或 LaTeX 输出、代码生成、物理、统计、组合数学、数论、几何、逻辑等模块。下面是教程中的一组示例用于展示这种符号能力。首先导入全部函数并开启 Unicode 美化打印 from sympy import * x, t, z, nu symbols(x t z nu) init_printing(use_unicodeTrue)对sin(x)·eˣ求导 diff(sin(x)*exp(x), x) x x ℯ ⋅sin(x) ℯ ⋅cos(x)计算不定积分∫(eˣsin(x) eˣcos(x)) dx integrate(exp(x)*sin(x) exp(x)*cos(x), x) x ℯ ⋅sin(x)计算反常积分∫₋∞^∞ sin(x²) dx integrate(sin(x**2), (x, -oo, oo)) √2⋅√π ───── 2求极限lim_{x→0} sin(x)/x limit(sin(x)/x, x, 0) 1求解方程x² - 2 0 solve(x**2 - 2, x) [-√2, √2]求解微分方程y - y eᵗ y Function(y) dsolve(Eq(y(t).diff(t, t) - y(t), exp(t)), y(t)) -t ⎛ t⎞ t y(t) C₂⋅ℯ ⎜C₁ ─⎟⋅ℯ ⎝ 2⎠求矩阵[[1, 2], [2, 2]]的特征值 Matrix([[1, 2], [2, 2]]).eigenvals() ⎧3 √17 3 √17 ⎫ ⎨─ - ───: 1, ─ ───: 1⎬ ⎩2 2 2 2 ⎭将贝塞尔函数J_ν(z)改写成球贝塞尔函数j_ν(z)的形式 besselj(nu, z).rewrite(jn) √2⋅√z⋅jn(ν - 1/2, z) ──────────────────── √π用 LaTeX 打印定积分∫₀^π cos²(x) dx latex(Integral(cos(x)**2, (x, 0, pi))) \int\limits_{0}^{\pi} \cos^{2}{\left(x \right)}\, dx需要说明的是init_printing(use_unicodeTrue)只是让控制台以 Unicode 字符美化输出即使不开它所有计算照常进行只是打印形式不同。上述示例分别对应教程后续章节深入讲解的主题详见 features.rst 及其子章节基础操作、打印、化简、微积分、求解器、矩阵、表达式操作。为什么选择 SymPy市面上有大量计算机代数系统Wikipedia 的 List of computer algebra systems 词条列出了一部分。SymPy 与它们相比的差异化优势体现在四点1. 完全免费且开源。SymPy 采用宽松的 BSD 许可证你可以修改源代码甚至可以再销售它。这与 Maple、Mathematica 等动辄数百美元许可费用的商业系统形成鲜明对比。2. 使用 Python。多数 CAS 会发明自己的语言SymPy 不会——它完全用 Python 编写、完全在 Python 中执行。如果你已经会 Python就无需学习新语法可以直接上手SymPy 开发者将精力集中在数学本身而不是重新发明编程语言。3. 轻量、无依赖。同为 Python 系 CAS 的 Sage 也使用 Python但 Sage 体积庞大下载超过 1 GB且通过整合各类开源数学软件来实现功能——例如在 Sage 中调用integrate时会转调其捆绑的开源包SymPy 本身也包含在 Sage 中。SymPy 的目标则是成为独立的系统所有功能都在 SymPy 内部实现它除 Python 外无任何依赖体积相对小几乎可以在任何环境轻松使用。4. 可作库嵌入。许多 CAS 专注于交互式环境自动化和扩展困难。SymPy 既可以像普通库一样在交互式 Python 环境中使用也可以直接import到自己的 Python 应用程序中并提供易于扩展的 API支持自定义函数。后续学习路径本教程是 SymPy 官方入门教程的一部分完整目录见 index.rst后续章节按逻辑顺序覆盖预备知识Python 基础与安装见 preliminaries.rst、SymPy 常见陷阱gotchas.rst、以及 features.rst 中的七大部分——基础操作、打印、化简、微积分、求解器、矩阵与表达式操作。完成入门教程后可以按 next.rst 的指引继续深入开发者可查阅 How-to Guides 了解关键开发任务中级用户和开发者可阅读 Explanations 部分了解常见陷阱与进阶主题API 使用细节则见 SymPy API Reference有兴趣参与贡献的读者可查看贡献指南。本篇导读对应的文档位于 intro.rst其中所有示例均可直接复制到 Python 交互环境运行验证。【免费下载链接】sympyA computer algebra system written in pure Python项目地址: https://gitcode.com/GitHub_Trending/sy/sympy创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表