For my multivariable calculus class, I wanted an easy-to-call suite of symbolic integrators for path integrals of the form

,

, or

.

My overarching design idea was that the input arguments needed to look the way they do when I teach the course:

- a scalar field or a vector field or
- a curve defined by a vector-valued function where as appropriate.

It took me a while to work out how to evaluate the integrand along the path within my function. Things that worked fine on the command line failed when embedded into a batch file to which I passed functions as arguments. I ended up using **subst**, one variable at a time. I’d like to be able to do this in a single command which can detect whether we’re in 2 or 3 dimensions so that I don’t need separate commands.

For now, here’s what I came up with along with some illustrative examples taken from Paul’s online math notes, that show how to call these new commands **I**, **I2** and **I3**.

/* path integral of a scalar integrand f(x,y) on path r(t) in R^2, t from a to b */ I(f,r,t,a,b):=block( [f1,f2,dr,Iout], f1:subst(x=r[1],f), f2:subst(y=r[2],f1), dr:sqrt(diff(r,t).diff(r,t)), Iout: integrate(f2*dr,t,a,b), Iout );/* path integral of a vector integrand F(x,y) on path r(t) in R^2, t from a to b */ I2(H,r,t,a,b):=block( [H1,H2,I], H1:subst(x=r[1],H), H2:subst(y=r[2],H1), I: integrate( H2.diff(r,t),t,a,b), I );/* path integral of a vector integrand F(x,y,z) on path r(t) in R^3, t from a to b */ I3(H,r,t,a,b):=block( [H1,H2,H3,I], H1:subst(x=r[1],H), H2:subst(y=r[2],H1), H3:subst(z=r[3],H2), I: integrate( H3.diff(r,t),t,a,b), I );

Here’s an update: a related maxima function for evaluating a complex integral

where and the curve is given by .

/* path integral of a complex integrand f(z): C --> C, on path z(t): R --> C, t from a to b */ IC(f,r,t,a,b):=block( [f1,dz,Iout], f1:subst(z=r,f), dz:diff(r,t), Iout: integrate(f1*dz,t,a,b), Iout );