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,等等。

  1. >>>from sympy import *
  2. >>>a = Rational(1,2)
  3. >>>a
  4. 1/2
  5. >>>a*2
  6. 1
  7. >>>Rational(2)**50/Rational(10)**50
  8. 1/88817841970012523233890533447265625

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

  1. >>>1/2
  2. 0
  3. >>>1.0/2
  4. 0.5

然而你可以:

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

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

特殊的常数

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

  1. >>>pi**2
  2. pi**2
  3. >>>pi.evalf()
  4. 3.14159265358979
  5. >>>(pi+exp(1)).evalf()
  6. 5.85987448204884

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

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

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

Sympy基本使用

定义变量-Symbols函数

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

  1. >>> x = symbols('x')
  2. >>> x + 1
  3. x + 1
  4. >>>x,y,z=symbols('x y z')
  5. >>> crazy = symbols('unrelated')
  6. >>> crazy + 1
  7. unrelated + 1
  8. >>> x = symbols('x')
  9. >>> expr = x + 1
  10. >>> x = 2
  11. >>> print(expr)
  12. x + 1
  13. 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函数

  1. >>> x = symbols('x')
  2. >>> expr = x + 1
  3. >>> expr.subs(x, 2)
  4. 3
  5. >>> from sympy import pi, exp, limit, oo
  6. >>> from sympy.abc import x, y
  7. >>> (1 + x*y).subs(x, pi)
  8. pi*y + 1
  9. >>> (1 + x*y).subs({x:pi, y:2})
  10. 1 + 2*pi
  11. >>> (1 + x*y).subs([(x, pi), (y, 2)])
  12. 1 + 2*pi
  13. >>> reps = [(y, x**2), (x, 2)]
  14. >>> (x + y).subs(reps)
  15. 6
  16. >>> (x + y).subs(reversed(reps))
  17. x**2 + 2
  18. >>> (x**2 + x**4).subs(x**2, y)
  19. y**2 + y
  20. >>> (x**2 + x**4).xreplace({x**2: y})
  21. x**4 + y
  22. >>> (x/y).subs([(x, 0), (y, 0)])
  23. 0
  24. >>> (x/y).subs([(x, 0), (y, 0)], simultaneous=True)
  25. nan
  26. >>> ((x + y)/y).subs({x + y: y, y: x + y})
  27. 1
  28. >>> ((x + y)/y).subs({x + y: y, y: x + y}, simultaneous=True)
  29. y/(x + y)
  30. >>> limit(x**3 - 3*x, x, oo)
  31. oo

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

代数

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

  1. In [1]: 1/( (x+2)*(x+1) )
  2. Out[1]:
  3. 1
  4. ───────────────
  5. (2 + x)*(1 + x)
  6. In [2]: apart(1/( (x+2)*(x+1) ), x)
  7. Out[2]:
  8. 1 1
  9. ───── - ─────
  10. 1 + x 2 + x
  11. In [3]: (x+1)/(x-1)
  12. Out[3]:
  13. -(1 + x)
  14. ────────
  15. 1 - x
  16. In [4]: apart((x+1)/(x-1), x)
  17. Out[4]:
  18. 2
  19. 1 - ─────
  20. 1 - x

代数式的合并

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

  1. In [7]: together(1/x + 1/y + 1/z)
  2. Out[7]:
  3. x*y + x*z + y*z
  4. ───────────────
  5. x*y*z
  6. In [8]: together(apart((x+1)/(x-1), x), x)
  7. Out[8]:
  8. -1 - x
  9. ──────
  10. 1 - x
  11. In [9]: together(apart(1/( (x+2)*(x+1) ), x), x)
  12. Out[9]:
  13. 1
  14. ───────────────
  15. (2 + x)*(1 + x)

微积分

极限

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

  1. >>>from sympy import *
  2. >>>x=Symbol("x")
  3. >>>limit(sin(x)/x, x, 0)
  4. 1
  5. >>>limit(x, x, oo)
  6. oo
  7. >>>limit(1/x, x, oo)
  8. 0
  9. >>>limit(x**x, x, 0)
  10. 1

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

微分

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

  1. >>>from sympy import *
  2. >>>x = Symbol('x')
  3. >>>diff(sin(x), x)
  4. cos(x)
  5. >>>diff(sin(2*x), x)
  6. 2*cos(2*x)
  7. >>>diff(tan(x), x)
  8. 1 + tan(x)**2

可以通过以下验证:

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

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

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

级数展开

