Python-使用Sympy完成代數運算



前言:在現代,若是要對多筆數據進行分析和整理,甚至是做過於繁雜的計算,使用程式來替人腦做運算絕對是有必要的,而Sympy的快速計算功能在某種程度上,長久下來確實能幫助我們節省不少時間。而我認為這是值得我們花時間去了解的。

簡介:Sympy是一個可以進行數學代數運算的Python模組,他的發展目標是一個完整的電腦代數系統,而此模組完全都是使用 Python 寫成的,所以不需要依賴其他的函式庫。其支援微積分、代數、矩陣、微分方程...等運算,只要我們所求的不是太過理論的證明,Sympy都能夠替我們做快速的運算,能夠替計算量大的使用者省下不少時間。

優點:快速、方便、程式碼可讀性高、不需要網路也可以使用

缺點:可攜性差、無法完成複雜的運算

下載方法(使用的作業系統為MacOS,且須先安裝Python及Anaconda):

先進入terminal,之後依序input下列字元,完成安裝程序後,進入Python的互動式介面:




----------------------------------------------------------------------------------
  • $ conda update sympy
  • $ python
----------------------------------------------------------------------------------



完成後環境都會在作業系統上設置好了,下次需要啟動時不需重新下載

使用說明:


再將Sympy的模組載入:



----------------------------------------------------------------------------------
  • from sympy import *

----------------------------------------------------------------------------------

註:此處有更加完整的說明。

註:*號代表將所有Sympy的模組載入;若是沒有加入*號的話,後面還需要加上一個(也可以是多個,且須以頓號作為間隔)關鍵保留字(例如pi、tan、gamma),否則都會回傳Syntax Error。個人比較推薦照上面的語法輸入,往後input的過程中會順利很多。

註:輸入下面的isympy指令後,會進入Sympy模組特別準備的對話模式,連模組載入的事都會預先幫你處理好,而之後print出來的數據也是經過排版的,看起來會更加賞心悅目。



----------------------------------------------------------------------------------
  • $ isympy
----------------------------------------------------------------------------------

註:Sympy有提供isympy的Online-Shell線上編譯環境,請點連結

大致上的介紹到此結束,下文介紹Sympy的基礎知識及常用函數。



基礎知識


1.在Sympy中,所有變數在使用前均先宣告才可使用,方法如下

----------------------------------------------------------------------------------
  • >>>x=Symbol('x')
  • >>>i,j,k=Symbol('i j k')
----------------------------------------------------------------------------------

2.在Sympy中,所有函數的使用是可以經過前置後置交換的,output的結果會等價

Keyword(function,(Keyword_var))=function.Keyword(Keyword_var),其中Keyword代表保留字

----------------------------------------------------------------------------------

  • >>>series(sin(x),(x,0,5))
  • >>>sin(x).series(x,0,5)
----------------------------------------------------------------------------------

3.在Sympy中,可以為函數進行「屬性創建」,output的結果會依照屬性而有不同,而這個操作常在使用expand展開函數及Symbol定義變數的時候使用

(Attribute=true),其中Attribute可以是complex, real, positive等數系


----------------------------------------------------------------------------------
  • >>>x=Symbol('x',real=true)
  • >>>expand(sin(x),complex=true)
  • sin(re(x))*cosh(im(x))+I*cos(re(x))*sinh(im(x))
----------------------------------------------------------------------------------

4.在Sympy中,所有數的運算被歸類為三種,分別為Rational有理數、Integer整數、Float浮點數三類,預設為float浮點樹運算

----------------------------------------------------------------------------------
  • >>>Rational(2)**10/Rational(2)**12
  • 1/4
  • >>>2**10/2**12
  • 0.25
----------------------------------------------------------------------------------

常用函數

1.limit(function,var,point)取極限,其中function為函數,var為變數,point為趨近點

----------------------------------------------------------------------------------
  • >>>limit(sin(x)/x,x,0)
  • 1
----------------------------------------------------------------------------------
2.diff(function,var,degree)微分,其中function為函數,var為變數,degree為次數

然而,這兩種寫法的效果是等價的

----------------------------------------------------------------------------------
  • >>>diff(sin(x),x) # is equal to diff(sin(x),x,1)
  • cos(x)
  • >>>diff(sin(x),x,x) # is equal to diff(sin(x),x,2)
  • -sin(x)
----------------------------------------------------------------------------------

也可以求偏微分,只要依序填入要微的變數即可。

----------------------------------------------------------------------------------

  • >>>diff(y*sin(x),x,y) # is equal to diff(y*sin(x),x,1,y,1)
  • cos(x)
----------------------------------------------------------------------------------

3.integrate(function,var)不定積分,其中function為函數,var為變數

integrate(function,(var,lower_limit,upper_limit))定積分,其中function為函數,lower_limit為積分下界,upper_limit為積分上界

擴充變數後亦可寫成重積分的形式。

