官方文档:https://docs.sympy.org/latest/index.html
一.概述
1.简介:
SymPy是Python中专门用于进行符号计算的库,旨在成为功能齐全的计算机代数系统.其可以解决诸如多项式求值/求极限/解方程/积分/微分/级数展开/
矩阵运算在内的大量问题
2.安装:
pip install sympy
二.对象的表示与运算
1.已知量的表示与运算
(1)有理数的表示:
class sympy.Rational(<p>[,q=1,gcd=None])
#参数说明:
p,q:分别指定分子/分母;均为real num
#实例:
>>> r37=sympy.Rational(3,7)
>>> r14=sympy.Rational(1,4)
(2)内置的特殊值符号:
#虚数单位i:
>>> sympy.I
I
>>> sympy.I**2
-1
>>> sympy.sqrt(-1)
I
#自然常数e:
>>> sympy.E
E
>>> sympy.log(sympy.E)
1
#无穷大∞:
>>> sympy.oo
oo
>>> 1/sympy.oo
0
>>> 1+sympy.oo
oo
>>> 1*sympy.oo
oo
>>> 1-sympy.oo
-oo
#圆周率π:
>>> sympy.pi
pi
>>> sympy.sin(sympy.pi/2)
1
(3)已知量的运算:
#和内置的int/float相同:
>>> r37+r14
19/28
>>> r37-r14
5/28
>>> r37*r14
3/28
>>> r37/r14
12/7
>>> r37**r14
3**(1/4)*7**(3/4)/7
2.未知量的表示与运算
(1)未知量的表示:
未知量:class sympy.Symbol(<name>[,**assumptions])
#参数说明:
name:指定符号名;为str(仅能创建1个符号)
#实例:
>>> x=sympy.Symbol("x")
>>> x
x
######################################################################################################################
从sympy.abc导入(该子模块将所有拉丁/希腊字母储存为符号):
>>> from sympy.abc import x,y
>>> x+y
x + y
>>> x+y*y-1
2
x + y - 1
(2)未知量的运算:
#和内置的int/float相同:
>>> a+1
a + 1
>>> a+b
a + b
>>> (a+b)/2*a
a*(a/2 + b/2)
>>> a/=3
>>> a
a/3
>>> a**2
a**2/9
(3)方法:
对符号进行替换并求值:<sym>.subs([*args,**kwargs])
<sym>.evalf([n=15,subs=None,maxn=100,chop=False,strict=False,quad=None,verbose=False])
#注:<sym>.evalf()的精度更高
#参数说明:
sym:指定未知量或表达式
args:指定符号替换规则;为<old>,<new>/(<old>,<new>) list/dict
kwargs:指定符号替换规则;为{<old>:<new>...}
n:指定最终精度(显示到小数点后几位);为int
subs:指定符号替换规则;为dict,格式为{<old1>:<new1>...}
maxn:指定工作中的最大精度;为int
chop:指定小值数的精度(小于该值则视为0);为bool/num
#>>> from sympy import N
#>>> x = 1e-4
#>>> N(x, chop=True)
#0.000100000000000000
#>>> N(x, chop=1e-5)
#0.000100000000000000
#>>> N(x, chop=1e-4)
#0
strict:指定中间结果出现精度缺失时是否报错;为bool
quad:指定数值积分的算法;为str
verbose:指定是否输出debug信息;为bool
#实例:
>>> (a+3).subs(a,3)
6
>>> (a+3).subs([(a,3)])
6
>>> (a+3).subs({a:3})
6
>>> from sympy.abc import x,y,z
>>> values={x:1e16,y:1,z:1e16}
>>> (x+y-z).subs(values)
0
>>> (x+y-z).evalf(subs=values)
1.00000000000000
######################################################################################################################
判断表达式是否相等:<sym>.equals(<other>[,failing_expression=False])
#参数说明:
other:指定要进行比较的表达式
failing_expression:If failing_expression is True then the expression which did not simplify to a 0 will be returned instead of None
#实例:
>>> from sympy import pprint, Symbol,sin,cos
>>> x=Symbol('x')
>>> a=cos(x)**2-sin(x)**2
>>> b=cos(2*x)
>>> print(a.equals(b))
True
3.表达式
(1)表达式:
通过已知量和未知量的组合得到表达式:
>>> from sympy.abc import a,b
>>> expr=b*a+-4*a+b+a*b+4*a+(a+b)*3
>>> print(expr)
2*a*b + 3*a + 4*b#SymPy会自动化简表达式(注意:SymPy仅执行廉价操作,因此可能无法得到最简形式)
>>> type(expr)
<class 'sympy.core.add.Add'>#类型为最后1级运算结果的类型
>>> type(a*a)
<class 'sympy.core.power.Pow'>
>>> type(a**a)
<class 'sympy.core.power.Pow'>
>>> type(a*b)
<class 'sympy.core.mul.Mul'>
(2)等式:
class sympy.Equality(<lhs>[,rhs=0,**options])
#相当于class sympy.Eq();和Python内置的"=="有所不同
#参数说明:
lhs,rhs:分别指定等式左/右侧的表达式;均为sympy.Symbol
evaluate:指定是否立即进行判断;为bool
#实例:
>>> sympy.Eq(x)
C:\Users\Euler\AppData\Local\Programs\Python\Python38\lib\site-packages\sympy\core\relational.py:492: SymPyDeprecationWarning:
Eq(expr) with rhs default to 0 has been deprecated since SymPy 1.5.
Use Eq(expr, 0) instead. See
https://github.com/sympy/sympy/issues/16587 for more info.
SymPyDeprecationWarning(
Eq(x, 0)
>>> sympy.Eq(x,0)
Eq(x, 0)
>>> sympy.Eq(2,0)
False
>>> sympy.Eq(2,0,evaluate=False)
Eq(2, 0)
>>> sympy.Eq(True,1),True==1
(False, True)
- 关于 = = == ==:
在SymPy中,"=="用于检查其2侧的表达式的结构是否完全相同
#实例:
>>> x=sympy.Symbol("x")
>>> x+1==4
False
>>> x==x
True
>>> (x+1)**2==x**2+2*x+1
False
>>> x.subs(x,1)==1
True
4.矩阵
(1)矩阵:
矩阵:class sympy.Matrix(<contents>)
#相当于class sympy.MutableMatrix()/class sympy.MutableDenseMatrix()
#参数说明:
contents:指定矩阵内的值;为list-like
#实例:
>>> M=sympy.Matrix([[1,2],[3,4],[0,3]])
>>> M
Matrix([
[1, 2],
[3, 4],
[0, 3]])
>>> pprint(M)
⎡1 2⎤
⎢ ⎥
⎢3 4⎥
⎢ ⎥
⎣0 3⎦
>>> N=sympy.Matrix([2,2])
(2)运算:
支持数乘/加/减/乘等运算
#实例:接上
>>> N*2
Matrix([
[4],
[4]])
>>> M+M
Matrix([
[2, 4],
[6, 8],
[0, 6]])
>>> M-M
Matrix([
[0, 0],
[0, 0],
[0, 0]])
>>> M*N
Matrix([
[ 6],
[14],
[ 6]])
三.函数
1.IO:
初始化输出设置:sympy.init_printing([pretty_print=True,order=None,use_unicode=None,use_latex=None,wrap_line=None,num_columns=None,no_global=False,ip=None,euler=False,forecolor=None,backcolor='Transparent',fontsize='10pt',latex_mode='plain',print_builtin=True,str_printer=None,pretty_printer=None,latex_printer=None,scale=1.0,**settings])
#参数说明:
use_unicode:指定是否使用Unicode字符;为bool/None
######################################################################################################################
输出表达式:sympy.pprint("<expr>"[,<wrap_line>,<num_columns>,<use_unicode>,<full_prec>,<order>,<use_unicode_sqrt_char>,<root_notation>,<mat_symbol_style>,<imaginary_unit>])
#相当于sympy.pretty_print()
#参数说明:
expr:指定要输出的表达式;为str/num/sympy.Rational等
#实例:
>>> x=sympy.Symbol("x")
>>> a=sympy.sqrt(2)
>>> sympy.pprint(a)
√2
>>> print(a)
sqrt(2)
>>> c=(sympy.exp(x)**2)/2
>>> sympy.pprint(c)
2⋅x
ℯ
────
2
>>> print(c)
exp(2*x)/2
2.表达式的转换
(1)化简表达式:
化简表达式:sympy.simplify(<expr>[,ratio=1.7,measure=count_ops,rational=False,inverse=False,doit=True,**kwargs])
#参数说明:
expr:指定原表达式;为sympy.Symbol
ratio:
measure:
rational:
inverse:
doit:
#实例:
>>> sympy.simplify((x+1)**2-(x**2+2*x+1))
0
(2)展开表达式:
展开表达式:sympy.expand(<e>[,**hints])
#参数说明:
e:指定表达式
hints:指定化简规则;为键值对,值为bool/None
#可选项:deep/modulus/power_base/power_exp/mul/log/multinomial/basic/complex/func/trig/frac/numer/denom/modulus/force
#实例:
>>> from sympy.abc import x
>>> expr=(x+1)**2
>>> sympy.pprint(expr)
2
(x + 1)
>>> sympy.pprint(sympy.expand(expr))
2
x + 2⋅x + 1
3.创建对象
(1)创建未知量:
sympy.symbols(<names>[,cls=Symbol,**args])
#参数说明:
name:指定符号名;为str/str list
#对str,有以下语法:
#1.能创建多个符号,彼此使用"...,..."/"... ..."分隔
#2.能创建1个符号序列,使用"...:..."(默认从a/0开始)
#3.能为变量名附加前/后缀,使用"(...)..."/"...(...)"(字母加数字前/后缀时可省略)
#4.支持正则表达式
cls:指定创建的符号类型;为class
seq:是否在仅创建1个符号时也转换为tuple;为bool
integer,real:分别指定是否为int/real;均为bool
#实例:
>>> sympy.symbols("a,b,c d")
(a, b, c, d)
>>> a,b,c,d=sympy.symbols("a,b,c d")
>>> a
a
>>> b
b
>>> c
c
>>> d
d
>>> sympy.symbols(["a","b"])
[a, b]
>>> a,b=sympy.symbols(["a","b"])
>>> a
a
>>> b
b
>>> type(a)
<class 'sympy.core.symbol.Symbol'>
>>> sympy.symbols("a:3")
(a0, a1, a2)
>>> sympy.symbols("a3:6")
(a3, a4, a5)
>>> sympy.symbols("a:d")
(a, b, c, d)
>>> sympy.symbols("a(d:f)")
(ad, ae, af)
>>> sympy.symbols("a(:d)")
(aa, ab, ac, ad)
>>> sympy.symbols("a:c f:h")
(a, b, c, f, g, h)
(2)创建序列:
创建序列:sympy.sequence(<seq>[,limits=None])
#参数说明:
seq:指定序列结构/序列基本单元;为sympy sequence/Expr
limits::指定序列值/基本单元重复次数;为(<i>,<a>,<b>)
#实例:
>>> from sympy import sequence,pprint
>>> from sympy.abc import n
>>> sequence(n**2,(n,0,5))
SeqFormula(n**2, (n, 0, 5))
>>> pprint(sequence(n**2,(n,0,5)))
[0, 1, 4, 9, …]
>>> sequence((1,2,3),(n,0,5))
SeqPer((1, 2, 3), (n, 0, 5))
>>> pprint(sequence((1,2,3),(n,0,5)))
[1, 2, 3, 1, …]
>>> pprint(sequence((1),(n,0,3)))
[1, 1, 1, 1]
4.运算
(1)基本运算:
开平方:sympy.sqrt(<arg>[,evaluate=None])
#参数说明:
arg:指定表达式;为num/sympy.Rational/sympy.Symbol
evaluate:指定是否计算表达式的结果;为bool/None
#为True,则返回表达式的计算结果;为False,则直接返回表达式
#实例:
>>> sympy.sqrt(2)
√2
>>> x=sympy.Symbol("x")
>>> sympy.sqrt(x)
√x
>>> sympy.Mul(x,x)
2
x
>>> sympy.Mul(x,x,evaluate=False)
x⋅x
>>> s=sympy.Rational(1/2)
>>> sympy.sqrt(s)
√2
──
2
>>> sympy.sqrt(s,evaluate=False)
1
──
√2
>>> sympy.sqrt(s,evaluate=True)
√2
──
2
######################################################################################################################
求和:sympy.summation(<f>[,*symbols,**kwargs]):
#注: b
# ____
# \
# summation(f,(i,a,b))= ) f
# /___
# i=a
#参数说明:
f:指定函数;为Expr
symbols:指定求和规则;为(<i>,<a>,<b>)
#可通过使用多个(<i>,<a>,<b>)来进行多重求和
#实例:
>>> from sympy import summation,oo,symbols,log
>>> i,n,m=symbols('i n m',integer=True)
>>> summation(2*i-1,(i,1,n))
n**2
>>> summation(1/2**i,(i,0,oo))
2
>>> summation(1/log(n)**n,(n,2,oo))
Sum(log(n)**(-n), (n, 2, oo))
>>> summation(i,(i,0,n),(n,0,m))
m**3/6 + m**2/2 + m/3
(2)求解方程:
求解方程:sympy.solve(<f>[,*symbols,**flags])
#参数说明:
f:指定方程;为Expr
#注:若<f>仅包含单侧表达式,则求解<f>=0
#Currently supported:
# - polynomial
# - transcendental
# - piecewise combinations of the above
# - systems of linear and polynomial equations
# - systems containing relational expressions
symbols:指定要求解的未知数;为Symbol/Symbol list-like
#实例:
>>> from sympy.abc import x,y,z
>>> sympy.solve(x+y-z-2,[x,y])
[(-y + z + 2, y)]
>>> eq1=sympy.Eq(x+1,4)
>>> sympy.solve(eq1,x)
[3]
######################################################################################################################
在指定范围内求解方程或不等式:sympy.solveset(<f>[,symbol=None,domain=S.Complexes])
#参数说明:
f:指定方程/不等式;为Expr/relational
symbol:指定要求解的未知数;为Symbol/Symbol list-like
domain:指定定义域(解的范围);为Set
#实例:
>>> from sympy.abc import x
>>> sympy.solveset(x**2-1,x,sympy.Interval(0,100))
FiniteSet(1)
(3)微积分相关运算:
求极限:sympy.limit(<e>,<z>,<z0>[,dir="+"])
#参数说明:
e:指定表达式;为Expr
z:指定对哪个变量取极限;为sympy.Symbol
z0:指定变量的极限值;为Expr(包括±oo)
dir:指定求哪侧的极限;为str
#if dir="+-",z->z0/±oo
#if dir="+",z->z0+/-oo
#if dir="-",z->z0-/oo
#实例:
>>> from sympy import limit,sin,oo
>>> from sympy.abc import x
>>> limit(sin(x)/x,x,0)
1
>>> limit(1/x,x,0)
oo
>>> limit(1/x,x,0,dir="-")
-oo
>>> limit(1/x,x,0,dir='+-')
zoo
>>> limit(1/x,x,oo)
0
四.绘图
sympy.plotting是SymPy中用于绘图的子模块,基于Matplotlib构建:
>>> from sympy.plotting import plot
>>> from sympy.abc import x
>>> plot(x**2)#结果见下图
<sympy.plotting.plot.Plot object at 0x0000019220E4DE80>