本身博客上寫的入門,原文地址:http://cvnote.info/SAGE入門:開源數學系統之集大成者 php
最近在學習Sage這款開源數學軟件系統,百度了一下發現國內關注的還比較少,因此寫一個Sage的介紹吧。 html
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的一些功能。 ui
地址:http://www.sagenb.org/ spa
也能夠在本地Sage命令行下使用 notebook() 開啓,至關於Maple的工做簿Worksheet,雖然看着有點簡陋,但功能仍是很強大的,能夠輸入Sage 命令,渲公式、顯示圖形等。
地址:https://cloud.sagemath.com/
SageMathCloud相似於一個在線的寫做編程平臺,註冊後能夠在裏面創建工程,編輯各類源文件。這裏創建了一個test工程,而後新建了一個.sagews(Sage Worksheet)工做簿文件,界面和Maple的worksheet很像,能夠在裏面輸入代碼,點擊運行鍵能夠顯示結果。
雖然目前仍是beta版可是感受仍是挺好用的。除了Worksheet還能夠新建terminal,效果和本地的Linux terminal同樣,輸入 sage 能夠進入Sage命令行,用法和Python命令行很像,可使用 help() 和tutorial()產看幫助與教程。
和大多數數學軟件系統同樣,很簡單易用。好比求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
)
|
能夠獲得
除了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是一個作數論的包(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用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() 都至關於類型轉換,限定運算在有理數域上進行。另外這裏的特徵向量沒有單位化,由於是在有理數域上。
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) 則會
經過 \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