----------------------------------------------------------------------------------
  • >>>integrate(r*E**(-2*r),((r,-oo,oo),(theta,-oo,oo))
  • sqrt(pi)
----------------------------------------------------------------------------------

4.Add(numb1,numb2,...,numbn):連加;
Mul(numb1,numb2,...,numbn):連乘
Pow(x,y)開x的y次方

----------------------------------------------------------------------------------
  • >>>Add(3,4,5)
  • 12
  • >>>Mul(3,4,5)
  • 60
  • >>>Pow(4,2)
  • 16
----------------------------------------------------------------------------------

這三種函數都是繼承自類Basic。

5.apart(function,x):部分分式,其中function為函數,x為變數

----------------------------------------------------------------------------------
  • >>>apart(1/x*(x+1),x)
  • 1+1/x
----------------------------------------------------------------------------------

6.together(function,x):合項,其中function為函數,x為變數

----------------------------------------------------------------------------------
  • >>>together(1+(1/x),x)
  • 1/x*(x+1)
----------------------------------------------------------------------------------

7.expand(function):展開,其中function為函數

----------------------------------------------------------------------------------
  • >>>expand((x+y)**2))
  • x**2+2*x*y+y**2
----------------------------------------------------------------------------------

8.simplify(function):化簡至最簡形式,其中function為函數

----------------------------------------------------------------------------------
  • >>>simplify((sin(x)**2+cos(x)**2))
  • 1
----------------------------------------------------------------------------------

9.re(complex_number):取複數的實數部分,其中complex_number為任一複數

----------------------------------------------------------------------------------
  • >>>re(1+2I)
  • 1
----------------------------------------------------------------------------------

10.im(complex_number):取複數的虛數部分,其中complex_number為任一複數

----------------------------------------------------------------------------------
  • >>>im(1+2I)
  • 2
----------------------------------------------------------------------------------

11.summation(function,(initial_number,a,b):級數求合,其中function為函數,initial_number為級數變數,a為首項,b為末項,sigma(function)i由a到b

----------------------------------------------------------------------------------
  • >>>summation(2**i,(i,1,10))
  • 2046
----------------------------------------------------------------------------------

12.factorial(number):階乘,其中number為任一數字,也可以是變數

----------------------------------------------------------------------------------
  • >>>factorial(3)
  • 6
----------------------------------------------------------------------------------

13.factor(equation):因式分解,其中equation為一等號右邊為0的等式

----------------------------------------------------------------------------------
  • >>>factor(2*x**2+3*x+1)
  • (x+1)*(2*x+1)
----------------------------------------------------------------------------------

14.solve(equation):解方程式,其中equation為一等號右邊為0的等式,var為變數

----------------------------------------------------------------------------------
  • >>>solve(2*x**2+3*x+1)
  • [-1,-1/2]
----------------------------------------------------------------------------------

:使用solveset來解的話,求得的根會以集合的形式output。

solve([equation1,equation2,...,equationn],var1,var2,...varn):解聯立方程式,其中equation為一等號右邊為0的等式,var為變數

----------------------------------------------------------------------------------
  • >>>solve([2*x+y+1,3*x+4*y-2],x,y)
  • {x:-6/5,y:7/5}
----------------------------------------------------------------------------------

15.dsolve(diff_equation,f(x)):解微分方程,其diff_equation為需求解的微分方程,f(x)為需求解的變數

----------------------------------------------------------------------------------
  • >>>diffeq = Eq(f(x).diff(x, x) - 2*f(x).diff(x) + f(x), sin(x))
  • >>>dsolve(diffeq, f(x))
  • f(x)=(C1+C2*x)*E**x+cos(x)/2
----------------------------------------------------------------------------------

16.(var).evalf(number):精確求值,其中var為變數(如:pi,E,tan(33),number為總共顯示的字元數

----------------------------------------------------------------------------------
  • >>>pi.evalf(4)
  • 3.141
  • >>>10*pi.evalf(4)
  • 31.41
----------------------------------------------------------------------------------

17.collect(function,var):提出指定公因數化簡函數,其中function為函數

----------------------------------------------------------------------------------
  • >>>collect(x*y + x - 3 + 2*x**2 - z*x**2 + x**3)
  • x**3+x**2*(−z+2)+x*(y+1)−3

----------------------------------------------------------------------------------

18.cancel(function):讓已展開的分式化為最簡形式(約掉公因式),其中function為函數

----------------------------------------------------------------------------------
  • >>>cancel((x**2 + 2*x + 1)/(x**2 + x))
  • x + (1/x)
----------------------------------------------------------------------------------

19.(function(var)).subs(var,n):變數代值,其中function(var)為var的函數,n為替換後的值,而這個值可以是其他變數

(function(var1,var2)).subs((var1,n)(var2,n):一次代入多個值,但是要注意個是兩個變數不能互換

----------------------------------------------------------------------------------
  • >>>sin(x).subs(x,1)
  • sin(1)
----------------------------------------------------------------------------------

20.series(function,var,point,degree):其中function為函數,var為變數,point為展開點,degree為展開後最高項係數

----------------------------------------------------------------------------------
  • >>>series(sin(x),x,0,7)
  • x-x**3/6+x**5/120+O(x**7)
----------------------------------------------------------------------------------


參見:http://docs.sympy.org/latest/index.html(sympy.documentation)

2 則留言: