SymPy简介
SymPy的全称为Symbolic Python,是一款用于符号运算的python库。
1 什么是符号计算
符号计算以符号的方式处理数学对象的计算。这意味着数学对象是精确表示的,而不是近似表示的,带有未赋值变量的数学表达式是以符号形式保留的。
举个例子。假设我们想使用内置的Python函数来计算平方根。我们可以这样做
In [1]: import math
In [2]: math.sqrt(9)
Out[2]: 3.0
9是完全平方数,所以我们得到了确切的答案3。但是假设我们计算了一个非完全平方数8的平方根
In [3]: math.sqrt(8)
Out[3]: 2.8284271247461903
我们得到的是一个近似结果2.82842712475。但这不是8的精确平方根(实际上,8的实际平方根不能用有限的小数表示,因为它是一个无理数)。
怎么得到精确结果: 8 = 4 ⋅ 2 = 2 2 \sqrt{8}=\sqrt{4 \cdot 2}=2 \sqrt{2} 8=4⋅2=22。这就需要用到符号计算了。在SymPy这样的符号计算系统中,非完全平方数的平方根在默认情况下不计算:
In [5]: import sympy
In [6]: sympy.sqrt(3)
Out[6]: sqrt(3)
此外,符号结果还可以被符号化地简化。
In [7]: sympy.sqrt(8)
Out[7]: 2*sqrt(2)
2 另一个例子
上面的例子展示如何使用SymPy精确地处理无理数,但它的功能远不止于此。像SymPy这样的符号计算系统(也经常被称为计算机代数系统,或者简称CASs)能够计算带有变量的符号表达式。
在SymPy中,变量是使用符号symbols
定义的。与许多符号计算系统不同,SymPy中的变量必须在使用前定义。让我们定义一个符号表达式,表示数学表达式 x + 2 y x+2y x+2y。
In [8]: from sympy import symbols
In [9]: x, y = symbols('x y')
In [10]: expr = x + 2*y
In [11]: expr
Out[11]: x + 2*y
注意,我们编写x+2*y
就像编写x
和y
是普通Python变量一样。但是在本例中,表达式结果不是得到具体的值。
In [13]: expr+1
Out[13]: x + 2*y + 1
In [14]: expr-x
Out[14]: 2*y
注意上面例子中的一些东西。当我们输入expr-x
时,我们没有得到x+2*y-x
,而是只有2*y
。x
和-x
自动地相互抵消。这类似于sqrt(8)
自动转换为上面的2*sqrt(2)
。
但SymPy并不总是这样,比如:
In [15]: x*expr
Out[15]: x*(x + 2*y)
在这里,我们可能希望分解形式 x ( x + 2 y ) x(x+2y) x(x+2y)转换成扩展形式 x 2 + 2 x y x^2+2xy x2+2xy。但SymPy有一个风格。除了像 x − x = 0 x−x=0 x−x=0和 8 = 2 2 \sqrt{8}=2 \sqrt{2} 8=22这样明显的简化之外,大多数简化不会自动执行。这是因为我们可能需要分解形式,也可能需要扩展形式。分解形式和扩展形式适用于不同场景。因此,SymPy提供了分解形式和扩展形式的转换函数expand
和factor
In [16]: from sympy import expand, factor
In [17]: expanded_expr = expand(x*expr)
In [18]: expanded_expr
Out[18]: x**2 + 2*x*y
In [19]: factor(expanded_expr)
Out[19]: x*(x + 2*y)
3 SymPy强大之处
SymPy的真正强大之处是做各种类型的符号计算。SymPy可以符号形式地简化表达式、计算导数、积分和极限、解方程、处理矩阵等等。它包括绘图、打印(如公式的2D打印输出,或 LaTeX \LaTeX LATEX形式打印),代码生成,物理学,统计学,组合学,数论,几何学,逻辑等。
下面举一些例子来感受一下SymPy的强大:
In [20]: from sympy import *
In [21]: x, t, z, nu = symbols('x t z nu')
In [22]: init_printing(use_unicode=True) # 指定结果用unicode字符打印出来。
求 sin ( x ) e x \sin (x) e^{x} sin(x)ex的微分:
In [23]: diff(sin(x)*exp(x), x)
Out[23]:
x x
ℯ ⋅sin(x) + ℯ ⋅cos(x)
计算积分: ∫ ( e x sin ( x ) + e x cos ( x ) ) d x \int\left(e^{x} \sin (x)+e^{x} \cos (x)\right) d x ∫(exsin(x)+excos(x))dx
In [24]: integrate(exp(x)*sin(x) + exp(x)*cos(x), x)
Out[24]:
x
ℯ ⋅sin(x)
计算 ∫ − ∞ ∞ sin ( x 2 ) d x \int_{-\infty}^{\infty} \sin \left(x^{2}\right) d x ∫−∞∞sin(x2)dx
In [25]: integrate(sin(x**2), (x, -oo, oo))
Out[25]:
√2⋅√π
─────
2
计算极限: lim x → 0 sin ( x ) x \lim _{x \rightarrow 0} \frac{\sin (x)}{x} limx→0xsin(x)
In [26]: limit(sin(x)/x, x, 0)
Out[26]: 1
求解方程: x 2 − 2 = 0 x^{2}-2=0 x2−2=0
In [27]: solve(x**2 - 2, x)
Out[27]: [-√2, √2]
求解微分方程: y ′ ′ − y = e t y^{\prime \prime}-y=e^{t} y′′−y=et
In [30]: y = Function('y')
In [31]: dsolve(Eq(y(t).diff(t, t) - y(t), exp(t)), y(t))
Out[31]:
-t ⎛ t⎞ t
y(t) = C₂⋅ℯ + ⎜C₁ + ─⎟⋅ℯ
⎝ 2⎠
求矩阵 [ 1 2 2 2 ] \left[\begin{array}{ll}1 & 2 \\2 & 2\end{array}\right] [1222]特征值:
In [32]: Matrix([[1, 2], [2, 2]]).eigenvals()
Out[32]:
⎧3 √17 √17 3 ⎫
⎨─ + ───: 1, - ─── + ─: 1⎬
⎩2 2 2 2 ⎭
:1
表示代数重数为1
将 ∫ 0 π cos 2 ( x ) d x \int_{0}^{\pi} \cos ^{2}(x) d x ∫0πcos2(x)dx字符表达式转换为 LaTeX \LaTeX LATEX代码
In [33]: latex(Integral(cos(x)**2, (x, 0, pi)))
Out[33]: '\\int_{0}^{\\pi} \\cos^{2}{\\left (x \\right )}\\, dx'
4 为什么使用SymPy
首先,SymPy是完全免费的。它是开源的,并且是在自由的BSD许可下授权的,所以你可以修改源代码,甚至可以出售它。这与流行的商业系统(如Maple或Mathematica)形成了对比,后者的许可证成本高达数百美元。
第二,SymPy使用Python。大多数计算机代数系统都是使用自己开发的语言。SymPy不是,它完全用Python编写,用Python执行。这意味着,如果你已经了解Python,那么开始使用SymPy就容易多了。我们已经知道Python是一种well-designed, battle-tested的语言。通过重用现有的语言,我们能够专注于那些重要的东西:数学。
另一个计算机代数系统Sage也使用Python作为其语言。但Sage很大,下载量超过1千兆字节。SymPy的一个优点是它下载量很小。而且,它除了Python之外没有其他依赖项,因此几乎可以在任何地方轻松使用。再者,Sage的目标和SymPy的目标是不同的。Sage的目标是成为一个功能齐全的数学系统,集成所有主要的开放源码数学系统。当您在Sage中调用某些函数(如integrate)时,它会调用它包含的一个开放源代码包。事实上,Sage中包含了SymPy。另一方面,SymPy的目标是成为一个独立的系统,所有的功能都在SymPy本身实现。
SymPy的最后一个重要特点是它可以用作库。许多计算机代数系统关注于在交互环境中的可用性,但是如果您希望自动化或扩展它们,这是很难做到的。使用SymPy,您可以在交互式Python环境中轻松地使用它,也可以将它导入到自己的Python应用程序中。SymPy还提供了api,可以方便地用自己的自定义函数扩展它。
未完待续。。。
【SymPy】(二)使用SymPy需要避开的坑
【SymPy】(三)基本操作
【SymPy】(四)打印机
【SymPy】(五)简化
【SymPy】(六)微积分
【SymPy】(七)方程求解
【SymPy】(八)矩阵
【SymPy】(九)高级表达式操作
今天的文章【SymPy】(一)SymPy简介[通俗易懂]分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/74069.html