Python 第三方模块 科学计算 SymPy模块

官方文档: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>

在这里插入图片描述

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值