SAGE入门:开源数学系统之集大成者

自己博客上写的入门,原文地址: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

地址:http://www.sagenb.org/

也可以在本地Sage命令行下使用 notebook() 开启,相当于Maple的工作簿Worksheet,虽然看着有点简陋,但功能还是很强大的,可以输入Sage 命令,渲公式、显示图形等。

Sage Notebook
Sage Notebook

SageMathCloud

地址:https://cloud.sagemath.com/

SageMathCloud类似于一个在线的写作编程平台,注册后可以在里面建立工程,编辑各种源文件。这里建立了一个test工程,然后新建了一个.sagews(Sage Worksheet)工作簿文件,界面和Maple的worksheet很像,可以在里面输入代码,点击运行键可以显示结果。

Sage Worksheet
Sage Worksheet

虽然目前还是beta版但是感觉还是挺好用的。除了Worksheet还可以新建terminal,效果和本地的Linux terminal一样,输入 sage 可以进入Sage命令行,用法和Python命令行很像,可以使用 help() 和tutorial()产看帮助与教程。

sage-intro-term
Sage Could Terminal

基本计算

和大多数数学软件系统一样,很简单易用。比如求2013的质因子:

sage : x = 2013
sage : f = factor ( x )
sage : f
3 * 11 * 61
或者矩阵求逆

sage : matrix ( [ [ 1 , 2 ] , [ 3 , 4 ] ] ) ^ ( - 1 )
[ - 2 1 ]
[ 3 / 2 - 1 / 2 ]
符号计算

Sage的符号计算非常好用,可以用 x = var('var_name') 声明符号变量。例如求一个函数的积分

sage : a = var ( 'a' )
sage : x = var ( 'x' )
sage : f = a * sin ( x ) + 1 / x
sage : f . integrate ( x )

  • a* cos ( x ) + log ( x )
    或者解个方程

sage : solve ( x ^ 2 + a , x )
[ x == - sqrt ( - a ) , x == sqrt ( - a ) ]
绘图功能

比如画出上面 f = a * sin(x) + 1 / x 在a=1时,在x=1~10的图像。 figsize 为图像大小

sage : f = f . substitute ( a == 1 )
sage : plot ( f , ( x , 1 , 10 ) , figsize = 2 )
可以得到

Sage Plot
Sage Plot

除了2D,Sage还支持3D绘图,具体可以查看文档。

基本的数域与环

Sage支持在整数环( ZZ)、有理数域( QQ)、实数域( RR)、复数域( CC),以及更高级的多项式环、有限域(Finite Field)等集合上进行计算。这里要顺便复习一下抽象代数,比如一些简单的概念:

sage : QQ . gens ( ) # 有理数域的单位元和零元素
( 1 , )
sage : QQ . zero ( )
0
sage : CC . gens ( ) # 复数域的单位元和零元素
( 1.00000000000000 * I , )
sage : CC . zero ( )
0.000000000000000
运算的范围不同,结果也不同。例如:

: 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吧还是

在gcd(a,m)=1时,定义a对模m的指数Ord_m(a)为使a^d \equiv 1 \pmod{m}成立的最小的正整数d。由前知Ord_m(a) 一定小于等于 \phi (m),若Ord_m (a) = \phi (m),则称a是模m的原根。

对正整数(a,m)=1,如果 a 是模 m 的原根,那么 a 是整数模n乘法群(即加法群 Z/mZ 的可逆元,也就是所有与 m 互素的正整数构成的等价类构成的乘法群)Zn×的一个生成元。

生成元是一个很数论中很重要的概念,在一个整数模n乘法群中,生成元可以通过不断与自己相乘(然后再模n),生成群中的所有元素。元根可以用PARI中的 znprimroot(n) 函数来求。

sage : gp ( 'znprimroot(7)' )
Mod ( 3 , 7 )

sage : pari ( 'znprimroot(7)' )
Mod ( 3 , 7 )
得到3是模7乘法群的一个元根。

用Maxima在有理域求矩阵特征向量

Maxima用LISP编写的计算机代数系统 (Computer Algebra System),前身是Macsyma,Matlab和Mathematica等软件的出现都受到在Macsyma的影响。在Sage中可以方便调用Maxima代数系统。例如下面在求特征向量并转换到有理域向量空间的例子,代码同样来自官网Sage Tutorial,加了一些注释:

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 # 验证特征值定义Av = lambda1v
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输出。例如:

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容

  • TF API数学计算tf...... :math(1)刚开始先给一个运行实例。tf是基于图(Graph)的计算系统...
    MachineLP阅读 3,341评论 0 1
  • 高中时候,班上有个姑娘,名珊,长得特好看。漂亮中透着一股灵动,很是招人,且性格开朗,属于人见人爱型,所以身边总是有...
    闲倚危楼晋云生阅读 238评论 1 0
  • 有效的本地 cache 机制,可以避免不必要的重复网络加载,不仅能提高相关应用场景的资源加载速度,也可以避免不必要...
    coderanger阅读 3,914评论 0 3
  • 又一次在宁波的酒店,上一次在宁海是在2013年了,当时是作为采购来供应商考核下,看看实际的能力。再上次大概在201...
    娟姐的心语话廊阅读 1,337评论 0 0
  • 像头贪婪的怪兽 历经长途跋涉,气势汹汹 闪电般锲入我的身体 时间慢下来,一切慢下来 慢,最慢的是无边无际的黑夜 那...
    仗剑走天涯y阅读 537评论 1 10