SymPy微积分计算

SymPy可以进行微分、积分、极限等计算,

比如有函数,可以使用sympy.subs()进行变量代换,把代换为等其他变量或者常数。例如

1
2
3
4
5
6
7
8
9
10
11
>>> x = sympy.symbols('x')
>>> f = 1/x
>>> f
1/x
>>> y = sympy.symbols('y')
>>> f = f.subs(x,y)
>>> f
1/y
>>> ans = f.subs(y,1)
>>> ans
1

在微积分中,最基本的操作是求极限,SymPy中求极限使用函数sympy.limit()

1
2
3
4
5
6
7
8
>>> f = 1/x
>>> sympy.limit(f,x,0)
oo
>>> sympy.limit(f,x,sympy.oo)
0
>>> f = sympy.sin(x)/x
>>> sympy.limit(f,x,0)
1

也可以使用函数sympy.diff()进行求导的操作,可以在参数中设定求导的次数、变量等

1
2
3
4
5
6
7
8
9
10
>>> f = 1/x
>>> sympy.diff(f,x)
-1/x**2
>>> sympy.diff(f,x,2) # 对f求x的二阶导
2/x**3
>>> sympy.diff(f,x,10) # 对f求x的十阶导
3628800/x**11
>>> f = sympy.exp(x*y)*x+sympy.sin(x**2+y)
>>> sympy.diff(f,x,y,x) # f先对x求导,再对y求导,再对x求导
x**2*y**2*exp(x*y) - 4*x**2*cos(x**2 + y) + 4*x*y*exp(x*y) + 2*exp(x*y) - 2*sin(x**2 + y)

提到导数,这里提一下泰勒级数,这里可以使用sympy.series()函数。其中包含参数expr,x,x0,n,dir;分别表示函数、展开变量、展开点、展开的最高次、方向(等)。默认情况下,x0=0,n=6.

1
2
3
4
5
6
7
>>> f = sympy.cos(x)
>>> sympy.series(f,x)
1 - x**2/2 + x**4/24 + O(x**6)
>>> sympy.series(f,x,1,10)
cos(1) - (x - 1)*sin(1) - (x - 1)**2*cos(1)/2 + (x - 1)**3*sin(1)/6 + (x - 1)**4*cos(1)/24 - (x - 1)**5*sin(1)/120 - (x - 1)**6*cos(1)/720 + (x - 1)**7*sin(1)/5040 + (x - 1)**8*cos(1)/40320 - (x - 1)**9*sin(1)/362880 + O((x - 1)**10, (x, 1))
>>> sympy.series(f,x).removeO() # removeO()方法可以去掉余项
x**4/24 - x**2/2 + 1

SymPy的积分使用函数sympy.integrate(),可以计算不定积分、定积分、广义积分

例如

需要注意积分上下界在函数中的写法

1
2
3
4
5
>>> f = 1/x
>>> sympy.integrate(f,x)
log(x)
>>> sympy.integrate(f,(x,1,2))
log(2)

还有

1
2
3
4
5
6
7
8
9
>>> g = sympy.exp(-x**2)
>>> sympy.integrate(g,(x,-sympy.oo,0))
sqrt(pi)/2
>>> g = sympy.exp(-x)
>>> sympy.integrate(g,(x,0,sympy.oo))
1
>>> h = sympy.exp(-x**2-y**2)
>>> sympy.integrate(h,(x,-sympy.oo,sympy.oo),(y,-sympy.oo,sympy.oo))
pi