Sympy是一个符号计算的Python库。它的目标是成为一个全功能的计算机代数系统,同时保持代码简洁、易于理解和扩展。它完全由Python写成,不依赖于外部库。SymPy支持符号计算、高精度计算、模式匹配、绘图、解方程、微积分、组合数学、离散 数学、几何学、概率与统计、物理学等方面的功能。官方在线文档:Welcome to SymPy’s documentation!
sympy库安装:pip3 install sympy
SymPy内置符号虚数单位I
>>> import sympy
>>> I
I
>>> I ** 2
-1
>>> sqrt(-1)
I
自然对数的底E
>>> import sympy
>>> E
E
>>> #取对数
>>> log(E)
1
无穷大oo
>>> import sympy
>>> oo
oo
>>> oo > 9999999
True
>>> 1/oo
0
>>> oo+12
oo
圆周率pi
>>> import sympy
>>> pi
pi
>>> pi**2
pi**2
>>> pi.evalf()
3.14159265358979
>>> sin(pi/2)
1
SymPy基础应用
数学格式输出:
init_printing()
添加变量:
x, y, z, a, b, c = symbols('x y z a b c')
声明分数:
Rational(1, 3)
化简式子:
simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
因式分解:
expand((x + 2)*(x - 3))
提取公因式:
factor(x**3 - x**2 + x - 1)
约分:
cancel((x**2 + 2*x + 1)/(x**2 + x))
裂项:
apart((4*x**3 + 21*x**2 + 10*x + 12)/(x**4 + 5*x**3 + 5*x**2 + 4*x))
变换形式:
tan(x).rewrite(sin)
数列求和:
Sum(x ** 2, (x, 1, a)).doit()
数列求积:
Product(x**2,(x, 1, a)).doit()
微积分
求导:
diff(cos(x), x)
求高阶导:
diff(x**4, x, 3)
连续求偏导:
diff(exp(x*y*z), x, y, 2, z, 4)
不定积分:
integrate(cos(x), x)
定积分:
integrate(exp(-x), (x, 0, oo))
多重积分:
integrate(exp(-x**2 - y**2), (x, -oo, oo), (y, -oo, oo))
极限:
limit(sin(x)/x, x, 0)
泰勒展开(到第4阶):
sin(x).series(x, 0, 4)
泰勒展开(在x=6处):
exp(x - 6).series(x, 6)
矩阵
矩阵求逆:
Matrix([[1, 3], [-2, 3]])**-1
求转置:
Matrix([[1, 2, 3], [4, 5, 6]]).T
生成单位矩阵:
eye(3)
求行列式:
Matrix([[1, 0, 1], [2, -1, 3], [4, 3, 2]]).det()
化成行阶梯形矩阵:
Matrix([[1, 0, 1, 3], [2, 3, 4, 7], [-1, -3, -3, -4]]).rref()
求列向量空间:
Matrix([[1, 1, 2], [2 ,1 , 3], [3 , 1, 4]]).columnspace()
M = Matrix([[3, -2, 4, -2], [5, 3, -3, -2], [5, -2, 2, -2], [5, -2, -3, 3]])
求特征值:
M.eigenvals()
求特征向量:
M.eigenvects()
求对角化矩阵,返回两个矩阵P、D满足PDP−1=MPDP−1=M:
M.diagonalize()
解方程
求解集:
solveset(x**2 - x, x)
求解集(显示多少个重根):
roots(x**3 - 6*x**2 + 9*x, x)
求解集(用Eq构造等式):
solveset(Eq(sin(x), 1), x, domain=S.Reals)
解线性方程组:
linsolve([x + y + z - 1, x + y + 2*z - 3 ], (x, y, z))
解线性方程组(矩阵表示):
linsolve(Matrix(([1, 1, 1, 1], [1, 1, 2, 3])), (x, y, z))
解非线性方程组:
nonlinsolve([exp(x) - sin(y), 1/y - 3], [x, y])
解微分方程:
f, g = symbols('f g', cls=Function)
dsolve(Eq(f(x).diff(x, x) - 2*f(x).diff(x) + f(x), sin(x)), f(x))
解不等式组:
from sympy.solvers.inequalities import *
reduce_inequalities([x <= x ** 2], [x])
逻辑代数
from sympy.logic.boolalg import *
合取范式:
to_cnf(~(x | y) | z)
析取范式:
to_dnf(x & (y | z))
化简逻辑函数:
simplify_logic((~x & ~y & ~z) | ( ~x & ~y & z))
from sympy.logic import *
化简最小项之和为析取范式
minterms = [0, 7]
SOPform([x, y, z], minterms)
化简最小项之和为合取范式
minterms = [[1, 0, 1], [1, 1, 0], [1, 1, 1]]
POSform([x, y, z], minterms)
化简最小项之和为析取范式(第7项任取)
minterms = [[1, 0, 1], [1, 1, 0]]
dontcares = [7]
SOPform([x, y, z], minterms, dontcares)
数论
from sympy.ntheory import *
阶乘:
factorial(10)
分解质因数:
factorint(300)
factorint(300, visual=True)
求欧拉函数:
totient(25)
判断质数:
isprime(101)
True
莫比乌斯函数:
mobius(13 * 17 * 5)
-1
乘法逆元(模后者意义):
mod_inverse(3, 5)
2
from sympy.ntheory.factor_ import *
求因子:
divisors(36)
[1, 2, 3, 4, 6, 9, 12, 18, 36]
from sympy.ntheory.modular import *
中国剩余定理解同余方程(模数需互质,前三个数为模数,后三个数为余数,返回第一个数为结果):
crt([99, 97, 95], [49, 76, 65])
(639985, 912285)
解同余方程(模数不需互质但比中国剩余定理慢,每个元组第一个数为余数,第二个数为模数,返回第一个数为结果):
solve_congruence((2, 3), (3, 5), (2, 7))
(23, 105)
from sympy.ntheory.residue_ntheory import *
求原根(如下2在模19意义下的所有幂占满了0到18):
primitive_root(19)
2
求离散对数(如下73mod15=4173mod15=41):
discrete_log(41, 15, 7)
3
总结
越研究越发现SymPy的强大,相信在科学计算方面SymPy已经能够解决日常遇到的多数计算问题了。本文列出的也只是其用法的一部分,更多的功能可以去SymPy的官网查找。