SymPy是Python的数学符号计算库,用它可以进行数学公式的符号推导。为了调用方便,下面所有的实例程序都假设事先从sympy库导入了所有内容:
>>> from sympy import *
--------------------------------------------------------------------------- *表示所有的意思 ---------------------------------------------------------------------------
1.经典公式
叫做欧拉恒等式,其中e是自然指数的底,i是虚数单位,pi是圆周率。此公式被誉为数学最奇妙的公式,它将5个基本数学常数用加法、乘法和幂运算联系起来。下面用SymPy验证一下这个公式。 载入的符号中,E表示自然指数的底,I表示虚数单位,pi表示圆周率,因此上述的公式可以直接如下计算:
>>> E**(I*pi)+1
0
欧拉恒等式可以下面的公式进行计算, 为了用SymPy求证上面的公式,我们需要引入变量x。在SymPy中,数学符号是Symbol类的对象,因此必须先创建之后才能使用:
>>> x = Symbol('x')
expand函数可以将公式展开,我们用它来展开E**(I*x)试试看:
>>> expand( E**(I*x) )
exp(I*x)
没有成功,只是换了一种写法而已。这里的exp不是math.exp或者numpy.exp,而是sympy.exp,它是一个类,用来表述自然指数函数。 --------------------------------------------------------------------------------------------- math.exp(x):返回x的指数,x必须是一个数。 numpy.exp(x):返回x的指数,x可以是数组,可以是一个数。
>>> import math
>>> import numpy as np
>>> x = 2
>>> y = np.array([1,2,3,4])
>>> z = np.array([2])
>>> math.exp(x)
7.38905609893065
>>> math.exp(z)
7.38905609893065
>>> math.exp(y)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: only length-1 arrays can be converted to Python scalars
>>> np.exp(x)
7.3890560989306504
>>> np.exp(z)
7.3890560989306504
>>> np.exp(y)
array([ 2.71828183, 7.3890561 , 20.08553692, 54.59815003])
numpy就是python的数组运算包! ---------------------------------------------------------------------------------------------- expand函数有关键字参数complex(带有虚部的参数类型,本质就是复数,NumPy里讲过),当它为True时,expand将把公式分为实数和虚数两个部分:
>>> expand(exp(I*x), complex=True)
I*exp(-im(x))*sin(re(x)) + cos(re(x))*exp(-im(x))
这次得到的结果相当复杂,其中sin, cos, re, im都是sympy定义的类,re表示取实数部分,im表示取虚数部分。显然这里的运算将符号x当作复数了。为了指定符号x必须是实数,我们需要如下重新定义符号x:
>>> x = Symbol("x", real=True)
>>> expand(exp(I*x), complex=True)
I*sin(x) + cos(x)
---------------------------------------------------------------------------------------------- python中单引号''和双引号""用法: 它们其实并没有明确的区别和特别用法,绝大部分情况是可以互相替换的。但是有一种情况需要注意:
>>> str = "Hello,world!"
>>> str1 = 'Hello,world!'
>>> str2 = "Let's go!"
>>> str3 = 'Let\'s go!' # \是转意符号,告诉系统其后'的作用不是引号。
>>> str4 = "Say:\"Hello!\""
>>> str5 = 'Say:"Hello"'
>>> print str
Hello,world!
>>> print str1
Hello,world!
>>> print str2
Let's go!
>>> print str3
Let's go!
>>> print str4
Say:"Hello!"
>>> print str5
Say:"Hello"
下面不加转意符号会出现报错提示:
>>> str6 ='Let's go!'
File "<stdin>", line 1
str6 ='Let's go!'
^
SyntaxError: invalid syntax
----------------------------------------------------------------------------------------------
2.积分运算
SymPy的符号积分函数integrate可以帮助我们进行符号积分。integrate可以进行不定积分:
>>> integrate(x*sin(x), x)
-x*cos(x) + sin(x)
如果指定x的取值范围的话,integrate则进行定积分运算:
>>> integrate(x*sin(x), (x, 0, 2*pi))
-2*pi
为了计算球体体积,首先让我们来看看如何计算圆形面积,假设圆形的半径为r,则圆上任意一点的Y坐标函数为:
>>> x, y, r = symbols('x,y,r')
>>> 2 * integrate(sqrt(r*r-x**2), (x, -r, r))
2*Integral((r**2 - x**2)**(1/2), (x, -r, r))
很遗憾,integrate函数没有计算出结果,而是直接返回了我们输入的算式。这是因为SymPy不知道r是大于0的,如下重新定义r,就可以得到正确答案了:
>>> r = symbols('r', positive=True)
>>> circle_area = 2 * integrate(sqrt(r**2-x**2), (x, -r, r))
>>> circle_area
pi*r**2
接下来对此面积公式进行定积分,就可以得到球体的体积,但是随着X轴坐标的变化,对应的切面的的半径会发生变化,现在假设X轴的坐标为x,球体的半径为r,则x处的切面的半径为可以使用前面的公式y(x)计算出。 因此我们需要对circle_area中的变量r进行替代:
>>> circle_area = circle_area.subs(r, sqrt(r**2-x**2))
>>> circle_area
pi*(r**2 - x**2)
然后对circle_area中的变量x在区间-r到r上进行定积分,得到球体的体积公式:
>>> integrate(circle_area, (x, -r, r))
4*pi*r**3/3
用subs进行算式替换 subs函数可以将算式中的符号进行替换,它有3种调用方式: expression.subs(x, y) : 将算式中的x替换成y expression.subs({x:y,u:v}) : 使用字典进行多次替换 expression.subs([(x,y),(u,v)]) : 使用列表进行多次替换 请注意多次替换是顺序执行的,因此: expression.sub([(x,y),(y,x)]) 并不能对两个符号x,y进行交换。 ---------------------------------------------------------------------------------------------- 我这里举一些例子就明白了。
>>> from sympy import *
>>> a,b,c = symbols('a,b,c') #首字母小写
>>> y = a + 10*b + 100*c
>>> y = y.subs(a,b)
>>> y
11*b + 100*c
>>> y = a + 10*b + 100*c
>>> y = y.subs([(a,b),(b,c)])
>>> y
111*c
>>> y = a + 10*b + 100*c
>>> y = y.subs([(a,b),(b,a)])
>>> y
11*a + 100*c
>>> x=Symbol('x') #注意这个首字母大写
>>> y = a + 10*b + 100*c
>>> y = y.subs([(a,x),(b,a),(x,b)])
>>> y
10*a + b + 100*c
最后这个按顺序用笔写写。 ---------------------------------------------------------------------------------------------
想看完整内容,请去原文地址:http://old.sebug.net/paper/books/scipydoc/sympy_intro.html