Maxima is a computer program for doing mathematics calculations, symbolic manipulations, numerical computations and graphics. Procedures can be programmed and then run by Maxima to do complex tasks. Much of the syntax for other languages such as Maple was copied from Maxima.
Maxima 是一个能够进行数学计算,符号运算,数值计算以及图形操作的计算机程序。在maxima中可以编写过程来完成复杂的任务。许多其它计算机代数系统的语法都是学Maxima而来,比如Maple.
Maxima的前身是DOE-MACSYMA 。MACSYMA 是 MIT 在 60年代末创造的一种 CAS。它是用 LISP 实现的。由于 MIT 1982年的时候决定把MACSYMA 变成一个关闭源码的商业程序,所以产生了很多 MACSYMA 的分支。现在的MAXIMA 是 MACSYMA 的一个 GPL 的衍生版本,它是自由软件。你可以在 http://sourceforge.net/projects/maxima 免费下载。如果不是从源码安装,你需要下 载一个 maxima 和一个 maxima-exec 包。推荐用 maxima-exec_gcl,因为用这个你不 需要再安装 LISP 解释器了。
Maxima分字符界面和图形界面(Xmaxima)。如果想想TeX一样显示输出中的数学符号,建议用TEXmacs作为图形界面前端。
(C1) integrate(1/(1+x^3),x); 2 x - 1 2 ATAN(-------) LOG(x - x + 1) SQRT(3) LOG(x + 1) (D1) - --------------- + ------------- + ---------- 6 SQRT(3) 3 (C37) integrate(x/(1+x^3),x); 2 x - 1 2 ATAN(-------) LOG(x - x + 1) SQRT(3) LOG(x + 1) (D37) --------------- + ------------- - ---------- 6 SQRT(3) 3 C39) integrate(1/(1+x^2),x,0,1); %PI (D39) --- 4 (C4) diff(cos(x),x); d (D4) -- (COS(x)) dx
(C12) block([FPPREC:40],bfloat(%pi)); (D12) 3.141592653589793238462643383279502884197B0 (C13) block([FPPREC:40],sin(bfloat(%pi))); (D13) - 4.550434165703032601529883292421187489591B-41
(C17) limit((2*x+1)/(3*x+2),x,inf); 2 (D17) - 3 (C18) limit(sin(3*x)/x,x,0); (D18) 3
(C22) plot2d(sin(x),[x,0,2*%pi]); (D22) (C23) plot3d(x^2-y^2,[x,-2,2],[y,-2,2],[grid, 12,12]); (D23)
(C26) solve([x+y+z=5,3*x-5*y=10,y+2*z=3],[x,y,z]); 45 1 19 (D26) [[x = --, y = --, z = --]] 13 13 13 (C27) solve(x^2-5*x+6=0, x); (D27) [x = 3, x = 2]
(C28) ode2('diff(y,x)+3*x*y=sin(x)/x, y,x);
2
2 3 x
3 x ----
- ---- / 2
2 [ %E SIN(x)
(D28) y = %E (I ------------- dx + %C)
] x
/
(C29) ode2('diff(y,x)-y=1,y,x);
- x x
(D29) y = (%C - %E ) %E
(C30) ode2('diff(y,x,2)-y=1,y,x);
/ 2 x
- x [ %E
(D30) y = - %E (I ----------------------------- dx
] d x 2 x d - x
/ -- (%E ) - %E (-- (%E ))
dx dx
/
2 x [ 1 x - x
- %E I ----------------------------- dx) + %K1 %E + %K2 %E
] d x 2 x d - x
/ -- (%E ) - %E (-- (%E ))
dx dx
(C31) A:matrix([1,2],[3,4]); [ 1 2 ] (D31) [ ] [ 3 4 ] (C32) B:matrix([1,1],[1,1]); [ 1 1 ] (D32) [ ] [ 1 1 ] (C33) A+B; [ 2 3 ] (D33) [ ] [ 4 5 ] (C34) A.B; [ 3 3 ] (D34) [ ] [ 7 7 ] (C35) A^^-1; [ - 2 1 ] [ ] (D35) [ 3 1 ] [ - - - ] [ 2 2 ] (C36) determinant(matrix([a,b],[c,d])); (D36) a d - b c
(C23) fib[0]:0; (D23) 0 (C24) fib[1]:1; (D24) 1 (C25) fib[n]:=Fib[n-1]+Fib[n-2]; (D25) FIB := FIB + FIB n n - 1 n - 2 (C29) fib[20]; (D29) 6765是不是很神奇啊,这就是LISP的递归功能,不过这里Fib不是正式的函数,应当是数列。下面我们看正式函数的定义:
(C30) f(x):=x+2; (D30) f(x) := x + 2 (C31) f(3); (D31) 使用block函数可以增加局部变量并且可以使用多个语句 (C42) g(x):=block([u:x+3,w],u:u^2,w:(y+2)^2,u+w); 2 2 (D42) g(x) := BLOCK([u : x + 3, w], u : u , w : (y + 2) , u + w) (C43) g(2); 2 (D43) (y + 2) + 25 5 使用IF语句 (D52) h(x) := BLOCK([u : x + 3, w], u : u , 2 2 IF u < 3 THEN w : (y + 2) ELSE w : (y + 2) + 1, u + w) (C53) [h(3),h(2)]; 2 2 (D53) [(y + 2) + 37, (y + 2) + 26] 使用循环,注意如果末尾的w不写,循环总是返回'DONE (C56) block([w:0], for i:1 thru 10 do (w:w+i^2),w); (D56) 385
Maxima简单介绍这么多就差不多了,要想查函数的说明可以用describe("log");all;命令。 更详细的介绍请参见info手册