Maxima is included with Sage, as is clisp (a version of the Lisp
language). An open source
Tk/Tcl-based plotting program used by Maxima, openmath
,
is also distributed with Sage.
However, the gnuplot package (which Maxima uses by default for plotting)
is distributed as a Sage optional package.
Among other things, Maxima does symbolic manipulation. Maxima can
integrate and differentiate functions symbolically, solve 1st
order ODEs, most linear 2nd order ODEs, and has implemented the
Laplace transform method for linear ODEs of any degree. Maxima also
knows about a wide range of special functions, has plotting
capabilities via gnuplot, and has methods to solve and manipulate
matrices (such as row reduction, eigenvalues and eigenvectors), and
polynomial equations.
We illustrate the Sage/Maxima interface by constructing the matrix
whose
entry is
, for
.
sage: f = maxima.eval('ij_entry[i,j] := i/j') sage: A = maxima('genmatrix(ij_entry,4,4)'); A matrix([1,1/2,1/3,1/4],[2,1,2/3,1/2],[3,3/2,1,3/4],[4,2,4/3,1]) sage: A.determinant() 0 sage: A.echelon() matrix([1,1/2,1/3,1/4],[0,0,0,0],[0,0,0,0],[0,0,0,0]) sage: A.eigenvalues() [[0,4],[3,1]] sage: A.eigenvectors() [[[0,4],[3,1]],[1,0,0,-4],[0,1,0,-2],[0,0,1,-4/3],[1,2,3,4]]
Here's another example:
sage: A = maxima("matrix ([1, 0, 0], [1, -1, 0], [1, 3, -2])") sage: eigA = A.eigenvectors() sage: V = VectorSpace(QQ,3) sage: eigA [[[-2,-1,1],[1,1,1]],[0,0,1],[0,1,3],[1,1/2,5/6]] sage: v1 = V(sage_eval(repr(eigA[1]))); lambda1 = eigA[0][0][0] sage: v2 = V(sage_eval(repr(eigA[2]))); lambda2 = eigA[0][0][1] sage: v3 = V(sage_eval(repr(eigA[3]))); lambda3 = eigA[0][0][2] sage: M = MatrixSpace(QQ,3,3) sage: AA = M([[1,0,0],[1, - 1,0],[1,3, - 2]]) sage: b1 = v1.base_ring() sage: AA*v1 == b1(lambda1)*v1 True sage: b2 = v2.base_ring() sage: AA*v2 == b2(lambda2)*v2 True sage: b3 = v3.base_ring() sage: AA*v3 == b3(lambda3)*v3 True
Finally, we give an example of using Sage to plot using openmath
. Many
of these were modified from the Maxima reference manual.
A 2D plot of several functions (do not type the ...
):
sage: maxima.plot2d('[cos(7*x),cos(23*x)^4,sin(13*x)^3]','[x,0,1]',\ ... '[plot_format,openmath]') # not tested
A ``live'' 3D plot which you can move with your mouse (do not type the ...
):
sage: maxima.plot3d ("2^(-u^2 + v^2)", "[u, -3, 3]", "[v, -2, 2]",\ ... '[plot_format, openmath]') # not tested sage: maxima.plot3d("atan(-x^2 + y^3/4)", "[x, -4, 4]", "[y, -4, 4]",\ ... "[grid, 50, 50]",'[plot_format, openmath]') # not tested
The next plot is the famous Möbius strip (do not type the ...
):
sage: maxima.plot3d("[cos(x)*(3 + y*cos(x/2)), sin(x)*(3 + y*cos(x/2)),\ ... y*sin(x/2)]", "[x, -4, 4]", "[y, -4, 4]",\ ... '[plot_format, openmath]') # not tested
The next plot is the famous Klein bottle (do not type the ...
):
sage: maxima("expr_1: 5*cos(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)\ ... - 10.0") 5*cos(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)-10.0 sage: maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)") -5*sin(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0) sage: maxima("expr_3: 5*(-sin(x/2)*cos(y) + cos(x/2)*sin(2*y))") 5*(cos(x/2)*sin(2*y)-sin(x/2)*cos(y)) sage: maxima.plot3d ("[expr_1, expr_2, expr_3]", "[x, -%pi, %pi]",\ ... "[y, -%pi, %pi]", "['grid, 40, 40]",\ ... '[plot_format, openmath]') # not tested
See About this document... for information on suggesting changes.