SAGE入門:開源數學系統之集大成者
https://my.oschina.net/cvnote/blog/163094
自己部落格上寫的入門,原文地址:http://cvnote.info/SAGE入門:開源數學系統之集大成者
最近在學習Sage這款開源數學軟體系統,百度了一下發現國內關注的還比較少,所以寫一個Sage的介紹吧。
Sage(http://www.sagemath.org)是一款類似於Maple、Matlab、Mathematica之類的數學軟體,GPL許可,專案的目標是:
Mission: Creating a viable free open source alternative to Magma, Maple, Mathematica and Matlab
.
Sage可以幹什麼?介紹中有這麼一句:“這款開源軟體的支持者稱Sage能夠完成從12維物體到計算全球變暖效應數學模型中的降雨量的任何事情。”Sage包含了從線性代數、微積分,到密碼學、數值計算、組合數學、群論、圖論、數論等各種初高等數學的計算功能。
Sage的一大特點是整合了眾多優秀的開源數學軟體,使使用者可以在Sage中方便的使用這些庫中的相應功能。Sage目前整合了近一百個開源的數學庫,這其中包括著名的ATLAS、BLAS、LAPACK、Boost、GSL、SciPy等等,完整列表可以檢視這裡。
Sage基於並使用Python,Python程式可以在Sage中直接執行,也可以在Sage中使用Python的各種庫,感覺就像是提供了一個包含各種數學功能的Python環境。
使用Sage,你可以:
- 下載安裝Sage到本地(下載連結)
- 使用線上版本。Sage目前提供兩種線上平臺,分別是早期的The Sage Notebook和最近推出的SageMathCloud
下面是Sage的一些功能。
Sage Notebook
也可以在本地Sage命令列下使用 notebook() 開啟,相當於Maple的工作簿Worksheet,雖然看著有點簡陋,但功能還是很強大的,可以輸入Sage 命令,渲公式、顯示圖形等。
Sage Notebook
SageMathCloud
地址:https://cloud.sagemath.com/
SageMathCloud類似於一個線上的寫作程式設計平臺,註冊後可以在裡面建立工程,編輯各種原始檔。這裡建立了一個test工程,然後新建了一個.sagews(Sage Worksheet)工作簿檔案,介面和Maple的worksheet很像,可以在裡面輸入程式碼,點選執行鍵可以顯示結果。
Sage Worksheet
雖然目前還是beta版但是感覺還是挺好用的。除了Worksheet還可以新建terminal,效果和本地的Linux terminal一樣,輸入 sage 可以進入Sage命令列,用法和Python命令列很像,可以使用 help() 和tutorial()產看幫助與教程。
Sage Could Terminal
基本計算
和大多數數學軟體系統一樣,很簡單易用。比如求2013的質因子:
1 2 3 4 |
sage : x = 2013 sage : f = factor ( x ) sage : f 3 * 11 * 61 |
或者矩陣求逆
1 2 3 |
sage : matrix ( [ [ 1 , 2 ] , [ 3 , 4 ] ] ) ^ ( - 1 ) [ - 2 1 ] [ 3 / 2 - 1 / 2 ] |
符號計算
Sage的符號計算非常好用,可以用 x = var('var_name') 宣告符號變數。例如求一個函式的積分
1 2 3 4 5 |
sage : a = var ( 'a' ) sage : x = var ( 'x' ) sage : f = a * sin ( x ) + 1 / x sage : f . integrate ( x ) - a* cos ( x ) + log ( x ) |
或者解個方程
1 2 |
sage : solve ( x ^ 2 + a , x ) [ x == - sqrt ( - a ) , x == sqrt ( - a ) ] |
繪圖功能
比如畫出上面 f = a * sin(x) + 1 / x 在a=1時,在x=1~10的影象。 figsize 為影象大小
1 2 |
sage : f = f . substitute ( a == 1 ) sage : plot ( f , ( x , 1 , 10 ) , figsize = 2 ) |
可以得到
Sage Plot
除了2D,Sage還支援3D繪圖,具體可以檢視文件。
基本的數域與環
Sage支援在整數環( ZZ)、有理數域( QQ)、實數域( RR)、複數域( CC),以及更高階的多項式環、有限域(Finite Field)等集合上進行計算。這裡要順便複習一下抽象代數,比如一些簡單的概念:
1 2 3 4 5 6 7 8 |
sage : QQ . gens ( ) # 有理數域的單位元和零元素 ( 1 , ) sage : QQ . zero ( ) 0 sage : CC . gens ( ) # 複數域的單位元和零元素 ( 1.00000000000000 * I , ) sage : CC . zero ( ) 0.000000000000000 |
運算的範圍不同,結果也不同。例如:
1 2 3 4 5 6 |
sage : ratpoly . < t > = PolynomialRing ( QQ ) # 定義ratpoly為基於有理數域上t的多項式環 sage : realpoly . < z > = PolynomialRing ( RR ) # 定義realpoly為基於實施域上z的多項式環 sage : factor ( t ^ 2 - 2 ) t ^ 2 - 2 sage : factor ( z ^ 2 - 2 ) ( z - 1.41421356237310 ) * ( z + 1.41421356237310 ) |
外部軟體/庫介面
對於整合的外部開源數學軟體庫,Sage提供的方便的介面進行呼叫。在Sage中使用這些介面可以方便的將不同語言、不同功能的數學軟體庫整合在同一程式中,這也使得Sage集成了眾多開源數學軟體之所長。當然這些外部數學庫很多都非常專業,實際應用中應該只會用到其中很有限的一部分。這裡舉兩個官網Sage Tutorial裡的例子。
用GP/PARI求(本)原根(Primitive root)
GP/PARI是一個做數論的包(wiki)。原根是什麼呢,上過數論但是忘了的請面壁:(
抄一下wiki吧還是
在時,定義對模的指數為使成立的最小的正整數。由前知 一定小於等於 ,若,則稱是模的原根。
對正整數,如果 a 是模 m 的原根,那麼 a 是整數模n乘法群(即加法群 Z/mZ 的可逆元,也就是所有與 m 互素的正整數構成的等價類構成的乘法群)Zn×的一個生成元。
生成元是一個很數論中很重要的概念,在一個整數模n乘法群中,生成元可以通過不斷與自己相乘(然後再模n),生成群中的所有元素。元根可以用PARI中的 znprimroot(n) 函式來求。
1 2 |
sage : gp ( 'znprimroot(7)' ) Mod ( 3 , 7 ) |
或
1 2 |
sage : pari ( 'znprimroot(7)' ) Mod ( 3 , 7 ) |
得到3是模7乘法群的一個元根。
用Maxima在有理域求矩陣特徵向量
Maxima用LISP編寫的計算機代數系統 (Computer Algebra System),前身是Macsyma,Matlab和Mathematica等軟體的出現都受到在Macsyma的影響。在Sage中可以方便呼叫Maxima代數系統。例如下面在求特徵向量並轉換到有理域向量空間的例子,程式碼同樣來自官網Sage Tutorial,加了一些註釋:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
sage : A = maxima ( "matrix ([1, 0, 0], [1, -1, 0], [1, 3, -2])" ) # 生成矩陣 sage : eigA = A . eigenvectors ( ) # 計算特徵響亮 sage : V = VectorSpace ( QQ , 3 ) # V是一個有理數域上的3維向量空間, sage : eigA # 輸出格式為[[[特徵值],[特徵值重數]],[[特徵向量0],[特徵向量1],[特徵向量2]]] [ [ [ - 2 , - 1 , 1 ] , [ 1 , 1 , 1 ] ] , [ [ [ 0 , 0 , 1 ] ] , [ [ 0 , 1 , 3 ] ] , [ [ 1 , 1 / 2 , 5 / 6 ] ] ] ] sage : v1 = V ( sage_eval ( repr ( eigA [ 1 ] [ 0 ] [ 0 ] ) ) ) ; lambda1 = eigA [ 0 ] [ 0 ] [ 0 ] sage : v2 = V ( sage_eval ( repr ( eigA [ 1 ] [ 1 ] [ 0 ] ) ) ) ; lambda2 = eigA [ 0 ] [ 0 ] [ 1 ] sage : v3 = V ( sage_eval ( repr ( eigA [ 1 ] [ 2 ] [ 0 ] ) ) ) ; lambda3 = eigA [ 0 ] [ 0 ] [ 2 ]
sage : M = MatrixSpace ( QQ , 3 , 3 ) # M是一個有利數域上的3×3維的矩陣空間 sage : AA = M ( [ [ 1 , 0 , 0 ] , [ 1 , - 1 , 0 ] , [ 1 , 3 , - 2 ] ] ) sage : b1 = v1 . base_ring ( ) # b1 == QQ 是有理數域 sage : AA* v1 == b1 ( lambda1 ) * v1 # 驗證特徵值定義A*v = lambda1*v True sage : b2 = v2 . base_ring ( ) sage : AA* v2 == b2 ( lambda2 ) * v2 True sage : b3 = v3 . base_ring ( ) sage : AA* v3 == b3 ( lambda3 ) * v3 True |
注意到 M() 、 V() 、 b1() 、 b2() 、 b3() 都相當於型別轉換,限定運算在有理數域上進行。另外這裡的特徵向量沒有單位化,因為是在有理數域上。
與Latex協同
Sage內部可以與Latex協同。對於任意Sage物件foo,可以通過呼叫 latex(foo) 得到其Latex輸出。例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
sage : var ( 'z' ) z sage : latex ( z ^ 12 ) z ^ { 12 } sage : latex ( integrate ( z ^ 4 , z ) ) \ frac { 1 } { 5 } \ , z ^ { 5 } sage : latex ( 'a string' ) \ verb | a | \ phantom { \ verb ! x ! } \ verb | string | sage : latex ( QQ ) \ Bold { Q } sage : latex ( matrix ( QQ , 2 , 3 , [ [ 2 , 4 , 6 ] , [ - 1 , - 1 , - 1 ] ] ) ) \ left ( \ begin { array } { rrr } 2 & 4 & 6 \ \ - 1 & - 1 & - 1 \ end { array } \ right ) |
類似地,本地Sage命令列中使用 view(foo) 則會
SageTex Package
通過 \usepackage{sagetex} 在tex檔案中使用SageTex Package,可以直接在tex檔案中插入Sage命令,並隨Latex輸出結果到pdf。具體可參見官方Sage Tutorial。
小結
剛剛發現Sage的時候覺得很好很強大啊,本身基於Python,可以使用Python的庫,也會比較好上手。同時又提供了比較方便的介面呼叫各種外部的數學系統,使得功能十分強大。另外與Latex的協同和嵌入功能,Sage Notebook和SageMathCloud等工具也都做得挺好用的。
我自己不是專業搞數學的,但是感覺開源專案裡面要想出一個Matlab、Mathematica或者Maple級別的軟體,估計就得靠他了。Sage誕生於2005年,到目前為止國內關注的還很少,可能一方面是因為dao版的Matlab等軟體實在太方便了,另一方面因為數學系統本身涉及許多非常專業的數學知識,一般程式設計師很少接觸、專業人士又很少注開源。感覺要是能在大學課程(比如抽象代數、數論等)中得到使用的話會有比較好的普及效果。
對於我自己來說,平時從事計算機視覺和機器學習的研究,大概瞭解Sage了之後,也發現大部分純數學的功能自己一般很難用上,其中和我做過的工作比較有關的是有關代數幾何中用Groebner basis解多項式方程組的一些東西,不過自己純是外行,不好說能不能用Sage得到什麼結果。寫這個介紹還是希望Sage能在國內有所發展,對相關的研究人員有所幫助吧。如果對Sage或者計算機視覺感興趣,歡迎來訪問我的部落格cvnote(http://cvnote.info)。
一些參考或相關的連結
官方教程:http://www.sagemath.org/doc/tutorial/index.html
官方中文:http://www.sagemath.org/zh/
國內部落格Lainme’s Blog的教程中文翻譯,部落格上還有一些Sage使用的帖子:http://www.lainme.com/doku.php/topic/sage/start
國內amao部落格男單 618的中文教程翻譯,部落格有很多關於Sage使用的帖子:http://ai7.org/wp/html/682.html