函数 series(var, point, order):

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

积分

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

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

初等函数:

  1. >>>integrate(6*x**5, x)
  2. x**6
  3. >>>integrate(sin(x), x)
  4. -cos(x)
  5. >>>integrate(log(x), x)
  6. -x + x*log(x)
  7. >>>integrate(2*x + sinh(x), x)
  8. cosh(x) + x**2

特殊函数:

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

定积分:

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

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

  1. >>>integrate(exp(-x), (x, 0, oo))
  2. 1
  3. >>>integrate(log(x), (x, 0, 1))
  4. -1

复数

  1. >>>from sympy import Symbol, exp, I
  2. >>>x = Symbol("x")
  3. >>>exp(I*x).expand()
  4. exp(I*x)
  5. >>>exp(I*x).expand(complex=True)
  6. I*exp(-im(x))*sin(re(x)) + cos(re(x))*exp(-im(x))
  7. >>>x = Symbol("x", real=True)
  8. >>>exp(I*x).expand(complex=True)
  9. I*sin(x) + cos(x)

函数

三角函数::

  1. In [1]: sin(x+y).expand(trig=True)
  2. Out[1]: cos(x)*sin(y) + cos(y)*sin(x)
  3. In [2]: cos(x+y).expand(trig=True)
  4. Out[2]: cos(x)*cos(y) - sin(x)*sin(y)
  5. In [3]: sin(I*x)
  6. Out[3]: I*sinh(x)
  7. In [4]: sinh(I*x)
  8. Out[4]: I*sin(x)
  9. In [5]: asinh(I)
  10. Out[5]:
  11. π*I
  12. ───
  13. 2
  14. In [6]: asinh(I*x)
  15. Out[6]: I*asin(x)
  16. In [15]: sin(x).series(x, 0, 10)
  17. Out[15]:
  18. 3 5 7 9
  19. x x x x
  20. x - ── + ─── - ──── + ────── + O(x**10)
  21. 6 120 5040 362880
  22. In [16]: sinh(x).series(x, 0, 10)
  23. Out[16]:
  24. 3 5 7 9
  25. x x x x
  26. x + ── + ─── + ──── + ────── + O(x**10)
  27. 6 120 5040 362880
  28. In [17]: asin(x).series(x, 0, 10)
  29. Out[17]:
  30. 3 5 7 9
  31. x 3*x 5*x 35*x
  32. x + ── + ──── + ──── + ───── + O(x**10)
  33. 6 40 112 1152
  34. In [18]: asinh(x).series(x, 0, 10)
  35. Out[18]:
  36. 3 5 7 9
  37. x 3*x 5*x 35*x
  38. x - ── + ──── - ──── + ───── + O(x**10)
  39. 6 40 112 1152

球谐函数:

  1. In [1]: from sympy.abc import theta, phi
  2. In [2]: Ylm(1, 0, theta, phi)
  3. Out[2]:
  4. ————
  5. ╲╱ 3 *cos(θ)
  6. ────────────
  7. ——
  8. 2*╲╱ π
  9. In [3]: Ylm(1, 1, theta, phi)
  10. Out[3]:
  11. —— I
  12. -╲╱ 6 *│sin(θ)│*ℯ
  13. ────────────────────
  14. ——
  15. 4*╲╱ π
  16. In [4]: Ylm(2, 1, theta, phi)
  17. Out[4]:
  18. ——— I
  19. -╲╱ 30 *│sin(θ)│*cos(θ)*ℯ
  20. ────────────────────────────
  21. ——
  22. 4*╲╱ π

阶乘和伽玛函数:

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

Zeta函数:

  1. In [18]: zeta(4, x)
  2. Out[18]: ζ(4, x)
  3. In [19]: zeta(4, 1)
  4. Out[19]:
  5. 4
  6. π
  7. ──
  8. 90
  9. In [20]: zeta(4, 2)
  10. Out[20]:
  11. 4
  12. π
  13. -1 + ──
  14. 90
  15. In [21]: zeta(4, 3)
  16. Out[21]:
  17. 4
  18. 17 π
  19. - ── + ──
  20. 16 90

