查看“Maxima简介2”的源代码
来自Ubuntu中文
←
Maxima简介2
跳到导航
跳到搜索
因为以下原因,您没有权限编辑该页面:
您请求的操作仅限属于该用户组的用户执行:
用户
您可以查看和复制此页面的源代码。
原文地址:http://docs.huihoo.com/homepage/shredderyin/maxima.html 作者:王垠 整理:dbzhang (依据最新版Maxima对部分内容做了改动) Maxima: http://wiki.ubuntu.org.cn/Maxima ==简介== MAXIMA 是完全可以跟 Mathematica 和 Maple 比美的 CAS。实际上 Mathematica 和 Maple 的很多优点都是从 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 会立即给你一个不完全正确甚至错误的答案。 在这种情况下,MAXIMA 的表现要聪明的多,因为它毕竟有几十年的经验。MAXIMA 缺省是一个非常严密的系统,如果你要积分: integrate(x^i,x); MAXIMA 会问你: Is i + 1 zero or nonzero? 这是因为现在我们不知道 i 是否等于 -1。如果 i=-1, 那么这个积分应该等于 LOG(x),其中 LOG 是 MAXIMA 的自然对数符号。如果 i 不等于 -1,那么积分应该等于 i + 1 x ------ i + 1 这样每次都要问你有时很麻烦,你也可以告诉它,没有特殊指明的情况下,假设积分里的符号都是正数: assume_pos: True; 它以后遇到 integrate(x^i,x); 就会直接给你 i + 1 x ------ i + 1 而不会再问你问题了。 == 方便的推理== 不仅严密,而且 MAXIMA 有比 Mathematica 和 Maple 方便的推理系统。你跟 MAXIMA 就像在对话: 看看这个例子: 如果A>=B, B>=C, C>=A, 那么 A=C 吗? (%i1) assume(A>=B, B>=C); (%o1) [A >= B, B >= C] (%i2) assume(C>=A); (%o2) [C >= A] (%i3) is(equal(A,B)); (%o3) true 另一个例子: 如果 x>y, 那么x^2 >y^2 吗? (%i4) assume(x>y); (%o4) [x > y] (%i5) is(x^2>=y^2); MACSYMA was unable to evaluate the predicate: 2 2 x >= y -- an error. Quitting. To debug this try DEBUGMODE(TRUE);) MAXIMA 不能回答你,因为 x,y 的符号未知。 现在你告诉它 x 和 y 都是正数: (%i6) assume(x>0, y>0); (%o6) [x > 0, y > 0] (%i7) is(x^2>y^2); (%o7) true 这下它告诉你答案了。 它可以根据一些事实来化简式子。我们有这样一个复杂的式子: (%i11) 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 (%o11) - K L M N + K M N - K L N + K N 我们还有两个简单的事实: (%i12) EQ1:L^2+K^2 = 1 2 2 (%o12) L + K = 1 (%i13) EQ2:N^2-M^2 = 1 2 2 (%o13) N - M = 1 让它根据这两个事实化简第一个式子: (%i14) scsimp(EXP,EQ1,EQ2) 得到一个很简单的答案: 4 4 (%o14) K N == 抽象代数== 在你还没有函数的定义时,你就可以声明这个函数的一些性质。这样你可以在很多时候大大简化结果。比如,你可以声明一个函数是奇函数: (%i1) declare(F,oddfun); (%o1) done (%i2) F(-A); (%o2) -F(A) F(-A) 以后简化时就可以被当成 -F(A)。你再声明 F(X) 是 OUTATIVE: (%i5) declare(F,outative); (%o5) done (%i6) F(3*A); (%o6) 3 F(A) 这样,F(3a) 可以被当成 3F(a)。综合以上两个事实,我们可以得到: (%i7) F(-A)+F(2*A)-F(A); (%o7) 0 如果你告诉 MAXIMA,n 是一个整数,那么它就知道 sin(n pi) = 0. (%i1) declare(n,integer); (%o1) done (%i2) sin(n*%pi); (%o2) 0 你甚至可以定义自己的操作符,它可以有中缀,前缀,后缀,nary等各种方式,可以有任意的优先级,可以设定它是左结合还是右结合。比如我们来定义一个NARY操作 "&",它的优先级是180(缺省),它是右结合的。 (%i6) nary("&"); (%o6) "&" (%i7) declare("&",passociative); (%o7) done (%i8) x&y&a&b; (%o8) x & (y & (a & b)) == 超强的扩展能力== 另外,MAXIMA 是可以用自己的语言或者 LISP 进行扩展的。比如你可以用 recur 包来推导递推关系: (%i8) load(recur); (%o8) /usr/share/maxima/5.9.0rc3/share/algebra/recur.mac 现在我们来解一个“快速排序”的时间复杂度分析里出现的简单的递推关系: T(0)=0 T(N)=2*T(N-1)+1 这样输入到 MAXIMA: (%i14) char(T(N+1)-2*T(N),1,T,N,1,[T(0)=0]); N (%o14) T(N) = 2 - 1 这个 recur 实际上只是一个200多行的小程序,就可以帮你处理线性递推关系, 生成函数…… MAXIMA 有函数式的程序语言,它比通常的过程式语言要强大的多。你甚至可以接触到它底层的 LISP。Mathematica 的语法就是跟 MACSYMA 学来的。 MAXIMA 完全是用 LISP 语言写的,所以它继承了 LISP 语言天生的特征。它分为上下两层,上面一层叫做 MAXIMA level,下面一层叫做 LISP level。上下两层是相通的,如果你懂得 LISP,你可以随时按 Ctrl-C 进入到 LISP 的环境,定义一个函数,然后退回到 MAXIMA 层调用那个函数。当然在 LISP level 还有很多工作可以做。你也可以在 MAXIMA level 定义了函数,然后在 LISP level 进行调用。
返回
Maxima简介2
。
导航菜单
页面操作
页面
讨论
阅读
查看源代码
历史
页面操作
页面
讨论
更多
工具
个人工具
登录
导航
首页
最近更改
随机页面
页面分类
帮助
搜索
编辑
编辑指南
沙盒
新闻动态
字词处理
工具
链入页面
相关更改
特殊页面
页面信息