broken vector.mac



WZocher@t-online.de (Wolfgang Zocher) writes:

> vect.mac is enough!

Actually, vect.mac is also slightly broken.

For one thing, a portion of it (see the patch below) should be simply
deleted since it duplicates code of trgsmp, which is part of the
standard Maxima image, except that the code in vect contains at least
one (additional) bug (viz., in the function UPDATE, COMPLEMENT
shouldn't be quoted).

The other thing (more something to put on the to-do list than a bug)
is that VECTORSIMP doesn't handle the Jacobi identity (for the cross
product, here denoted by `~').  The demo expects this to work, though.

The remaining issue is that vect declares DIV etc. as prefix
operators, which is a nice thing, except that the parser has a bug
here, but this is the subject of another message.

Another nuisance is that you should probably type

bothcases:false$

before loading vect or vect_transform since otherwise single-letter
variables like X and x will be different.

Other that that, nice things like expressing differential operators
wrt. to some coordinate transformation should work fine (after loading
vect and vect_transform).

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ cut ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Index: vect.mac
===================================================================
RCS file: /cvsroot/maxima/maxima/share/vector/vect.mac,v
retrieving revision 1.1.1.1
diff -C2 -r1.1.1.1 vect.mac
*** vect.mac	8 May 2000 06:09:43 -0000	1.1.1.1
--- vect.mac	2 Feb 2003 20:56:43 -0000
***************
*** 57,62 ****
  DEFINE_VARIABLE(TRYLENGTH,1,FIXNUM)$
  DEFINE_VARIABLE(BESTLENGTH,1,FIXNUM)$
! DEFINE_VARIABLE(sfprod,1,any)$
! DEFINE_VARIABLE(sf,[1,1,1],list)$
  
  DEFINE_VARIABLE(EXPANDALL,false,BOOLEAN)$
--- 57,62 ----
  DEFINE_VARIABLE(TRYLENGTH,1,FIXNUM)$
  DEFINE_VARIABLE(BESTLENGTH,1,FIXNUM)$
! DEFINE_VARIABLE(SFPROD,1,any)$
! DEFINE_VARIABLE(SF,[1,1,1],list)$
  
  DEFINE_VARIABLE(EXPANDALL,false,BOOLEAN)$
***************
*** 166,240 ****
  
     EXPN) $
- 
- TRIGSIMP(EXPN) :=
-    RATSIMP(TRIGSIMP1(NUM(EXPN))/TRIGSIMP1(DENOM(EXPN))) $
- 
- TRIGSIMP1(EXPN) := BLOCK(
-    [LISTOFTRIGSQ, BESTLENGTH, TRYLENGTH],
-    LISTOFTRIGSQ: LISTOFTRIGSQ(EXPN),
-    BESTLENGTH: 999999,
-    IF LISTOFTRIGSQ#[] THEN IMPROVE(EXPN, LISTOFTRIGSQ),
-    RETURN(EXPN)) $
- 
- IMPROVE(SUBSOFAR, LISTOFTRIGSQ) :=
-    IF LISTOFTRIGSQ=[] THEN (
-       TRYLENGTH:mode_identity(fixnum, EXPNLENGTH(SUBSOFAR)),
-       IF TRYLENGTH<BESTLENGTH THEN (
-          EXPN: SUBSOFAR,
-          BESTLENGTH: TRYLENGTH))
-    ELSE (IMPROVE(SUBSOFAR, REST(LISTOFTRIGSQ)),
-       FOR ALT IN FIRST(LISTOFTRIGSQ) DO 
-          IMPROVE(RATSUBST(
-             IF INPART(ALT,0)='SIN THEN 1-COS(INPART(ALT,1))**2
-             ELSE IF PIECE='COS THEN 1-SIN(INPART(ALT,1))**2
-             ELSE IF PIECE='SINH THEN COSH(INPART(ALT,1))**2-1
-             ELSE 1+SINH(INPART(ALT,1))**2,
-                ALT**2, SUBSOFAR), REST(LISTOFTRIGSQ))) $
- 
- LISTOFTRIGSQ(EXPN) :=
-    IF ATOM(EXPN) THEN []
-    ELSE BLOCK([INFLAG, ANS],
-       IF INPART(EXPN,0)="^" AND INTEGERP(INPART(EXPN,2))
-          AND PIECE>=2 THEN
-          IF ATOM(EXPN:INPART(EXPN,1)) THEN RETURN([])
-          ELSE IF MEMBER(INPART(EXPN,0),'[SIN,COS,SINH,COSH])
-             THEN RETURN([[EXPN]]),
-    INFLAG:TRUE,
-       ANS:[],
-       FOR ARG IN EXPN DO
-          ANS: SPECIALUNION(LISTOFTRIGSQ(ARG), ANS),
-       RETURN(ANS)) $
- 
- SPECIALUNION(LIST1,LIST2) :=
-    IF LIST1=[] THEN LIST2
-    ELSE IF LIST2=[] THEN LIST1
-    ELSE BLOCK([ALTERNATES],
-       ALTERNATES: FIRST(LIST1),
-       FOR ALT IN ALTERNATES DO LIST2:
-          IF INPART(ALT,0)='SIN THEN UPDATE(ALT,'COS,list2)
-          ELSE IF PIECE='COS THEN UPDATE(ALT,'SIN,list2)
-          ELSE IF PIECE='SINH THEN UPDATE(ALT,'COSH,list2)
-          ELSE UPDATE(ALT,'SINH,list2),
-       RETURN(SPECIALUNION(REST(LIST1),LIST2))) $
- 
- UPDATE(FORM, COMPLEMENT,list2) := BLOCK(
-    [ANS],
-    COMPLEMENT: APPLY('COMPLEMENT,[INPART(FORM,1)]),
-    ANS: FOR ELEMENT IN LIST2 DO
-       IF MEMBER(FORM, ELEMENT) THEN RETURN('FOUND)
-       ELSE IF MEMBER(COMPLEMENT,ELEMENT) THEN RETURN(
-          CONS([FORM,COMPLEMENT], DELETE(ELEMENT,LIST2))),
-    IF ANS='FOUND THEN LIST2
-    ELSE IF ANS='DONE THEN CONS([FORM],LIST2)
-    ELSE ANS) $
- 
- /*EXPNLENGTH(EXPR):=LENGTH(?STRING(EXPR))$*/
- EXPNLENGTH(EXPR) := 
-    IF ATOM(EXPR) THEN 1
-    ELSE 1 + ARGSLENGTH(SUBSTINPART("[", EXPR, 0)) $
- 
- ARGSLENGTH(ARGS) :=
-    IF ARGS=[] THEN 0
-    ELSE EXPNLENGTH(FIRST(ARGS)) + ARGSLENGTH(REST(ARGS)) $
  
  
--- 166,169 ----
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ cut ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Wolfgang