# [Maxima] Why won't this compile?

Barton Willis willisb at unk.edu
Fri Aug 14 06:36:01 CDT 2009

Maybe you could rewrite your function using Maxima's noncommuting
multiplication instead of using explicit sums. Since A and Y are
nonconformable, you'll need to tinker. Try something like:

partial_product(m,x,i) := block([maperror : false],
xreduce("+", map("*", inpart(m,i),x)));

gg(A,b,s,VF,x,h) := block([y, listarith : true],
y : [VF(x)],
for i : 2 thru s do (
y : endcons(VF(x + h * partial_product(A,y,i)), y)),
expand(x + h * partial_product(b,y,1)));

(1) The function gg doesn't have the side-effects that fun has.

(2) Some time ago I thought maperror should be expunged. This might
be the first time I used maperror.

(3) And another bug :(

(%i2) ans1 : fun(matrix([1,1],[1,1]),[1,1],2,'f,[1,1],0.1)\$
(%i3) ans2 : gg(matrix([1,1],[1,1]),[1,1],2,'f,[1,1],0.1)\$
map: truncating one or more arguments.
map: calling 'apply'.

Should be [0,0]:

(%i4) ans1 - ans2;
(%o4) [1,1]+[-1,-1]

(%i5) expand(%,0,0);
(%o5) [0,0]

(4) The message from "map" is sometimes nice (debugging) but
frequently obnoxious. It would be great if Maxima had a unified way of
suppressing & managing error messages and warnings...

Barton

-----maxima-bounces at math.utexas.edu wrote: -----

>fun(A,b,s,VF,x,h):= block([Y],
>  Y[1]:  x,
>  for i:2 thru s do
>   Y[i]:  x + h*(sum(A[i,j]*VF(Y[j]),j,1,i-1)),
>  x: expand(x + h*sum(b[i]*VF(Y[i]),i,1,s))
>  )\$