标 题: MAXIMA: Mathematica和Maple之外的另一种选择
发信站: BBS 水木清华站 (Tue Jan 21 14:12:14 2003)
计算机代数系统 MAXIMA 简介
MACSYMA 是 MIT 在 60年代末创造的一种 CAS。它是用 LISP 实现的。
MACSYMA 早期的赞助包括 ARPA, DOE, ... 它运行于一台 ARPAnet 早期的PDP-10主机上。
一直以来 MACSYMA 都是世界上最大的 LISP 程序,用于公式推导和符号计算。
但是由于 MIT 见钱眼开,1982年的时候决定把MACSYMA变成一个关闭源码的商业
程序,帮助销售 LISP 机器。所以产生了很多 MACSYMA 的分支,比如 VAXIMA,
MAXIMA, ... 商业利益的诱惑使得 MIT 从 Berkeley 收回了 50 份正在使用的
MACSYMA 系统,引起很多人不满,使人想起了当年的 AT&T 的作法。
同时也直接导致了 Richard Stallman 从 MIT 辞职,创立自由软
件基金会(FSF)和GNU项目,这样才会有我们今天使用的 GNU/Linux.
商业的 MACSYMA 是由 Symbolics Inc 销售的,后来是 Macsyma Inc,但是
Macsyma Inc 在 1999 年突然不明原因的解体了,程序员各奔东西,众多的用户
失去了支持。
现在的MAXIMA 是 MACSYMA 的一个 GPL 的衍生版本。它是自由软件。
它就是 MACSYMA 未来的希望。虽然以前有 REDUCE, CAMAL, Mathlab-68, PM, ...
但是 MACSYMA 在
Mathematica 和 Maple 出现以前显然是没有对手的。但是现在似乎
Mathematica 和 Maple 已经挤垮了 MACSYMA。不过各有各的好处,MACSYMA 有
最严密的推理系统,因为它久经考验,Maple 和 Mathematica 经常做错的东西
,MACSYMA 经常会给你一个合理的答复。当然它也会做错。
你可以试试积分: integrate(x^i,x) 和
Integrate 1/sqrt(2-2*cos(x)) from x=-pi/2 to pi/2。
Mathematica 4.1 会立即给你一个不完全正确甚至错误的答案。
看看 MACSYMA 遇到这个问题怎么回答你:
(C3) integrate(x^i,x);
它会问你: i+1 等于0吗?
Is i + 1 zero or nonzero?
z; "对,是等于零",结果:
(D3) LOG(x)
再试试说不等于0呢?
(C4) integrate(x^i,x);
Is i + 1 zero or nonzero?
n;
i + 1
x
(D4) ------
i + 1
每次问你这些东西是不是很罗嗦?你可以告诉它,"别再用这些问题烦我,就当
我积分的时候变量都是正数好了":
把ASSUME_POS的值设置为 true:
(C6) ASSUME_POS:true;
(D6) TRUE
(C7) integrate(x^i,x);
i + 1
x
(D7) ------
i + 1
它不问你就直接给出了假设 x>0 的时候的答案。
不仅严密,而且 MACSYMA 有比 Mathematica 和 Maple 方便的推理系统。
你跟 MACSYMA 就像在对话:
看看这个例子:
如果A>=B, B>=C, C>=A, 那么 A=C 吗?
ASSUME(A>=B, B>=C);
ASSUME(C>=A);
IS(EQUAL(A,B));
TRUE
另一个例子:
如果 x>y, 那么x^2 >y^2 吗?
ASSUME(x>y);
IS(x^2>=y^2);
MACSYMA 不能回答你,因为 x,y 的符号未知。
MACSYMA was unable to evaluate the predicate:
2 2
x > y
-- an error. Quitting. To debug this try DEBUGMODE(TRUE);)
现在你告诉它 x 和 y 都是正数:
assume(x>0, y>0);
is(x^2>y^2);
TRUE
这下它告诉你答案了。
它可以根据一些事实来化简式子:
我们有这样一个复杂的式子:
(C11) EXP:-K^2*L^2*M^2*N^2-K^2*L^2*N^2+K^2*M^2*N^2+K^2*N^2
2 2 2 2 2 2 2 2 2 2 2 2
(D11) - K L M N + K M N - K L N + K N
现在告诉它两个简单的事实:
(C12) EQ1:L^2+K^2 = 1
2 2
(D12) L + K = 1
(C13) EQ2:N^2-M^2 = 1
2 2
(D13) N - M = 1
让它根据这两个事实化简第一个式子:
(C14) SCSIMP(EXP,EQ1,EQ2)
得到一个很简单的答案:
4 4
(D14) K N
另外,MACSYMA 是可以用自己的 LISP 程序进行扩展的。比如你可以用 recur
包来推导递推关系:
(C8) load(recur);
(D8) /usr/share/maxima/5.9.0rc3/share/algebra/recur.mac
现在我们来解一个"快速排序"的时间复杂度分析里出现的的递推关系:
T(0)=0
T(N)=2*T(N-1)+1
这样输入到 MACSYMA:
(C14) CHAR(T(N+1)-2*T(N),1,T,N,1,[T(0)=0]);
N
(D14) T(N) = 2 - 1
这个 recur 实际上只是一个200多行的小程序,就可以帮你处理线性递推关系,
生成函数……
MAXIMA 有函数式的程序语言,你甚至可以接触到它底层的 LISP。Mathematica 的语法就
是
跟 MACSYMA 学来的。
当然 Mathematica 能做的有些事情 MAXIMA 做不到。Maple 也是。不过 MAXIMA 能做的很
多事情,Mathematica 和 Maple 都做不到。它们各有各的长处,就看你的需要了。
我对 MAXIMA 还不是很熟,不过从这些地方看的出它是非常方便和聪明的。你可以在
http://sourceforge.net/projects/maxima 免费下载程序,源码,文档……。
--
Work consists of whatever a body is obliged to do.
Play consists of whatever a body is not obliged to do.
-- Mark Twain
※ 修改:・sk8er 于 Jan 21 14:14:40 修改本文・[FROM: 166.111.140.66]
※ 来源:・BBS 水木清华站 smth.org・[FROM: 166.111.140.66]