SymPy基础计算

介绍SymPy的一些基本方法

使用SymPy,需要先

1
import sympy

基础常数

在SymPy中可以使用以下代码来表示

1
sympy.exp(1), sympy.I, sympy.pi, sympy.oo

这样,我们可以计算欧拉公式

1
sympy.exp(sympy.I*sympy.pi)+1	# 输出0

如果想查看某个常数或变量具体的值,可以使用evalf()函数。例如

1
2
3
4
5
6
7
8
sympy.E.evalf(10)	# 2.718281828
sympy.E.evalf() # 2.71828182845905
sympy.pi.evalf(10) # 3.141592654
sympy.pi.evalf() # 3.14159265358979

expr = sympy.sqrt(8)
expr # 2*sqrt(2)
expr.evalf() # 2.82842712474619

基础符号运算

可以使用如下代码

1
var_x = sympy.symbols(‘x’)

可以创建一个值为'x'的符号变量var_x

符号之间可以创建各种运算公式:

1
2
3
4
5
6
7
8
9
>>> var_x, var_y = sympy.symbols("x y")
>>> var_x + var_y
x + y
>>> var_x - var_y
x - y
>>> var_x * var_y
x*y
>>> var_x / var_y
x/y

同样的,我们可以创建复数

1
2
3
4
5
6
7
8
9
10
11
12
13
>>> x1, y1, x2, y2 = sympy.symbols("x1 y1 x2 y2")
>>> z1 = x1 + y1*sympy.I
>>> z2 = x2 + y2*sympy.I
>>> z1, z2
(x1 + I*y1, x2 + I*y2)
>>> z1+z2
x1 + x2 + I*y1 + I*y2
>>> z1-z2
x1 - x2 + I*y1 - I*y2
>>> z1*z2
(x1 + I*y1)*(x2 + I*y2)
>>> z1/z2
(x1 + I*y1)/(x2 + I*y2)

多项式计算

SymPy中还可以计算多项式,可以进行展开、因式分解或者化简:

1
2
3
4
5
6
7
8
9
10
11
>>> x = sympy.symbols('x')
>>> sympy.expand((x+1)**2) # sympy.expand()进行展开
x**2 + 2*x + 1
>>> sympy.expand((x+2)**4)
x**4 + 8*x**3 + 24*x**2 + 32*x + 16
>>> sympy.factor(x**3+1) # sympy.factor()因式分解
(x + 1)*(x**2 - x + 1)
>>> sympy.simplify(x**2+x+1-x) # sympy.simplify()进行化简
x**2 + 1
>>> sympy.simplify(sympy.sin(x)**2+sympy.cos(x)**2)
1

上面是单变量的式子。此外,在多变量的情况下,SymPy可以对其中的某个变量进行合并同类项或者计算某个次数的系数:

1
2
3
4
5
6
7
8
9
>>> expr = x*y +x -3 +2*x**2 -x**2 +x**3 + y**2 +x**2*y**2	# 创建多项式
>>> sympy.collect(expr,x) # sympy.collect(expr,x)对expr的x变量进行合并同类项
x**3 + x**2*(y**2 + 1) + x*(y + 1) + y**2 - 3
>>> sympy.collect(expr,y)
x**3 + x**2 + x*y + x + y**2*(x**2 + 1) - 3
>>> expr.coeff(x,2) # 计算expr中x的二次项的系数
y**2 + 1
>>> expr.coeff(y,1) # 计算expr中y的一次项的系数
x

对于形如的有理函数。SymPy也可以进行有关的化简、合并、分解:

在需要合并的情况下,如果想把有理函数处理成的标准形式并且去除公因式,可以使用cancel()函数,与之类似的是together()函数,不同的是together()函数不会约去公因式;

例如对于函数

1
2
3
4
5
>>> expr = (x**2+3*x+2)/(x**2+x)
>>> sympy.cancel(expr)
(x + 2)/x
>>> sympy.together(expr)
(x**2 + 3*x + 2)/(x*(x + 1))

与此同时,我们还可以对有理函数的分子分母进行因式分解,还是使用factor()

1
2
3
4
5
6
7
8
9
>>> expr = (x**2+3*x+2)/(x**2+x)
>>> sympy.factor(expr)
(x + 2)/x
>>> expr = (x**3+ 3*x**2 +2*x)/(x**5+x)
>>> sympy.factor(expr)
(x + 1)*(x + 2)/(x**4 + 1)
>>> expr = x**2 + (2*x+1)/(x**3+1)
>>> sympy.factor(expr)
(x**5 + x**2 + 2*x + 1)/((x + 1)*(x**2 - x + 1))

合并的反面是部分分式展开,也就是常用的分离常数法,这里需要使用apart()

1
2
3
4
5
6
>>> expr = (x**4+3*x**2+2*x)/(x**2+x)
>>> sympy.apart(expr)
x**2 - x + 4 - 2/(x + 1)
>>> expr = (x**5+1)/(x**3+1)
>>> sympy.apart(expr)
x**2 - (x - 1)/(x**2 - x + 1)

初等函数计算

SymPy支持三角函数的计算trigsimp()、展开expand_trig()

1
2
3
4
5
6
7
8
9
>>> expr = sympy.sin(x)**2 + sympy.cos(x)**2
>>> sympy.trigsimp(expr)
1
>>> sympy.expand_trig(sympy.sin(x+y))
sin(x)*cos(y) + sin(y)*cos(x)
>>> sympy.expand_trig(sympy.cos(x+y))
-sin(x)*sin(y) + cos(x)*cos(y)
>>> sympy.trigsimp(sympy.sin(x)*sympy.cos(y)+sympy.cos(x)*sympy.sin(y))
sin(x + y)

对幂的函数,可以化简powsimp()(与simplify()类似)、根据底数进行合并,可以使用expand_power_exp()expand_power_base()

1
2
3
4
5
6
7
8
9
>>> z = sympy.symbols('z')
>>> sympy.powsimp(x**z * y**z * x**z)
x**(2*z)*y**z
>>> sympy.simplify(x**z * y**z * x**z)
x**(2*z)*y**z
>>> sympy.expand_power_exp(x**(y+z))
x**(y + z)
>>> sympy.expand_power_base(x**(y+z))
x**(y + z)

SymPy中可以计算对数函数,使用expand_log()logcombine()可以进行以下的操作: