上流开源免费数学软件之 SageMath

最后更新于:2023年2月24日 下午

SageMath 整合了当前开源的所有高效包,用来取代 MATLAB(20G),Mathematics(5G)等商业软件,而 SageMath 安装包仅 1G 不到,语言基于 Python。而且你还能免费注册账号用基于 Jupyter Notebook 的 SageMath 在线版: Cocalc

GNU Octave 以及 Julia 都想和 Matlab 做兼容,所以编号从 1 开头(Matlab 编号从 1 开头是因为 Fortan 是 1 开头,那时候还没有 C,冷知:识 Matlab 二维矩阵是按列编号的)。苏州同元软控的 MWorks.Syslab 是基于 Julia 的,MWorks.Sysplorer 是基于 Modelica 的。

SageMath 的安装,入门教程在 官网 很容易就找到了,而且下载提供国内镜像下载地址,特别友好。除了入门教程,还有专题教程。语言和 Python 几乎一致。常用的库都默认 import 了,内建的特别好。文件格式:.sage

Macos or Linux 上用 sagemath 体验更好,Windows 上推荐用 WSL 的方式使用

SageMath 特征

  • ^ 等同 **^^ 表示 xor, / 表示分数的除。其它和 Python 一致
  • 交互界面下,有赋值就不输出,表达式会输出(调用 __repr__ 方法)
  • ZZ,QQ,RR,CC 分别表示整数,有理数,实数,复数
  • Tab 补全,vim 姿势退出,git 姿势复制粘贴,很上流
  • (Python)函数和 SageMath 符号表达式是有本质区别的。
  • 自带抽象代数:群,多项式环,\(\mathbb{Z}_n\)\(p\)-adic 数等等。上流
  • latex(expr) :表达式的 latex 形式
  • 可以直接使用 oeis
  • sage.arith.misc 各种杂类函数,sage.games 有几个有意思的。
  • %time: 测时间,? 帮助文章并且可以定位到源码位置查看源码!
  • github 上查看 SageMath 模块源码
  • 线性规划有包 MixIntegerLinearProgram
  • To be Continue

SageMath 主题

自带主题体验较差,推荐使用 linux 主题, 在 $HOME/.sage/init.sage 中写入 %colors Linux

Jupyter Notebook

jupyter 主题

Esc 进入命令模式,Enter 进入编辑模式。快捷键友好(工具栏最右边有快捷键查询)

命令模式常用快捷键(按 Esc 键开启)

快捷键 作用 说明
S 保存当前 NoteBook
Shift-Enter 运行本单元,选中下个单元 新单元默认为命令模式
Ctrl-Enter 运行本单元
Alt-Enter 运行本单元,在其下插入新单元 新单元默认为编辑模式
D,D 删除选中的单元 连续按两个 D 键
Y 单元转入代码状态
M 单元转入 markdown 状态
R 单元转入 raw 状态 保持原始格式
B 当前行下方插入一行,并进入该行
Shift-H 清空所有输出 个人定制哈哈

编辑模式常用快捷键( 按 Enter 键启动)

快捷键 作用 说明
Tab 代码补全或缩进
Shift-Tab 提示
Ctrl-] 缩进 向右缩进
Ctrl-[ 解除缩进 向左缩进
Ctrl-/ 注释整行/撤销注释 仅代码状态有效
Ctrl-Z 撤销
Ctrl-ShiftZ 重做
Ctrl-Y 重做
Ctrl-Home 跳到单元开头
Ctrl-Up 跳到单元开头
Ctrl-End 跳到单元末尾
Ctrl-Down 跳到单元末尾

Jupyter Notebook 在绘图方面特别方便,而且可以将代码和 Markdown 很清楚的写在一起

Jupyter 卡顿时候一定要强制中断!有数字的说明运行好了的!

SageMath 文档

入门教程用户手册所有模块

模块索引(首字母) 模块全名(sage.
a algebra, arith
c calculus, categories, coding, combinat, cPython , crypto
d date_structures, databases, docs, doctest, dynaimics
e, f ext, features, finance, functions
g game_theory, games, geometry, graphs, groups
h, i knots, lfuntions libs, logic
m manifolds, matrix, matroids media, misc, modular, modules, monoids
n, p, q, r numerical, parallel, plot probability, quadratic_forms, quivers, repl, rings
s, t sandpiles, sat, schemes, sets, stats, structure, symbolic, tensor, typeset

记不清名字的时候多用代码补全!

先找对应名字,再找对应模块中的函数,最后看手册用的例子。

应用实例

文件保存为 .ipynb 而非 .sage 文件,方便在 VScode 中调用 jupyter(注意选择 kernel 为 Sage 即可,补全 tab 前要 esc)

多元多项式以某一个作为变量,其它看作常量的做法

二元的做法:

1
2
3
4
5
6
7
8
9
10
R.<x, y> = PolynomialRing(QQ, 2)
S = QQ['x']['y']
T = QQ['y']['x']

f = x^3 * y^2 + 4 * x^2 * y + 3 * x * y + x + 2 * y
sf = str(f)

print(f)
print(S(sf))
print(T(sf))

多元的做法:

1
2
3
4
5
6
7
8
9
10
11
def simplyi(R, f, i):
rg = R.gens()
sg = rg[:i] + rg[i + 1:]
S = R.base_ring()[sg][rg[i]]
return S(f)

R.<x, y> = PolynomialRing(QQ, 2)
f = x^3 * y^2 + 4 * x^2 * y + 3 * x * y + x + 2 * y
print(f)
print(simplyi(R, f, 0))
print(simplyi(R, f, 1))