多项式

  1. In [1]: chebyshevt(2, x)
  2. Out[1]:
  3. 2
  4. -1 + 2*x
  5. In [2]: chebyshevt(4, x)
  6. Out[2]:
  7. 2 4
  8. 1 - 8*x + 8*x
  9. In [3]: legendre(2, x)
  10. Out[3]:
  11. 2
  12. 3*x
  13. -1/2 + ────
  14. 2
  15. In [4]: legendre(8, x)
  16. Out[4]:
  17. 2 4 6 8
  18. 35 315*x 3465*x 3003*x 6435*x
  19. ─── - ────── + ─────── - ─────── + ───────
  20. 128 32 64 32 128
  21. In [5]: assoc_legendre(2, 1, x)
  22. Out[5]:
  23. —————
  24. 2
  25. -3*x*╲╱ 1 - x
  26. In [6]: assoc_legendre(2, 2, x)
  27. Out[6]:
  28. 2
  29. 3 - 3*x
  30. In [7]: hermite(3, x)
  31. Out[7]:
  32. 3
  33. -12*x + 8*x

微分方程

在isympy中:

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

代数方程

在isympy中:

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

线性代数

矩阵

矩阵由矩阵类创立建:

  1. >>>from sympy import Matrix
  2. >>>Matrix([[1,0], [0,1]])
  3. [1, 0]
  4. [0, 1]

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

  1. >>>x = Symbol('x')
  2. >>>y = Symbol('y')
  3. >>>A = Matrix([[1,x], [y,1]])
  4. >>>A
  5. [1, x]
  6. [y, 1]
  7. >>>A**2
  8. [1 + x*y, 2*x]
  9. [ 2*y, 1 + x*y]

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

系数匹配

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

  1. >>>from sympy import *
  2. >>>x = Symbol('x')
  3. >>>p = Wild('p')
  4. >>>(5*x**2).match(p*x**2)
  5. {p_: 5}
  6. >>>q = Wild('q')
  7. >>>(x**2).match(p*x**q)
  8. {p_: 1, q_: 2}

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

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

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

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

打印输出

标准

str(expression)返回如下:

  1. >>>from sympy import Integral
  2. >>>from sympy.abc import x
  3. >>>print x**2
  4. x**2
  5. >>>print 1/x
  6. 1/x
  7. >>>print Integral(x**2, x)
  8. Integral(x**2, x)

Pretty Printing

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

  1. >>>from sympy import Integral, pprint
  2. >>>from sympy.abc import x
  3. >>>pprint(x**2) #doctest: +NORMALIZE_WHITESPACE
  4. 2
  5. x
  6. >>>pprint(1/x)
  7. 1
  8. -
  9. x
  10. >>>pprint(Integral(x**2, x))
  11. /
  12. |
  13. | 2
  14. | x dx
  15. |
  16. /

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

  1. $ python
  2. Python 2.5.2 (r252:60911, Jun 25 2008, 17:58:32)
  3. [GCC 4.3.1] on linux2
  4. Type "help", "copyright", "credits" or "license" for more information.
  5. >>> from sympy import *
  6. >>> import sys
  7. >>> sys.displayhook = pprint
  8. >>> var("x")
  9. x
  10. >>> x**3/3
  11. 3
  12. x
  13. --
  14. 3
  15. >>> Integral(x**2, x) #doctest: +NORMALIZE_WHITESPACE
  16. /
  17. |
  18. | 2
  19. | x dx
  20. |
  21. /

Python printing

  1. >>>from sympy.printing.python import python
  2. >>>from sympy import Integral
  3. >>>from sympy.abc import x
  4. >>>print python(x**2)
  5. x = Symbol('x')
  6. e = x**2
  7. >>>print python(1/x)
  8. x = Symbol('x')
  9. e = 1/x
  10. >>>print python(Integral(x**2, x))
  11. x = Symbol('x')
  12. e = Integral(x**2, x)

LaTeX printing

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

MathML

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

Pyglet

  1. >>>from sympy import Integral, preview
  2. >>>from sympy.abc import x
  3. >>>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程序是必须的。

相关链接

