Sympy:Getting started


简介

  • SymPy是一个符号计算的Python库。它的目标是成为一个全功能的计算机代数系统,同时保持代码简 洁、易于理解和扩展。它完全由Python写成,不依赖于外部库。SymPy支持符号计算、高精度计算、模式匹配、绘图、解方程、微积分、组合数学、离散 数学、几何学、概率与统计、物理学等方面的功能。

安装及导入

  • 使用命令行执行conda install sympypip install sympy即可
  • 以下示例代码事先均已from sympy import *

基本数值类型

实数、有理数和整数

  • SymPy有三个内建的数值类型:实数,有理数和整数。有理数类用两个整数来表示一个有理数,分子与分母,如sympy.Rational(1, 2)代表1/2

特殊的常数

  • 我们也可以有一些特殊的常数,像epi,它们会被当作符号去对待。(1+pi不会求得值,反而它会保持为1+pi),若要求出表达式的浮点值,可以使用evalf()函数,如下:
>>> pi**2
pi**2
>>> pi.evalf()
3.14159265358979
>>> (pi+exp(1)).evalf()
5.85987448204884
  • 如果对浮点数计算有确切的精度要求,或者要用于精确的数值计算,可用如下方法:
>>> (1/x).evalf(subs={x: 3.0}, n=21)
0.333333333333333333333

subs表示用数值替换变量进行计算,n指示小数位数。

无穷大

  • 有一个无穷大的类型oo
>>> oo + 1
oo
>>> print(oo > 99999)
True

定义变量与表达式

  • symbols()函数用以定义变量,之后可以再定义表达式
>>> eg = symbols('x')
>>> eg + 1
x + 1
>>> z = symbols('z')
>>> expr = z**2 + 1
>>> print(expr)
z**2 + 1
  • 也可以在定义变量的时候指定变量类型
>>> x = Symbol("x", real=True)
>>> y = Symbol("y", integer=True)
>>> z = Symbol("x", complex=True)
· 后面实例代码中所用的变量均需先定义好。

变量替换函数subs()

  • 调用方式为subs(*args, **kwargs)
>>> x = symbols('x')
>>> expr = x + 1
>>> expr.subs(x, 2)
3
>>> expr.subs(x, pi)
pi + 1
>>> (1 + x*y).subs({x:1, y:2})
3
>>> (1 + x*y).subs([(x, 1), (y, 2)])
3
>>> reps = [(x, 1), (y, 2)]
>>> (1 + x*y).subs(reps)
3

复数

使用sympy.I

>>> x = Symbol("x")
>>> exp(I*x).expand()
exp(I*x)
>>> exp(I*x).expand(complex=True)
I*exp(-im(x))*sin(re(x)) + cos(re(x))*exp(-im(x))
>>> x = Symbol("x", real=True)
>>> exp(I*x).expand(complex=True)
I*sin(x) + cos(x)

函数

支持初等函数、阶乘fractorial(x)、伽玛函数、Zeta函数

多项式

  • PASS

代数式展开,apart(expr, x)

>>> 1/((x+2)*(x+1))
      1
───────────────
(2 + x)*(1 + x)
>>> apart(1/((x+2)*(x+1)), x)
  1       1
───── - ─────
1 + x   2 + x

代数式的合并,together(expr, x)

>>> together((1/(1+x) - 1/(2+x)), x)
1/((x + 1)*(x + 2))

微积分

极限

使用limit( f(x), x, p),即计算x -> pf(x)的极限。

>>> limit(sin(x)/x, x, 0)
1
>>> limit(1/x, x, oo)
0
  • 求导,使用diff(f(x), x, n)即求f(x)n阶导数
>>> diff(sin(2*x), x, 1)
2 * cos(2*x)
>>> diff(sin(2*x), x, 2)
-4 * sin(2*x)

级数展开

使用series(var, point, order)

>>> cos(x).series(x, 0, 10)
1 - x**2/2 + x**4/24 - x**6/720 + x**8/40320 + O(x**10)

积分

sympy支持不定积分、超越函数与特殊函数的定积分,使用integrate(f(x), x)求不定积分,使用integrate(f(x), (x, a, b))求定积分:

>>> integrate(6*x**5, x)
x**6
>>> integrate(exp(-x**2)*erf(x), x)
pi**(1/2)*erf(x)**2/4
>>> integrate(sin(x), (x, 0, pi/2))
1
>>> integrate(exp(-x), (x, 0, oo))
1
>>> integrate(log(x), (x, 0, 1))
-1

微分方程

  • pass

代数方程

  • pass

线性代数

矩阵

矩阵由矩阵类创建,既可以是数值矩阵,也可以是代数矩阵

>>> from sympy import Matrix
>>> Matrix([[1,0], [0,1]])
[1, 0]
[0, 1]
>>> Matrix([[1, x], [y, 1]])
[1, x]
[y, 1]

系数匹配

使用 match()方法,引用Wild类,来执行表达式的匹配。该方法会返回一个字典。

>>> x = Symbol(‘x‘)
>>> p = Wild(‘p‘)
>>> (5*x**2).match(p*x**2)
{p_: 5}
>>> q = Wild(‘q‘)
>>> (x**2).match(p*x**q)
{p_: 1, q_: 2}

打印输出

标准

print()pprint()

>>> print(1/((x+2)*(x+1)))
1/((x + 2)*(x + 1))
>>> pprint(1/((x+2)*(x+1)))
      1
───────────────
(2 + x)*(1 + x)

LaTex、MathML

>>> from sympy import Integral, latex
>>> pprint(latex(Integral(x**2, x)))
\int x^{2}\, dx
>>> print(mathml(x**2))
'x2'

你可能感兴趣的:(Sympy:Getting started)