SymPy 是一款用于符号运算的 Python 库。它旨在成为 Mathematica 或 Maple 等系统的替代品,同时保持代码尽可能简单且易于扩展。SymPy 完全用 Python 编写,不需要任何外部库。
目录
- sympy第一步
将symy用作计算器
符号
- 代数操作
展开
化简
- 微积分
极限
微分
级数展开
积分
- 方程求解
- 线性代数
矩阵
微分方程
3.2.1. SymPy 的第一步3.2.1.1. 使用 SymPy 作为计算器
SymPy 定义了三种数值类型实数,有理数和整数。
有理数类将有理数表示为一对两个整数:分子和分母,因此 表示 1/ 2、5/2 等:Rational(1, 2)Rational(5, 2)
>>>
>>> import sympy as sym
>>> a = sym.Rational(1, 2)
>>> a
1/2
>>> a*2
1
SymPy 在后台使用 mpmath,这使得使用任意精度算术执行计算成为可能。这样,一些特殊的常数,如e, pi, 无穷大(Infinity) 被视为符号并且可以以任意精度计算:
>>>
>>> sym.pi**2
pi**2
>>> sym.pi.evalf()
3.14159265358979
>>> (sym.pi sym.exp(1)).evalf()
5.85987448204884
evalf将表达式计算为浮点数。
还有一个表示数学无穷大的类, oo:
>>>
>>> sym.oo > 99999
True
>>> sym.oo 1
oo
与其他计算机代数系统相比,在 SymPy 中你必须显式声明符号变量:
>>>
>>> x = sym.Symbol('x')
>>> y = sym.Symbol('y')
然后可以操作它们:
>>>
>>> x y x - y
2*x
>>> (x y) ** 2
(x y)**2
现在可以使用一些 python 运算符来操作符号: 、(算术)、&、| , ~ , >>, << (布尔值)。-`, ``***
Sympy 允许控制输出的显示。从这里我们使用以下设置进行print:
>>>
>>> sym.init_printing(use_unicode=False, wrap_line=True)
SymPy 能够执行强大的代数运算。我们将研究一些最常用的:展开和化简。
3.2.2.1.展开使用它来展开代数表达式。它将尝试消除幂和乘法:
>>>
>>> sym.expand((x y) ** 3)
3 2 2 3
x 3*x *y 3*x*y y
>>> 3 * x * y ** 2 3 * y * x ** 2 x ** 3 y ** 3
3 2 2 3
x 3*x *y 3*x*y y
可以在关键字的表单中提供更多选项:
>>>
>>> sym.expand(x y, complex=True)
re(x) re(y) I*im(x) I*im(y)
>>> sym.I * sym.im(x) sym.I * sym.im(y) sym.re(x) sym.re(y)
re(x) re(y) I*im(x) I*im(y)
>>> sym.expand(sym.cos(x y), trig=True)
-sin(x)*sin(y) cos(x)*cos(y)
>>> sym.cos(x) * sym.cos(y) - sym.sin(x) * sym.sin(y)
-sin(x)*sin(y) cos(x)*cos(y)
如果您想将表达式转换为更简单的形式,请使用简化:
>>>
>>> sym.simplify((x x * y) / x)
y 1
化简是一个有点模糊的术语,并且存在更精确的化简替代方案:(powsimp指数的简化),( trigsimp对于三角表达式) ,logcombine,radsimp
3.2.3. 微积分3.2.3.1.极限限制在 SymPy 中很容易使用,语法limit(Function, variable, point),比如要计算f(x)在x趋于0的极限,使用limit(f, x, 0)
>>>
>>> sym.limit(sym.sin(x) / x, x, 0)
1
还可以计算无穷大的极限:
>>>
>>> sym.limit(x, x, sym.oo)
oo
>>> sym.limit(1 / x, x, sym.oo)
0
>>> sym.limit(x ** x, x, 0)
1
使用 diff(func, var) 计算任何 SymPy 的表达式。例子:
>>>
>>> sym.diff(sym.sin(x), x)
cos(x)
>>> sym.diff(sym.sin(2 * x), x)
2*cos(2*x)
>>> sym.diff(sym.tan(x), x)
2
tan (x) 1
通过以下方式检查它是否正确:
>>>
>>> sym.limit((sym.tan(x y) - sym.tan(x)) / y, y, 0)
2
tan (x) 1
可以使用以下方法计算更高阶的导数:diff(func, var, n)
>>>
>>> sym.diff(sym.sin(2 * x), x, 1)
2*cos(2*x)
>>> sym.diff(sym.sin(2 * x), x, 2)
-4*sin(2*x)
>>> sym.diff(sym.sin(2 * x), x, 3)
-8*cos(2*x)
SymPy 还知道如何计算一个表达式的泰勒级数。使用:series(expr, var)
>>>
>>> sym.series(sym.cos(x), x)
2 4
x x / 6\
1 - -- -- O\x /
2 24
>>> sym.series(1/sym.cos(x), x)
2 4
x 5*x / 6\
1 -- ---- O\x /
2 24
SymPy 支持通过integrate()工具对先验基本函数和特殊函数进行不定和定积分,它使用强大的扩展 Risch-Norman 算法和一些启发式和模式匹配。
>>>
>>> sym.integrate(6 * x ** 5, x)
6
x
>>> sym.integrate(sym.sin(x), x)
-cos(x)
>>> sym.integrate(sym.log(x), x)
x*log(x) - x
>>> sym.integrate(2 * x sym.sinh(x), x)
2
x cosh(x)
特殊函数也很容易处理:
>>>
>>> sym.integrate(sym.exp(-x ** 2) * sym.erf(x), x)
____ 2
\/ pi *erf (x)
--------------
4
可以计算定积分:
>>>
>>> sym.integrate(x**3, (x, -1, 1))
0
>>> sym.integrate(sym.sin(x), (x, 0, sym.pi / 2))
1
>>> sym.integrate(sym.cos(x), (x, -sym.pi / 2, sym.pi / 2))
2
也支持不定积分:
>>>
>>> sym.integrate(sym.exp(-x), (x, 0, sym.oo))
1
>>> sym.integrate(sym.exp(-x ** 2), (x, -sym.oo, sym.oo))
____
\/ pi
SymPy 能够解决代数方程,在一个和多个变量中使用solveset():
>>>
>>> sym.solveset(x ** 4 - 1, x)
{-1, 1, -I, I}
它将一个应该等于 0 的表达式作为第一个参数。它还(有限)支持超越方程:
>>>
>>> sym.solveset(sym.exp(x) 1, x)
{I*(2*n*pi pi) | n in Integers}
线性方程组
Sympy 能够求解大部分多项式方程,并且还能够求解关于多个变量的多个方程,将元组作为第二个参数。使用以下solve()命令:
>>>
>>> solution = sym.solve((x 5 * y - 2, -3 * x 6 * y - 15), (x, y))
>>> solution[x], solution[y]
(-3, 1)
多项式方程的另一种选择是 factor。factor返回分解为不可约项的多项式,并且能够计算各个域的分解:
>>>
>>> f = x ** 4 - 3 * x ** 2 1
>>> sym.factor(f)
/ 2 \ / 2 \
\x - x - 1/*\x x - 1/
>>> sym.factor(f, modulus=5)
2 2
(x - 2) *(x 2)
SymPy 还能够求解布尔方程,即确定某个布尔表达式是否可满足。为此,我们使用可满足的函数:
>>>
>>> sym.satisfiable(x & y)
{x: True, y: True}
这告诉我们,无论何时都是 True并且两者都是 True。如果一个表达式不能为真,即没有任何参数值可以使表达式为真,它将返回 False:(x & y)xy
>>>
>>> sym.satisfiable(x & ~x)
False
矩阵是作为 Matrix 类的实例创建的:
>>>
>>> sym.Matrix([[1, 0], [0, 1]])
[1 0]
[ ]
[0 1]
与 NumPy 数组不同,还可以将 Symbols 放入其中:
>>>
>>> x, y = sym.symbols('x, y')
>>> A = sym.Matrix([[1, x], [y, 1]])
>>> A
[1 x]
[ ]
[y 1]
>>> A**2
[x*y 1 2*x ]
[ ]
[ 2*y x*y 1]
SymPy 能够求解(一些)普通微分问题。要求解微分方程,请使用 dsolve。首先,通过将 cls=Function 传递给 symbols 函数来创建一个未定义的函数:
>>>
>>> f, g = sym.symbols('f g', cls=sym.Function)
f 和 g 现在是未定义的函数。我们可以调用 f(x),它将代表一个未知函数:
>>>
>>> f(x)
f(x)
>>> f(x).diff(x, x) f(x)
2
d
f(x) ---(f(x))
2
dx
>>> sym.dsolve(f(x).diff(x, x) f(x), f(x))
f(x) = C1*sin(x) C2*cos(x)
可以为此函数提供关键字参数,以帮助找到可能的最佳解析系统。例如,如果你知道它是一个可分离方程,你可以使用关键字hint='separable' 强制 dsolve 将它解析为一个可分离方程:
>>>
>>> sym.dsolve(sym.sin(x) * sym.cos(f(x)) sym.cos(x) * sym.sin(f(x)) * f(x).diff(x), f(x), hint='separable')
/ C1 \ / C1 \
[f(x) = - acos|------| 2*pi, f(x) = acos|------|]
\cos(x)/ \cos(x)/