http://blog.csdn.net/pipisorry/article/details/39123247

SymPy是Python的一个数学符号计算库,目的在于成为一个富有特色的计算机代数系统。

Sympy基本概念

安装

pip install sympy

SymPy的下载(Downloads)网页

内建的数字类型

SymPy有三个内建的数值类型:实数,有理数和整数。

有理数:Rational(1,2)

有理数类用两个整数来表示分子与分母,Rational(1,2)代表1/2等等。

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

特殊的常数:e pi

有一些特殊的常数像e、pi和无穷大oo,它们会被当作符号去对待。(1+pi不会求得值,反而它会保持为1+pi)。调用求表达式的浮点数-evalf()函数才会求值。

示例:

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

>>>oo > 99999

True

>>>oo + 1

oo

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

最好将x替换操作传到evalf参数里。If the substitution will be followed by numerical evaluation, it is better to pass the substitution to evalf.

>>> (1/x).evalf(subs={x: 3.0}, n=21)
0.333333333333333333333
rather than
>>> (1/x).subs({x: 3.0}).evalf(21)
0.333333333333333314830

皮皮blog

Sympy基本使用

定义变量函数-Symbols

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

x=Symbol("x")
x = symbols('x')
x,y,z=symbols('x y z')
crazy = symbols('unrelated')

k, m, n = symbols(‘kmn’, integer=True)

from sympy.abc import x, y    #应该是定义好的

f = Function(“f”)

示例:

>>> x = symbols('x')
>>> x + 1
x + 1
>>>x,y,z=symbols('x y z')
>>> crazy = symbols('unrelated')
>>> crazy + 1
unrelated + 1

>>>x+y+x-y
2*x
>>> x = symbols('x')
>>> expr = x + 1
>>> x = 2 #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.
>>> print(expr)
x + 1

变量展开expand()

((x+y)**2).expand()

2*x*y + x**2 + y**2

变量替换函数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

simultaneous参数用法
>>> (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)

[subs(*args, **kwargs)]

示例

from sympy import symbols
cnt1turn = 3000 / 100
xy1 = (1 * cnt1turn, 100)
xy2 = (30 * cnt1turn, 10)

x = symbols('x')

k1000 = round((xy1[1] - xy2[1]) / (xy1[0] - xy2[0]), 4)
y1000 = k1000 * (x - xy1[0]) + xy1[1]
print(y1000)

103.102 - 0.1034*x

代数

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

示例:

In [1]: 1/( (x+2)*(x+1) )
       1
───────────────
(2 + x)*(1 + x)

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

In [3]: (x+1)/(x-1)
-(1 + x)
────────
 1 - x

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

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

(相当于展开的逆运算)

In [7]: together(1/x + 1/y + 1/z)
x*y + x*z + y*z
───────────────
     x*y*z

In [8]: together(apart((x+1)/(x-1), x), x)
-1 - x
──────
1 - x

In [9]: together(apart(1/( (x+2)*(x+1) ), x), x)
       1
───────────────
(2 + x)*(1 + x)

皮皮blog

微积分

极限limit

在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

>>> limit(x**3 - 3*x, x, oo)
oo

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

微分diff

可以对任意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)

积分integrate

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

级数展开series

函数series(var, point, order)

示例1:
 >>>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)
示例2:
 from sympy import Integral, Symbol, pprint
 x = Symbol("x")
 y = Symbol("y")
 e = 1/(x + y)
 s = e.series(x, 0, 5)
 print(s)
 pprint(s)
 1/y + x**2*y**(-3) + x**4*y**(-5) - x*y**(-2) - x**3*y**(-4) + O(x**5)
      2    4         3
 1   x    x    x    x
 ─ + ── + ── - ── - ── + O(x**5)
 y    3    5    2    4
     y    y    y    y

复数I

>>>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)

皮皮blog

函数

三角函数:

In [1]: sin(x+y).expand(trig=True)    #表达式展开(通过三角函数形式)
    cos(x)*sin(y) + cos(y)*sin(x)
In [2]: cos(x+y).expand(trig=True)
    cos(x)*cos(y) - sin(x)*sin(y)
In [3]: sin(I*x)
    I*sinh(x)
In [4]: sinh(I*x)
    I*sin(x)
In [5]: asinh(I)
π*I
───
 2
In [6]: asinh(I*x)
    I*asin(x)
In [15]: sin(x).series(x, 0, 10)
     3     5     7       9
    x     x     x       x
x - ── + ─── - ──── + ────── + O(x**10)
    6    120   5040   362880
In [16]: sinh(x).series(x, 0, 10)
     3     5     7       9
    x     x     x       x
x + ── + ─── + ──── + ────── + O(x**10)
    6    120   5040   362880
In [17]: asin(x).series(x, 0, 10)
     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)
     3      5      7       9
    x    3*x    5*x    35*x
x - ── + ──── - ──── + ───── + O(x**10)
    6     40    112     1152

球谐函数Ylm

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

阶乘和伽玛函数factorial

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

Zeta函数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

皮皮blog

微分方程

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)

代数方程

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}

皮皮blog

线性代数

矩阵

矩阵由矩阵类创立:
>>>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}

皮皮blog

打印输出

标准print

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为默认输出,使用:

>>> from sympy import *

>>> import sys

>>> sys.displayhook = pprint

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
用a pyglet window以LaTeX 提供表达式

如果安装了pyglet,一个呈现LaTeX表达式的窗口会被打开:

注解

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程序是必须的。

from:Sympy符号计算库_皮皮blog-CSDN博客_sympy库