sympy科学计算器的更多相关文章

  1. 科学计算器的Java实现

    简易的科学计算器的实现 ---Java版 import javax.swing.*;//新的窗口组件包 import java.awt.*; import java.awt.event.*; publ ...

  2. 想找个计算器当本命?来试试UWP应用《纸书科学计算器》

    久违了.上次在博客园发文还是4年前,正是高中参加NOIP的时候.这4年里发生了很多事,乃至再次看到过去的文章时,仿佛看到了自己也不熟悉的风景.最近很想把我的博客重新拾起来,慢慢灌溉,写一些微不足道的技 ...

  3. 整理一些《纸书科学计算器》的小Tips

    本文最开始是在2016年的文章 Win10应用<纸书科学计算器>更新啦! 发表之后撰写的,当时那篇文章收到了不少人点赞,应用在国内市场的日下载量也突然上涨,让我感到受宠若惊,这里要感谢Wp ...

  4. Win10应用《纸书科学计算器》更新啦!

    <纸书科学计算器>在2016年8月拿了计算机设计大赛国家一等奖,现在仍记得我在答辩时还给评委们普及了一波UWP平台的知识.受此鼓励,这款应用也不会停下更新的脚步^_^.最近从1.9小幅升级 ...

  5. html+css+js实现科学计算器

    代码地址如下:http://www.demodashi.com/demo/13751.html 项目描述 纯html+css+js实现一个科学计算器,支持平方开方指数对数等基本函数,支持键盘输入,有简 ...

  6. 《学习R》笔记:科学计算器、检查变量和工作区、向量、矩阵和数组、列表和数据框

    一.第二章 科学计算器 要检查两个数字是否一样,要使用 all.equal() ,不要使用 == ,== 符号仅用于比较两个整型数是否存在相同 . > all.equal(sqrt(2)^2,2 ...

  7. 数据结构之栈—强大的四则复杂运算计算器(超过windows自带的科学计算器)【中缀转后缀表达式】

    比windows自带计算器还强的四则复杂运算计算器! 实测随机打出两组复杂算式:-7.5 * 6 / ( -2 + ( -6.5 -  -5.22 ) )与7.5+-3*8/(7+2) windows ...

  8. JS编写的科学计算器

    最近半个月编写了一个JS+CSS+HTML的网页计算器,从最初的具有简陋界面的简单计算器改版到最终具有科学/标准计算器转换功能并且界面非常友好的计算器,收获良多!总的来说,代码简单,通俗易读,下面贴上 ...

  9. JavaScript实现科学计算器

    运行效果: 可实现科学计算器的功能,如:PI,sin,cos,tan等 源代码: 1 <!DOCTYPE html> 2 <html lang="zh"> ...

随机推荐

  1. 关于loadrunner使用web_add_header添加HTTP信息头(比如Content-Type,token等)和使用

    关于loadrunner使用web_add_header添加HTTP信息头(比如Content-Type,token等)和使用 1.web_add_header添加HTTP信息头(比如Content- ...

  2. PAT1058:A+B in Hogwarts

    1058. A+B in Hogwarts (20) 时间限制 50 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue If you ...

  3. float的范围和有效位

    首先说一下: 范围是3.4E-38 ——3.4E+38,可提供7位有效数字. 上述这两个量都是近似值,各个编译器不太一样的. 下面我就将标准值是怎么定义的,和你说一下: 这个比较复杂,建议你找一下IE ...

  4. Linux时间子系统之七:定时器的应用--msleep(),hrtimer_nanosleep()

    我们已经在前面几章介绍了低分辨率定时器和高精度定时器的实现原理,内核为了方便其它子系统,在时间子系统中提供了一些用于延时或调度的API,例如msleep,hrtimer_nanosleep等等,这些A ...

  5. 解决Ubuntu系统下的VMware Workstation无法打开虚拟网络编辑器界面的问题

    本文由荒原之梦原创,原文链接:http://zhaokaifeng.com/?p=630 操作环境: Ubuntu 17 VMware 14 pro for Linux 问题描述: 我在Ubuntu ...

  6. 在Windows下同时安装Python2.x和Python3.x

    前言: Python现在是两个版本共存,Python2.x和Python3.x都同时在更新.但是Python2.x和Python3.x的区别还是很多的(以后我可能会写一篇文章列举一下Python2.x ...

  7. 简历HTML网页版

    <!DOCTYPE html><html> <head> <meta charset="utf-8" /> <title> ...

  8. app后端设计(6)-- LBS

    在LBS的应用中,一个基本的需求是查找附近的用户,现在有两种做法: 1. 使用mysql的空间数据库,具体做法参考:http://blog.sina.com.cn/s/blog_a48af8c0010 ...

  9. Python3 模拟登录知乎(requests)

    # -*- coding: utf-8 -*- """ 知乎登录分为两种登录 一是手机登录 API : https://www.zhihu.com/login/phone ...

  10. Linux用户和组管理,添加修改用户,添加修改组,加入组,移除组

    1.安全介绍3A Authentication: 认证,用户名和对应口令 Authorization: 授权,不同用户权限不同 Accouting/Audition: 审计 2. 所属者和所属组 us ...