Maxima简介2:修订间差异
Dbzhang800(留言 | 贡献) 小无编辑摘要 |
|||
(未显示2个用户的7个中间版本) | |||
第3行: | 第3行: | ||
作者:王垠 | 作者:王垠 | ||
整理:dbzhang800 | |||
(依据最新版Maxima对部分内容做了改动) | (依据最新版Maxima对部分内容做了改动) | ||
第45行: | 第45行: | ||
而不会再问你问题了。 | 而不会再问你问题了。 | ||
== 方便的推理== | == 方便的推理 == | ||
不仅严密,而且 MAXIMA 有比 Mathematica 和 Maple 方便的推理系统。你跟 MAXIMA 就像在对话: | 不仅严密,而且 MAXIMA 有比 Mathematica 和 Maple 方便的推理系统。你跟 MAXIMA 就像在对话: | ||
看看这个例子: 如果A | 看看这个例子: 如果A>=B, B>=C, C>=A, 那么 A=C 吗? | ||
(%i1) assume(A | (%i1) assume(A>=B, B>=C); | ||
(%o1) | (%o1) [A >= B, B >= C] | ||
(%i2) assume(C | (%i2) assume(C>=A); | ||
(%o2) | (%o2) [C >= A] | ||
(%i3) is(equal(A,B)); | (%i3) is(equal(A,B)); | ||
(%o3) | (%o3) true | ||
另一个例子: 如果 x | 另一个例子: 如果 x>y, 那么x^2 >y^2 吗? | ||
(%i4) assume(x | (%i4) assume(x>y); | ||
(%o4) | (%o4) [x > y] | ||
(%i5) is(x^2 | (%i5) is(x^2>=y^2); | ||
(%o5) unknown | |||
MAXIMA 告诉你答案不确定,因为 x,y 的符号未知。 现在你告诉它 x 和 y 都是正数: | |||
(%i6) assume(x>0, y>0); | |||
(%i6) assume(x | (%o6) [x > 0, y > 0] | ||
(%i7) is(x^2>y^2); | |||
(%o6) | |||
(%i7) is(x^2 | (%o7) true | ||
(%o7) | |||
这下它告诉你答案了。 | 这下它告诉你答案了。 | ||
第87行: | 第83行: | ||
(%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 | (%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) | (%o11) - K L M N + K M N - K L N + K N | ||
我们还有两个简单的事实: | 我们还有两个简单的事实: | ||
(%i12) EQ1:L^2+K^2 = 1 | (%i12) EQ1:L^2+K^2 = 1 | ||
2 2 | |||
(%o12) | (%o12) L + K = 1 | ||
(%i13) EQ2:N^2-M^2 = 1 | (%i13) EQ2:N^2-M^2 = 1 | ||
2 2 | |||
(%o13) | (%o13) N - M = 1 | ||
让它根据这两个事实化简第一个式子: | 让它根据这两个事实化简第一个式子: | ||
第104行: | 第100行: | ||
得到一个很简单的答案: | 得到一个很简单的答案: | ||
4 4 | |||
(%o14) K N | |||
(%o14) | |||
== 抽象代数== | == 抽象代数== | ||
第177行: | 第172行: | ||
MAXIMA 完全是用 LISP 语言写的,所以它继承了 LISP 语言天生的特征。它分为上下两层,上面一层叫做 MAXIMA level,下面一层叫做 LISP level。上下两层是相通的,如果你懂得 LISP,你可以随时按 Ctrl-C 进入到 LISP 的环境,定义一个函数,然后退回到 MAXIMA 层调用那个函数。当然在 LISP level 还有很多工作可以做。你也可以在 MAXIMA level 定义了函数,然后在 LISP level 进行调用。 | MAXIMA 完全是用 LISP 语言写的,所以它继承了 LISP 语言天生的特征。它分为上下两层,上面一层叫做 MAXIMA level,下面一层叫做 LISP level。上下两层是相通的,如果你懂得 LISP,你可以随时按 Ctrl-C 进入到 LISP 的环境,定义一个函数,然后退回到 MAXIMA 层调用那个函数。当然在 LISP level 还有很多工作可以做。你也可以在 MAXIMA level 定义了函数,然后在 LISP level 进行调用。 | ||
[[Category:Maxima]] |
2010年4月17日 (六) 16:31的最新版本
原文地址:http://docs.huihoo.com/homepage/shredderyin/maxima.html
作者:王垠
整理:dbzhang800
(依据最新版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); (%o5) unknown
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 进行调用。