引入
什么是符号计算(Symbolic computation)
就是对数学表达式进行解析计算,而不是近似计算。可以简单分为两类:
- 不包含符号的表达式
- 包含符号的表达式
sympy
python中可用sympy库进行符号计算。优点:开源,轻量级。可以做的事情:算数运算,微分,积分,矩阵运算等等。
下面总结常用的应用实例。
小例子
In [14]: import sympy as sym
In [15]: import numpy as np
In [16]: sym.sqrt(8)
Out[16]: 2*sqrt(2)
In [17]: np.sqrt(8)
Out[17]: 2.8284271247461903
In [18]: sym.exp(2)
Out[18]: exp(2)
In [19]: np.exp(2)
Out[19]: 7.38905609893065
In [20]: type(sym.sqrt(8))
Out[20]: sympy.core.mul.Mul
In [21]: type(sym.exp(2))
Out[21]: exp
In [32]: a = sym.symbols('a')
In [33]: sym.sqrt(a)
Out[33]: sqrt(a)
注意:
- sympy计算出的是解析解(精确解),numpy计算出的是近似解;
- 该解析解的类型是sympy自定义的类型,用来表示精确解。而我们熟悉的int,float等数据类型,都是近似解。
- 可通过
sym.symbols(names)
声明符号(变量),然后可对其进行任意的代数运算,比如加减乘除,平方根,指数等等。 - 在有数学公式渲染的环境中,比如jupyter notebook中,sympy的结果会被MathJax渲染成字母形式。
基本代数运算
In [38]: expr = (a+b)**2
In [39]: expr
Out[39]: (a + b)**2
In [40]: sym.expand(expr)
Out[40]: a**2 + 2*a*b + b**2
In [42]: expr1 = a**2 - 2*a*b + b**2
In [43]: sym.factor(expr1)
Out[43]: (a - b)**2
常用方法:
expand
,展开表达式factor
,合并表达式中的同类项
微分和积分
计算的导数
In [45]: a,b,x = sym.symbols('a b x')
In [46]: f = a*x**2+b
In [52]: sym.diff(f,x) #对x求1阶导数
Out[52]: 2*a*x
In [53]: sym.diff(f,x,2) #对x求2阶导数
Out[53]: 2*a
计算不定积分:
In [55]: sym.integrate(f,x) #不定积分
Out[55]: a*x**3/3 + b*x
计算定积分:
In [56]: sym.integrate(f,(x,-1,1)) #[-1,1]区间内的定积分
Out[56]: 2*a/3 + 2*b
极限
计算
In [57]: x = sym.symbols('x')
In [58]: f = sym.sin(x)/x
In [59]: sym.limit(f,x,0)
Out[59]: 1
解方程
解一般方程:
In [64]: x = sym.symbols('x')
In [65]: sym.solve(x**2-2, x)
Out[65]: [-sqrt(2), sqrt(2)]
解微分方程:
In [67]: y = sym.Function('y')
In [71]: equation = sym.Eq(y(x).diff(x,2)-y(x),sym.exp(x))
In [74]: sym.dsolve(equation,y(x))
Out[74]: Eq(y(x), C2*exp(-x) + (C1 + x/2)*exp(x))
notebook中渲染后输出:
矩阵运算
计算:
In [75]: a = sym.Matrix([[0,1], [1,0]])
In [76]: b = sym.Matrix([[0,-1j], [1j,0]])
In [77]: a*b
Out[77]:
Matrix([
[1.0*I, 0],
[ 0, -1.0*I]])
notebook中渲染后输出:
计算:
In [78]: a_11,a_12,a_21,a_22 = sym.symbols('a_11 a_12 a_21 a_22')
...: b_11,b_12,b_21,b_22 = sym.symbols('b_11 b_12 b_21 b_22')
...:
...: a = sym.Matrix([[a_11,a_12], [a_21,a_22]])
...: b = sym.Matrix([[b_11,b_12], [b_21,b_22]])
...: a*b
Out[78]:
Matrix([
[a_11*b_11 + a_12*b_21, a_11*b_12 + a_12*b_22],
[a_21*b_11 + a_22*b_21, a_21*b_12 + a_22*b_22]])
notebook中渲染输出: