In MATLAB, I occasionally have need for the plotyy() command for making a plot of two different functions with widely varying scales.

Turns out Maxima draw has an equivalent functionality by setting the option **yaxis_secondary**:

Skip to content
# Tag: Maxima

## Two y axes in Maxima 2D plots

## A pause() function for Maxima

** (function-name argument)**
**?function-name(argument)**
** pause();**
** pause(pausetime=3);**
## Multiple plots in a single Maxima figure

## Maxima Language Syntax Highlighting in Notepad++

## Popularity of CAS software: Maxima, Mathematica, Maple

## A Package of Maxima Utilities for my Ordinary Differential Equations Course: MATH280.mac

## Solving Rational Inequalities in Maxima: solve_rat_ineq()

## cumsum(): Cumulative Sum in Maxima

## Jordan Canonical Form in Maxima

## Solve Ax=b in Maxima, part 2

In MATLAB, I occasionally have need for the plotyy() command for making a plot of two different functions with widely varying scales.

Turns out Maxima draw has an equivalent functionality by setting the option **yaxis_secondary**:

In MATLAB, **pause** interrupts execution of a loop until the user strikes a key, and **pause(<n>)** pauses for **<n>** seconds before resuming execution.

Here’s my attempt at a **pause()** function for Maxima that works in a similar way to MATLAB. It uses Maxima’s **read()** to stop everything and wait for user input, and it uses the lisp function **sleep** to stop for a fixed number of seconds.

**note that a lisp function

can be called inside Maxima as

I’m not happy that in order to resume after the pause, the user needs to enter a valid character (space or nothing results in an error) followed by CTRL-SHIFT. I hope to either figure something else out or even better hear suggestions from other Maxima users!

pause([options]):=block([tsecs], tsecs:assoc('pausetime,options,0), if tsecs=0 then read("Execution Paused...enter any character then CTRL-ENTER") else( disp(sconcat("paused for ", tsecs," seconds")), ?sleep(tsecs)), return("") );

call this either as

or, for a three second pause

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()**:

Notepad++ is lots of people’s favorite text editor for Windows. I use it every day.

A little googling around led me to a Notepad++ user-defined syntax highlighting file for the Maxima language, written by David Scherfgen and shared at the Maxima-Discuss list.

I made a little change to the file that overcame a nagging difficulty — I found that .mac file extensions weren’t automatically being recognized upon opening.

Here’s a link to my modifed file.

To include Maxima syntax highlighting in Notepad++ do this:

- unzip the downloaded file MaximaNotepadDS.zip
- in Notepad++, go to
**Language –> Define your language…** - Press
**Import**and navigate to the file MaximaNotepadDS.xml - Quit Notepad++ and then start the program again.
- Now in
**Language**menu, you’ll see Maxima in the list of languages at the bottom of the drop-down menu - A .mac file already open won’t display with the new syntax highlighting, but any .mac file you open or save from new will automatically show with syntax highlighting.

I was looking recently at the PYPL PopularitY of Programming Language.

That site ranks popularity of programming languages (Java is #1) using Google Trends tools based on searches of the form <Language Name> Tutorial. I did my own Google Trend search, comparing the 3M of Computer Algebra Systems: Maple, Mathematica, and Maxima using the Tutorial criteria as at PYPL.

With the data from Google Trends, I computed the proportion of the total 3M monthly searches for each program. Here’s how that looks over time since 2004:

It appears to me that Maxima is slowly and steadily gaining with nearly 20% share, Maple is currently at about 30%, and Mathematica at 50%. Does anybody know what happened between 2006 and 2013 to account for the increase in popularity of Mathematica and decrease for Maple?

I’ve put together a collection of functions — some direct quotes of other contributed functions, some renamed or repackaged, and some newly implemented — for various needed tasks in my undergraduate ordinary differential equations course.

I’ve written elsewhere about the Backward Difference Formula implementations, the phase space visualization functions, the matrix extractors, and the numerical solutions plotters.

The package includes my home-grown help utility.

You can download the package MATH280.mac

…and if you’re interested, here’s my multivariable calculus package MATH214.mac

MATH280.mac contains: wxphaseplot2d(s) wxphaseplot3d(s) phaseplot3d(s) wxtimeplot(s) plotdf(rhs) wxdrawdf(rhs) sol_points(numsol,nth,mth) rkf45(oderhs,yvar,y0,t_interval) BDF2(oderhs,yvar,y0,t_interval) BDF2a(oderhs,yvar,y0,t_interval) odesolve(eqn,depvar,indvar) ic1(sol,xeqn,yeqn) ic2(sol,xeqn,yeqn,dyeqn) eigU(z) eigdiag(z) clear() - - for any of the above functions, help(function_name) returns help lines for function_name - Last Modified 5:00 PM 3/27/2017

There is an undocumented user-contributed feature of Maxima for rational inequalities: **solve_rat_ineq()**.

Here are few examples of its capabilities and limitations:

Yesterday I needed a cumulative sum function in Maxima to do the job of **cumsum()** in R and MATLAB, but couldn’t find anything. So here’s a one-liner that does the trick for a list:

cumsum(L):=makelist(sum(L[i],i,1,n),n,1,length(L))$

After not easily finding such a thing from a cursory search of the Maxima documentation, I spent a few hours over the weekend beginning to write a Maxima function to compute, for any given square matrix , an invertible matrix so that

where is the Jordan matrix that displays the eigenvalue/vector structure of .

It took several searches for me to find, but of course there’s already such a function — with a not so easily searched-for name — in the diag package: **ModeMatrix()**

To see just the matrix , **diag** provides** jordan()** and **dispJordan()**

In a previous post, I included my little coding project to implement a general** backsolve()** function to use with the built-in maxima matrix function **echelon()**, producing an easy-to-call matrix solver **matsolve(A,b)**. The result is meant to solve a general matrix vector equation , including cases when is non-square and/or non-invertible.

Here’s a quicker approach — convert the matrix into an explicit system of equations using a vector of dummy variables, feed the result into the built-in Maxima function** linsolve()**, and then extract the right hand sides of the resulting solutions and put them into a column vector.

The two methods often behave identically, but here’s an example that breaks the **linsolve()** method, where the **backsolve()** method gives a correct solution:

*Note, I’ve found that the symbol rhs is a very popular thing for users to call their problem-specific vectors or functions. Maxima’s “all symbols are global” bug/feature generally wouldn’t cause a problem with a function call to **rhs()**, but the function **map(rhs,*** list of equations***)** ignores that **rhs()** is a function and uses user-defined rhs. For that reason I protect that name in the block declarations so that **rhs()** works as expected in the **map()** line at the bottom. I think I could have done the same thing with a quote: map(‘rhs, *list of equations*).

matsolve2(A,b):=block( [rhs,inp,sol,Ax,m,n,vars], [m,n]:[length(A),length(transpose(A))], vars:makelist(xx[i],i,1,n,1), Ax:A.vars, inp:makelist(part(Ax,i,1)=b[i],i,1,n,1), sol:linsolve(inp,vars), expand(transpose(matrix(map(rhs,sol)))) );