SymPy简易教程

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

引言

SymPy是Python的一个数学符号计算库。它目的在于成为一个富有特色的计算机代数系统。它保证自身的代码尽可能的简单,且易于理解,容易扩展。SymPy完全由Python写成,不需要额外的库。

这份教程只是对于SymPy给出一个概述和介绍。阅读这份教材,你可以知道SymPy可以为你做什么(与如何做)。如果你要知道更多,请阅读SymPy User’s GuideSymPy Modules Reference. 。或者直接阅读源代码。

关于SymPy的第一步

 最简单的方法是到http://code.google.com/p/sympy/下载它。

解压:

tar xzf sympy-0.5.12.tar.gz

 

然后试着从Python中运行:

$ cd sympy-0.5.12

$ python

Python 2.4.4 (#2, Jan  3 2008, 13:36:28)

[GCC 4.2.3 20071123 (prerelease) (Debian 4.2.2-4)] on linux2

Type "help", "copyright", "credits" or "license" for more information.

>>> from sympy import Symbol, cos

>>> x = Symbol("x")

>>> (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来显示以上内容,如果你想把它应用到你的程序中,这的确是推荐的方法。你也可以用 ./setup.py来安装它,作为Python的一个模块,或者仅仅是在你喜爱的Linux上安装一个包。

 

Debian中安装SymPy:省略

其他安装SymPy的方法,请咨询SymPy的下载(Downloads)网页。

isympy 控制台

对于新特性的一个实验,或者说什么时候计算,怎样计算,你可能使用我们为IPython特殊包装的,被称为isympy的一个标准的python shell,它被嵌入了sympy模块,并且定义了符号xyz和其它许多的东西。

例如

Python 2.4.4控制台,对于SymPy 0.5.12。命令执行如下:

cd sympy-0.5.12

bin/isympy

>>> from __future__ import division

>>> from sympy import *

>>> x, y, z = symbols(‘xyz’)

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

>>> f = Function(“f”)

文档可以在这里找到: http://sympy.org/

In [1]: (1/cos(x)).series(x, 0, 10)

Out[1]:

     2      4       6        8

    x    5*x    61*x    277*x

1 + ── + ──── + ───── + ────── + O(x**10)

    2     24     720     8064

 

注解:命令被你大胆的输入。因而我们在正规python解释器中的3行命令,在isympy1行就可以了。

SymPy当作计算器使用

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

有理数类用两个整数来表示一个有理数。分子与分母,所以Rational(1,2)代表1/2Rational(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

 

 

正确的除法在python3kisympy中这样做,是标准的。

 

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

>>>pi**2

pi**2

 

>>>pi.evalf()

3.14159265358979

 

>>>(pi+exp(1)).evalf()

5.85987448204884

 

 

正如你看到的,evalf()函数可以用求出表达式的浮点数。

有一个无穷大的类型,被成为oo

>>>oo > 99999

True

>>>oo + 1

oo

 

Symbols函数

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

>>>from sympy import *

>>>x = Symbol('x')

>>>y = Symbol('y')

 

然后你可以这样使用:

>>>x+y+x-y

2*x

 

>>>(x+y)**2

(x + y)**2

 

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

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

 

可以使用subs(old, new) 函数把数字或者符号代入(substitute)表达式:

>>>((x+y)**2).subs(x, 1)

(1 + y)**2

 

>>>((x+y)**2).subs(x, y)

4*y**2

 

代数

局部的代数式展开,使用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->0f(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)

 

其他简单的例子:

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

 

积分

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

 |

/

更多优秀unicode输出的例子,请看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

 

a pyglet windowLaTeX 提供表达式,可以弹出如下窗口:

 

 

 

 

注解

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。可以参考SymPy User’s Guide  SymPy Modules Reference.

如果有把握的话,也可以浏览我们的公共WIKI( wiki.sympy.org),这里包含了许多有用的例子,教程,和代码。我们也可以共同编辑

from:http://blog.csdn.net/pipisorry/article/details/42167987

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

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

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

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


SymPy是Python的一个数学符号计算库。它目的在于成为一个富有特色的计算机代数系统。它保证自身的代码尽可能的简单,且易于理解,容易扩展。SymPy完全由Python写成,不需要额外的库。

这份教程只是对于SymPy给出一个概述和介绍。阅读这份教材,你可以知道SymPy可以为你做什么(与如何做)。如果你要知道更多,请阅读SymPy User’s GuideSymPy Modules Reference. 。或者直接阅读源代码。

关于SymPy的第一步

 最简单的方法是到http://code.google.com/p/sympy/下载它。

解压:

tar xzf sympy-0.5.12.tar.gz

 

然后试着从Python中运行:

$ cd sympy-0.5.12

$ python

Python 2.4.4 (#2, Jan  3 2008, 13:36:28)

[GCC 4.2.3 20071123 (prerelease) (Debian 4.2.2-4)] on linux2

Type "help", "copyright", "credits" or "license" for more information.

>>> from sympy import Symbol, cos

>>> x = Symbol("x")

>>> (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来显示以上内容,如果你想把它应用到你的程序中,这的确是推荐的方法。你也可以用 ./setup.py来安装它,作为Python的一个模块,或者仅仅是在你喜爱的Linux上安装一个包。

 

Debian中安装SymPy:省略

其他安装SymPy的方法,请咨询SymPy的下载(Downloads)网页。

isympy 控制台

对于新特性的一个实验,或者说什么时候计算,怎样计算,你可能使用我们为IPython特殊包装的,被称为isympy的一个标准的python shell,它被嵌入了sympy模块,并且定义了符号xyz和其它许多的东西。

例如

Python 2.4.4控制台,对于SymPy 0.5.12。命令执行如下:

cd sympy-0.5.12

bin/isympy

>>> from __future__ import division

>>> from sympy import *

>>> x, y, z = symbols(‘xyz’)

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

>>> f = Function(“f”)

文档可以在这里找到: http://sympy.org/

In [1]: (1/cos(x)).series(x, 0, 10)

Out[1]:

     2      4       6        8

    x    5*x    61*x    277*x

1 + ── + ──── + ───── + ────── + O(x**10)

    2     24     720     8064

 

注解:命令被你大胆的输入。因而我们在正规python解释器中的3行命令,在isympy1行就可以了。

SymPy当作计算器使用

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

有理数类用两个整数来表示一个有理数。分子与分母,所以Rational(1,2)代表1/2Rational(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

 

 

正确的除法在python3kisympy中这样做,是标准的。

 

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

>>>pi**2

pi**2

 

>>>pi.evalf()

3.14159265358979

 

>>>(pi+exp(1)).evalf()

5.85987448204884

 

 

正如你看到的,evalf()函数可以用求出表达式的浮点数。

有一个无穷大的类型,被成为oo

>>>oo > 99999

True

>>>oo + 1

oo

 

Symbols函数

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

>>>from sympy import *

>>>x = Symbol('x')

>>>y = Symbol('y')

 

然后你可以这样使用:

>>>x+y+x-y

2*x

 

>>>(x+y)**2

(x + y)**2

 

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

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

 

可以使用subs(old, new) 函数把数字或者符号代入(substitute)表达式:

>>>((x+y)**2).subs(x, 1)

(1 + y)**2

 

>>>((x+y)**2).subs(x, y)

4*y**2

 

代数

局部的代数式展开,使用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->0f(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)

 

其他简单的例子:

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

 

积分

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

 |

/

更多优秀unicode输出的例子,请看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

 

a pyglet windowLaTeX 提供表达式,可以弹出如下窗口:

 

 

 

 

注解

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。可以参考SymPy User’s Guide  SymPy Modules Reference.

如果有把握的话,也可以浏览我们的公共WIKI( wiki.sympy.org),这里包含了许多有用的例子,教程,和代码。我们也可以共同编辑WIKI



ref:

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


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

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

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


转载于:https://my.oschina.net/u/3579120/blog/1508295

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值