python:符號計算-sympy

引入

什麼是符號計算(Symbolic computation)
就是對數學表達式進行解析計算,而不是近似計算。可以簡單分爲兩類:

  1. 不包含符號的表達式
  2. 包含符號的表達式

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,合併表達式中的同類項

微分和積分

計算f(x)=ax2+bf(x)=ax^2+b的導數

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

計算不定積分:(ax2+b)dx\int (ax^2+b)dx

In [55]: sym.integrate(f,x)   #不定積分
Out[55]: a*x**3/3 + b*x

計算定積分:ab(ax2+b)dx\int_a^b (ax^2+b)dx

In [56]: sym.integrate(f,(x,-1,1))    #[-1,1]區間內的定積分
Out[56]: 2*a/3 + 2*b

極限

計算limx0=sin(x)x\lim_{x\to0}=\frac{sin(x)}{x}

In [57]: x = sym.symbols('x')

In [58]: f = sym.sin(x)/x

In [59]: sym.limit(f,x,0)
Out[59]: 1

解方程

解一般方程:x22=0x^2-2=0

In [64]: x = sym.symbols('x')

In [65]: sym.solve(x**2-2, x)
Out[65]: [-sqrt(2), sqrt(2)]

解微分方程:yy=exy^{\prime\prime}-y=e^x

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中渲染後輸出:

在這裏插入圖片描述

矩陣運算

計算:[0110][0ii0]\left[\begin{array}{ll}0 & 1 \\ 1& 0\end{array}\right]*\left[\begin{array}{ll}0 & -i \\ i& 0\end{array}\right]

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中渲染後輸出:

在這裏插入圖片描述

計算:[a11a12a21a22][b11b12b21b22]\left[\begin{array}{ll}a_{11} & a_{12} \\ a_{21}& a_{22}\end{array}\right]*\left[\begin{array}{ll}b_{11} & b_{12} \\ b_{21}& b_{22}\end{array}\right]

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中渲染輸出:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章