ref: 学习更多的SymPy参考SymPy User’s Guide 和 SymPy Modules Reference.

公共WIKI( wiki.sympy.org)有用的例子,教程和代码。

SymPy简易教程(一) - [Python]

SymPy简易教程(二) - [Python]

SymPy简易教程(三) - [Python]

SymPy简易教程(四) - [Python]

sympy

SymPy’s documentation!

教程symPy 0.7.2-git documentation

SymPy-符号运算好帮手

SymPy Tutorial(译)

SymPy User’s Guide, SymPy Modules Reference.

Sympy符号计算库相关推荐

  1. Python符号计算库sympy使用笔记

    介绍 sympy是一个非常好用的基于Python的符号计算库,科技做微分.积分.极限等一系列高等数学运算,可以帮我们自动的进行符号化计算,即带入运算的不是某个具体的数值, 而是抽象的数学符号, 并且还 ...

  2. C++符号计算库GiNaC的安装和使用教程

    C++符号计算库GiNaC的安装和使用教程 GiNaC是一个C++库.它被设计成方便用户在一个符号计算系统下创建自定义的集成系统,比如将符号操作与计算机科学的更成熟领域(如计算密集型数值应用程序.图形 ...

  3. python幂运算的符号有哪些及画法_SymPy 符号计算基本教程

    SymPy 是一个由 Python 语言编写的符号计算库.我将在本文中简要地介绍如何利用 SymPy 进行符号计算.在介绍 SymPy 之前,我们首先要明确何谓符号计算?计算机代数系统又是什么? 什么 ...

  4. python中幂运算的符号是什么_SymPy 符号计算基本教程

    SymPy 是一个由 Python 语言编写的符号计算库.我将在本文中简要地介绍如何利用 SymPy 进行符号计算.在介绍 SymPy 之前,我们首先要明确何谓符号计算?计算机代数系统又是什么? 什么 ...

  5. python好用的模块_python常用的内置模块和常用的第三方模块

    模块说明 requests对HTTP协议进行高度封装 bs4解析HTML的模块 pymongo把数据写入MongoDB numpy支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库 ...

  6. 命令行窗口cmd中的python指令

    目的 cmd指令 查看已安装的库 pip list 查看指定的库 pip show 库名称 查看可升级的库 pip list -o 升级指定的库 pip install --upgrade 库名称 安 ...

  7. 用python计算1乘到10_从零开始学习PYTHON3讲义(十一)计算器升级啦

    (内容需要,本讲中再次使用了大量在线公式,如果因为转帖网站不支持公式无法显示的情况,欢迎访问原始博客.) <从零开始PYTHON3>第十一讲 第二讲的时候,我们通过Python的交互模式来 ...

  8. Python机器学习之编程环境的构建

    Python机器学习之编程环境的构建 目录 Python机器学习之编程环境的构建 @[TOC](目录) 前言 一.Python 3编程语言 二.Python之禅 三.Python环境构建 1.www. ...

  9. C++ 偏微分数值计算库_SymPy 符号计算基本教程

    SymPy 是一个由 Python 语言编写的符号计算库.我将在本文中简要地介绍如何利用 SymPy 进行符号计算.在介绍 SymPy 之前,我们首先要明确何谓符号计算?计算机代数系统又是什么? 什么 ...

  10. matlab武汉理工大学数值分析线性函数拟合实验_「首席架构师推荐」数值计算库精选...

    这是一个著名的数值库列表,这些库用于软件开发中执行数值计算.它不是一个完整的列表,而是一个包含Wikipedia上文章的数字库列表,很少有例外. 典型库的选择取决于一系列不同的需求,例如:期望的特性( ...

最新文章

  1. Adding a QR Code Reader in Flex on Android
  2. “轻雀”成就团队和个人,共建高效知识协同平台
  3. php将pdf文件存入数据库,关于tcpdf:在我的php数据库中制作pdf文件
  4. OPENCV背景细分background segmentation的实例(附完整代码)
  5. LightSwitch中的权限
  6. 公众号滑动图代码_如何实现微信公众号文章“滑动查看更多”
  7. 题目 2285: [蓝桥杯][2018年第九届真题]螺旋折线(数论+思维)
  8. 知乎高赞:一行代码凭什么躺普通程序员的10年工资?
  9. python自动化和教程_《手把手教你》系列练习篇之2-python+ selenium自动化测试(详细教程)...
  10. 四、bootstrap-Table
  11. file_get_contents(): php_network_getaddresses: getaddrinfo failed: Name or service not known
  12. 数据分析师看了这个故事,你还有什么理由不努力?
  13. picsart旧版本_picsart旧版本中文下载-picsart老版本软件8.5.6 历史版本-东坡下载
  14. oracle alter命令大全
  15. DelphiIE插件开发
  16. 这些月入5万的程序员们究竟是怎么花钱的?
  17. 服务器输出音频文件,云服务器音频输出
  18. txt文件所有大写字母转小写代码
  19. 电子学会图形化一级编程题解析:字母AB点头问好
  20. python画正方形的代码_python画正方形的代码是什么?

热门文章

  1. PE文件结构及其加载机制(四)
  2. Linux的文件的打包(tar方法)
  3. Java:下拉列表绑定后台数据
  4. js $.inArray
  5. Java-在线聊天系统-线程
  6. 价值5000元的报表分享
  7. [置顶] Android改变图像的饱和度、亮度和对比度
  8. INFORMIX体系效能改善第一步
  9. 【面经】NLP算法-字节跳动
  10. 【Linux】15 张 Vim 速查表奉上,帮你提高 N 倍效率!