Today, a student turned in some Maxima work for my class. I discovered he had successfully used the command **derivative()** in place of **diff()** with seemingly identical results. I verified that the same thing works in several versions of Maxima I have installed on my windows computer. Who knew?

# Category: Multivariable Calculus

## Multiple plots in a single Maxima figure

In MATLAB, I often use the **subplot()** command to make an array of multiple plots in a single figure.

In Maxima, we can achieve that by generating each of the subplots using **gr2d()**, and then putting them all together with a call to **draw()** or **wxdraw()**:

There’s an optional **columns** argument — the subplots are drawn row-wise in an array with the specified number of columns:

And of course all this works for 3d plots using **gr3d()**:

## 3D Printing and Maxima

In response to several nearly simultaneous queries, I’ve been working this week on generating a 3D plot and creating a mesh file from within Maxima that is suitable for exporting to a 3D printer.

As a guide, I used this 2012 article from the Mathematical Intelligencer by Henry Segerman. The idea is to draw a surface using traces made from parametric tubes, then export that to a .PLY format file.

Here’s my prototype for the process of generating the surface, reading in the resulting gnuplot data file, identifying faces appropriately, and writing into a .PLY file.

That isn’t yet ready for the 3D printer, but I could load it into the free program MeshLab, and from there convert to .STL

Here’s my figure from Maxima:

And the resulting .PLY file loaded into MeshLab

Here’s a few seconds of video from the printing process

And 2.5 hours later, the low resolution first-try 3D printed object:

## Computing and Visualizing Path Integrals of Vector Fields

A few months ago, I posted my path integral functions, which are included in the MATH214 package. Recently, I came across something I’d been looking for: a Maxima utility for visualizing vector fields. Its in the Maxima/Share directory under drawutils.

Written in 2010 by Donald J Bindner, the commands **plot_vector_field** and **plot_vector_field3d** do almost everything I was looking for. The drawback is that I wanted to plot the vector fields along with the integration path. I modified those two commands slightly into versions called **make_vector_field** and **make_vector_field3d **to produce the lists of vectors for plugging into draw2d and draw3d, so that I could include the vector fields in bigger graphics calls. My modifications are available here.

Here’s what the path integral command and the vector field generator look like on an example from chapter 13 of Stewart’s “Calculus Concepts and Contexts”

## Solvers!

A few months ago, when I was very new to Maxima, I posted my solutions to several multivariable optimization problems, and included a standard constrained optimization example for which the built in command **solve** failed.

Here’s the problem:

In my multivariable calculus class, we’ve just encountered that problem again. What my students and I discovered was that the order of the variables as specified by the user in the argument list caused the command to either succeed or fail, as you can see from the first two lines below:

I wrote to the experts at maxima-discuss@lists.sourceforge.net. They replied en masse very quickly and were very generous with their time and advice. They verified the problem, pointing out that solving systems of equations is really complicated, and that the solve program seeks to solve for the variables one at a time and things can go wrong if an inauspicious order of variables is followed.

The experts also tried our problem with the package to_poly_solve, and happily it succeeded without the hassle of needing to specify the variables in the right order. For **solve** users who reference the solutions it produces as elements of a list, direct use of **to_poly_solve** presents a challenge due to output in a format different from that of **solve — t0_poly_solve **returns solutions as a set with %union.

I’ve written a little wrapper Ksolve.mac that is called like **solve **as illustrated above.

In **Ksolve** if an initial call to **solve** fails, the process automatically upgrades to **to_poly_solve** in several variations, and (hopefully) returns solutions in the same format as **solve**.

## Maxima for maxima (and minima) of functions z=f(x,y)

Together with the 3D graphing capabilities of Maxima, we can bring symbolic differentiation and the numerical solver to bear when we seek local extrema of a surface.

Here is a link to the html export of a wxMaxima session where I work on two examples from my multivariable calculus class. And here is the wxMaxima session.

## The MATH214 package for multivariable calculus

I’ve written a suite of Maxima commands for use in multivariable calculus class. The package includes:

cross, dot, len, unitT, unitN, unitB, curvature, integratePaths, integratePathv2, integratePathv3, grad, div, curl

To use these commands:

- download MATH214.zip
- extract (unzip) the contents into a directory you can find later.
- In wxMaxima, select
**File—Load Package…**then navigate to the directory in step 2. above and select**MATH214.mac**The result should be an automatically generated input line similar to:

Examples showing these commands being executed in wxMaxima can be found here. In addition, the .zip file also contains these examples in the wxMaxima session file **math214_testfunctions.wxmx **that you can load into your wxMaxima session.

It is only necessary to download and extract MATH214.zip once, but you will need to load the package (step 3 above) in each new wxMaxima session you’d like to use any of these commands.

Note that these commands duplicate existing Maxima functionality (like dot(x,y) and x.y) or perform similarly to other packages (like vect). The purpose here is for the commands in MATH214 to have a calling syntax that closely follows the way we have defined these operations analytically in class, while avoiding the unfortunate namespace conflicts between the existing packages vect and draw that has been recently documented.