介绍SymPy的一些基本方法
使用SymPy,需要先
基础常数
在SymPy中可以使用以下代码来表示
1
| sympy.exp(1), sympy.I, sympy.pi, sympy.oo
|
这样,我们可以计算欧拉公式
1
| sympy.exp(sympy.I*sympy.pi)+1
|
如果想查看某个常数或变量具体的值,可以使用evalf()
函数。例如
1 2 3 4 5 6 7 8
| sympy.E.evalf(10) sympy.E.evalf() sympy.pi.evalf(10) sympy.pi.evalf()
expr = sympy.sqrt(8) expr expr.evalf()
|
基础符号运算
可以使用如下代码
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) 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) (x + 1)*(x**2 - x + 1) >>> sympy.simplify(x**2+x+1-x) 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) 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) y**2 + 1 >>> expr.coeff(y,1) 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()
可以进行以下的操作: