• sympy科学计算器


    SymPy库常用函数

    简介

    本文抄于https://www.cnblogs.com/baby123/p/6296629.html

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

    更多内容请查看本人个人博客:https://huiyang865.github.io/2016/08/27/sympy/

    Sympy安装方法

    安装命令:pip install sympy

    基本数值类型

    实数,有理数和整数

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

    >>>from sympy import *
    >>>a = Rational(1,2)
    >>>a
    1/2
    >>>a*2
    1
    >>>Rational(2)**50/Rational(10)**50
    1/88817841970012523233890533447265625
    

    当利用Python的整数计算时要注意一下,Python只会截取除法的整数部分:

    >>>1/2
    0
    >>>1.0/2
    0.5
    

    然而你可以:

    >>>from __future__ import division
    >>>1/2 #doctest: +SKIP
    0.5
    

    正确的除法在python3k和isympy中这样做,是标准的。

    特殊的常数

    我们也可以有一些特殊的常数,像e和pi,它们会被当作符号去对待。(1+pi不会求得值,反而它会保持为1+pi),例如:

    >>>pi**2
    pi**2
    >>>pi.evalf()
    3.14159265358979
    >>>(pi+exp(1)).evalf()
    5.85987448204884
    

    求表达式的浮点数-evalf()函数

    正如你看到的,evalf()函数可以用求出表达式的浮点数。
    有一个无穷大的类型,被成为oo:

    >>>oo > 99999
    True
    >>>oo + 1
    oo
    If the substitution will be followed by numerical evaluation, it is better to pass the substitution to evalf as
    >>> (1/x).evalf(subs={x: 3.0}, n=21)
    0.333333333333333333333
    rather than
    >>> (1/x).subs({x: 3.0}).evalf(21)
    0.333333333333333314830
    

    Sympy基本使用

    定义变量-Symbols函数

    对比与其他的计算机代数系统,在SymPy中要明确声明符号变量:

    >>> x = symbols('x')
    >>> x + 1
    x + 1
    >>>x,y,z=symbols('x y z')
    >>> crazy = symbols('unrelated')
    >>> crazy + 1
    unrelated + 1
    >>> x = symbols('x')
    >>> expr = x + 1
    >>> x = 2
    >>> print(expr)
    x + 1
    Changing x to 2 had no effect on expr. This is because x = 2 changes the Python variable x to 2, but has no effect on the SymPy Symbol x, which was what we used in creating expr.
    

    变量替换subs函数

    >>> x = symbols('x')
    >>> expr = x + 1
    >>> expr.subs(x, 2)
    3
    >>> from sympy import pi, exp, limit, oo
    >>> from sympy.abc import x, y
    >>> (1 + x*y).subs(x, pi)
    pi*y + 1
    >>> (1 + x*y).subs({x:pi, y:2})
    1 + 2*pi
    >>> (1 + x*y).subs([(x, pi), (y, 2)])
    1 + 2*pi
    >>> reps = [(y, x**2), (x, 2)]
    >>> (x + y).subs(reps)
    6
    >>> (x + y).subs(reversed(reps))
    x**2 + 2
    >>> (x**2 + x**4).subs(x**2, y)
    y**2 + y
    >>> (x**2 + x**4).xreplace({x**2: y})
    x**4 + y
    >>> (x/y).subs([(x, 0), (y, 0)])
    0
    >>> (x/y).subs([(x, 0), (y, 0)], simultaneous=True)
    nan
    >>> ((x + y)/y).subs({x + y: y, y: x + y})
    1
    >>> ((x + y)/y).subs({x + y: y, y: x + y}, simultaneous=True)
    y/(x + y)
    >>> limit(x**3 - 3*x, x, oo)
    oo
    

    调用方式:[subs(*args, **kwargs)]

    代数

    局部的代数式展开,使用apart(expr, x):

    In [1]: 1/( (x+2)*(x+1) )
    Out[1]:
           1
    ───────────────
    (2 + x)*(1 + x)
    In [2]: apart(1/( (x+2)*(x+1) ), x)
    Out[2]:
      1       1
    ───── - ─────
    1 + x   2 + x
    In [3]: (x+1)/(x-1)
    Out[3]:
    -(1 + x)
    ────────
      1 - x
    In [4]: apart((x+1)/(x-1), x)
    Out[4]:
          2
    1 - ─────
        1 - x
    

    代数式的合并

    (相当于展开的逆运算),使用together(expr, x):

    In [7]: together(1/x + 1/y + 1/z)
    Out[7]:
    x*y + x*z + y*z
    ───────────────
        x*y*z
    In [8]: together(apart((x+1)/(x-1), x), x)
    Out[8]:
    -1 - x
    ──────
    1 - x
    In [9]: together(apart(1/( (x+2)*(x+1) ), x), x)
    Out[9]:
          1
    ───────────────
    (2 + x)*(1 + x)
    

    微积分

    极限

    在sympy中极限容易求出,它们遵循极限语法 limit(function, variable, point) ,所以计算x->0时f(x)的极限,即limit(f, x, 0):

    >>>from sympy import *
    >>>x=Symbol("x")
    >>>limit(sin(x)/x, x, 0)
    1
    >>>limit(x, x, oo)
    oo
    >>>limit(1/x, x, oo)
    0
    >>>limit(x**x, x, 0)
    1
    

    有一些特殊的极限的例子,可以阅读文件test_demidovich.py

    微分

    可以对任意SymPy表达式微分。diff(func, var)。例如:

    >>>from sympy import *
    >>>x = Symbol('x')
    >>>diff(sin(x), x)
    cos(x)
    >>>diff(sin(2*x), x)
    2*cos(2*x)
    >>>diff(tan(x), x)
    1 + tan(x)**2
    

    可以通过以下验证:

    >>>limit((tan(x+y)-tan(x))/y, y, 0)
    1 + tan(x)**2
    

    计算高阶微分 diff(func, var, n) :

    >>>diff(sin(2*x), x, 1)
    2*cos(2*x)
    >>>diff(sin(2*x), x, 2)
    -4*sin(2*x)
    >>>diff(sin(2*x), x, 3)
    -8*cos(2*x)
    

    级数展开

    函数 series(var, point, order):

    >>>from sympy import *
    >>>x = Symbol('x')
    >>>cos(x).series(x, 0, 10)
    1 - x**2/2 + x**4/24 - x**6/720 + x**8/40320 + O(x**10)
    >>>(1/cos(x)).series(x, 0, 10)
    1 + x**2/2 + 5*x**4/24 + 61*x**6/720 + 277*x**8/8064 + O(x**10)
    

    积分

    SymPy支持不定积分,超越函数与特殊函数的定积分。SymPy有力的扩展Risch-Norman 算法和模型匹配算法。

    >>>from sympy import *
    >>>x, y = symbols('xy')
    

    初等函数:

    >>>integrate(6*x**5, x)
    x**6
    >>>integrate(sin(x), x)
    -cos(x)
    >>>integrate(log(x), x)
    -x + x*log(x)
    >>>integrate(2*x + sinh(x), x)
    cosh(x) + x**2
    

    特殊函数:

    >>>integrate(exp(-x**2)*erf(x), x)
    pi**(1/2)*erf(x)**2/4
    

    定积分:

    >>>integrate(x**3, (x, -1, 1))
    0
    >>integrate(sin(x), (x, 0, pi/2))
    1
    >>>integrate(cos(x), (x, -pi/2, pi/2))
    2
    

    一些广义积分也可以被支持:

    >>>integrate(exp(-x), (x, 0, oo))
    1
    >>>integrate(log(x), (x, 0, 1))
    -1
    

    复数

    >>>from sympy import Symbol, exp, 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)
    

    函数

    三角函数::

    In [1]: sin(x+y).expand(trig=True)
    Out[1]: cos(x)*sin(y) + cos(y)*sin(x)
    In [2]: cos(x+y).expand(trig=True)
    Out[2]: cos(x)*cos(y) - sin(x)*sin(y)
    In [3]: sin(I*x)
    Out[3]: I*sinh(x)
    In [4]: sinh(I*x)
    Out[4]: I*sin(x)
    In [5]: asinh(I)
    Out[5]:
    π*I
    ───
     2
    In [6]: asinh(I*x)
    Out[6]: I*asin(x)
    In [15]: sin(x).series(x, 0, 10)
    Out[15]:
         3     5     7       9
        x     x     x       x
    x - ── + ─── - ──── + ────── + O(x**10)
        6    120   5040   362880
    In [16]: sinh(x).series(x, 0, 10)
    Out[16]:
         3     5     7       9
        x     x     x       x
    x + ── + ─── + ──── + ────── + O(x**10)
        6    120   5040   362880
    In [17]: asin(x).series(x, 0, 10)
    Out[17]:
         3      5      7       9
        x    3*x    5*x    35*x
    x + ── + ──── + ──── + ───── + O(x**10)
        6     40    112     1152
    In [18]: asinh(x).series(x, 0, 10)
    Out[18]:
         3      5      7       9
        x    3*x    5*x    35*x
    x - ── + ──── - ──── + ───── + O(x**10)
        6     40    112     1152
    

    球谐函数:

    In [1]: from sympy.abc import theta, phi
    In [2]: Ylm(1, 0, theta, phi)
    Out[2]:
         ————
    ╲╱ 3 *cos(θ)
    ────────────
            ——
      2*╲╱ π
    In [3]: Ylm(1, 1, theta, phi)
    Out[3]:
        ——            I*φ
    -╲╱ 6   *│sin(θ)│*ℯ
    ────────────────────
               ——
          4*╲╱ π
    In [4]: Ylm(2, 1, theta, phi)
    Out[4]:
       ———                  I*φ
    -╲╱ 30  *│sin(θ)│*cos(θ)*ℯ
    ────────────────────────────
                    ——
              4*╲╱ π
    

    阶乘和伽玛函数:

    In [1]: x = Symbol("x")
    In [2]: y = Symbol("y", integer=True)
    In [3]: factorial(x)
    Out[3]: Γ(1 + x)
    In [4]: factorial(y)
    Out[4]: y!
    In [5]: factorial(x).series(x, 0, 3)
    Out[5]:
                        2           2    2  2
                       x *EulerGamma    π *x
    1 - x*EulerGamma + ────────────── + ───── + O(x**3)
                             2            12
    

    Zeta函数:

    In [18]: zeta(4, x)
    Out[18]: ζ(4, x)
    In [19]: zeta(4, 1)
    Out[19]:
      4
    π
    ──
    90
    In [20]: zeta(4, 2)
    Out[20]:
           4
         π
    -1 + ──
         90
    In [21]: zeta(4, 3)
    Out[21]:
             4
      17   π
    - ── + ──
      16   90
    

    多项式

    In [1]: chebyshevt(2, x)
    Out[1]:
            2
    -1 + 2*x
    In [2]: chebyshevt(4, x)
    Out[2]:
           2      4
    1 - 8*x  + 8*x
    In [3]: legendre(2, x)
    Out[3]:
              2
           3*x
    -1/2 + ────
           2
    In [4]: legendre(8, x)
    Out[4]:
              2         4         6         8
    35   315*x    3465*x    3003*x    6435*x
    ─── - ────── + ─────── - ─────── + ───────
    128     32        64        32       128
    In [5]: assoc_legendre(2, 1, x)
    Out[5]:
                —————
             ╱     2
    -3*x*╲╱  1 - x
    In [6]: assoc_legendre(2, 2, x)
    Out[6]:
          2
    3 - 3*x
    In [7]: hermite(3, x)
    Out[7]:
               3
    -12*x + 8*x
    

    微分方程

    在isympy中:

    In [4]: f(x).diff(x, x) + f(x)     #注意在使用输入该命令之前,一定要声明f=Function('f')
    Out[4]:
      2
     d
    ─────(f(x)) + f(x)
    dx dx
    In [5]: dsolve(f(x).diff(x, x) + f(x), f(x))
    Out[5]: C₁*sin(x) + C₂*cos(x)
    

    代数方程

    在isympy中:

    In [7]: solve(x**4 - 1, x)
    Out[7]: [i, 1, -1, -i]
    In [8]: solve([x + 5*y - 2, -3*x + 6*y - 15], [x, y])
    Out[8]: {y: 1, x: -3}
    

    线性代数

    矩阵

    矩阵由矩阵类创立建:

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

    不只是数值矩阵,亦可为代数矩阵,即矩阵中存在符号:

    >>>x = Symbol('x')
    >>>y = Symbol('y')
    >>>A = Matrix([[1,x], [y,1]])
    >>>A
    [1, x]
    [y, 1]
    >>>A**2
    [1 + x*y,     2*x]
    [    2*y, 1 + x*y]
    

    关于矩阵更多的例子,请看线性代数教程。

    系数匹配

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

    >>>from sympy import *
    >>>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}
    

    如果匹配不成功,则返回None:

    >>>print (x+1).match(p**x)
    None
    

    可以使用Wild类的‘exclude’参数(排除参数),排除不需要和无意义的匹配结果,来保证结论中的显示是唯一的:

    >>>x = Symbol('x')
    >>>p = Wild('p', exclude=[1,x])
    >>>print (x+1).match(x+p) # 1 is excluded
    None
    >>>print (x+1).match(p+1) # x is excluded
    None
    >>>print (x+1).match(x+2+p) # -1 is not excluded
    {p_: -1}
    

    打印输出

    标准

    str(expression)返回如下:

    >>>from sympy import Integral
    >>>from sympy.abc import x
    >>>print x**2
    x**2
    >>>print 1/x
    1/x
    >>>print Integral(x**2, x)
    Integral(x**2, x)
    

    Pretty Printing

    用pprint函数可以输出不错的ascii艺术:

    >>>from sympy import Integral, pprint
    >>>from sympy.abc import x
    >>>pprint(x**2) #doctest: +NORMALIZE_WHITESPACE
    2
    x
    >>>pprint(1/x)
    1
    -
    x
    >>>pprint(Integral(x**2, x))
     /
    |
    |  2
    | x  dx
    |
    /
    

    [Pretty PrintingWiki]
    提示:在python解释器中,为使pretty printing为默认输出,使用:

    $ python
    Python 2.5.2 (r252:60911, Jun 25 2008, 17:58:32)
    [GCC 4.3.1] on linux2
    Type "help", "copyright", "credits" or "license" for more information.
    >>> from sympy import *
    >>> import sys
    >>> sys.displayhook = pprint
    >>> var("x")
    x
    >>> x**3/3
    3
    x
    --
    3
    >>> Integral(x**2, x) #doctest: +NORMALIZE_WHITESPACE
    /
    |
    |  2
    | x  dx
    |
    /
    

    Python printing

    >>>from sympy.printing.python import python
    >>>from sympy import Integral
    >>>from sympy.abc import x
    >>>print python(x**2)
    x = Symbol('x')
    e = x**2
    >>>print python(1/x)
    x = Symbol('x')
    e = 1/x
    >>>print python(Integral(x**2, x))
    x = Symbol('x')
    e = Integral(x**2, x)
    

    LaTeX printing

    >>>from sympy import Integral, latex
    >>>from sympy.abc import x
    >>>latex(x**2)
    $x^{2}$
    >>>latex(1/x)
    $frac{1}{x}$
    >>>latex(Integral(x**2, x))
    $int x^{2}\,dx$
    

    MathML

    >>>from sympy.printing.mathml import mathml
    >>>from sympy import Integral, latex
    >>>from sympy.abc import x
    >>>print mathml(x**2)
    <apply><power/><ci>x</ci><cn>2</cn></apply>
    >>>print mathml(1/x)
    <apply><power/><ci>x</ci><cn>-1</cn></apply>
    

    Pyglet

    >>>from sympy import Integral, preview
    >>>from sympy.abc import x
    >>>preview(Integral(x**2, x)) #doctest:+SKIP
    
    注解

    Isympy默认调用pprint,所以这就是为什么看到pretty printing为默认的。

    有一个打印的有效模块,sympy.printing。用这个模块实现其他的打印:

    • pretty(expr), pretty_print(expr), pprint(expr): 分别返回或者输出,,表达式的漂亮描述。这是相同
    • latex(expr), print_latex(expr):分别返回或者输出,LaTex描写的表达式
    • mathml(expr), print_mathml(expr):分别返回或者输出,MathML描写的表达式
    • print_gtk(expr): 表达式打印到Gtkmathview , 这是一个GTK小配件显示MathML代码。Gtkmathview程序是必须的。

    相关链接

  • 相关阅读:
    概率期望小记
    洛谷P5591 小猪佩奇学数学【单位根反演】
    EasyUI取消树节点选中
    EasyUI获取正在编辑状态行的索引
    js判断是否是大小写,数字等方法
    ElasticSearch部署问题
    全文检索ES 服务启动和关闭
    文件异步上传
    js控制时间显示格式
    SpringMVC 多视图解析器 跳转问题
  • 原文地址:https://www.cnblogs.com/3daytears/p/9236175.html
Copyright © 2020-2023  润新知