defining functions of s variables



On Jan 8, 2008 10:25 AM, Barton Willis <willisb at unk.edu> wrote:

> (%i1) sum_it_up([x]) := apply("+",x)$ ...
>

If you want a function that has one or more arguments, try:
> (the [x] argument must be last and there can only be one []
> argument)


Depending on your requirements, you may want to use Barton's approach of
defining a function which is called with s arguments, e.g. f(x1,x2,x3) using
the f([l]):=... syntax, or a function which is called with one argument, a
vector, e.g. f([x1,x2,x3]), using simply f(l):=....  My general preference
would be for the latter, because it means you can conveniently treat the
argument vector as an object, e.g.

      f( argvec . matrix)
      length(argvec) => ...

Maxima does also support apply(f, argvec), but if you are mostly
manipulating vectors, this is not as convenient.

The apply("+", ...) trick works nicely for n-ary functions like "+" and the
like, but you might also want to consider using sum(x[i],i,1,length(x)) and
rreduce(f, x) == f(x[1],f(x[2],...)) (also lreduce -- all of which Barton
wrote, by the way).

(%i10) f([x]) := apply("*", map("^",x, makelist(k,k,1,length(x))));
>

Or

       product( x[k]^k, k, 1, length(x))

As for

    f(x) := x[1]^1 * x[2]^2 * x[3]^3
    diff(f(x), x[1], 1);

This works for me.  By the way, if your x's are strictly formal, it might be
easier to manipulate *expressions* than functions, e.g.

      f:  product(x[k]^k, i,1,3);

     diff(f,x[2]) => 2*x[1]*x[2]*x[3]^3

Let us know if you have other issues.

             -s