/*PROGRAM NUMBER 4: TRANSFORM(), THIS PROGRAM ALLOWS TO PERFORM ARBITRARY COORDINATE TRANSFORMATIONS. SEE PAGE 44 IN "PERTURBATION METHODS, BIFURCATION THEORY AND COMPUTER ALGEBRA". */ TRANSFORM():=( /* INPUT DATA */ N:READ("ENTER NUMBER OF EQUATIONS"), FOR I:1 THRU N DO X[I]:READ("ENTER SYMBOL FOR ORIGINAL VARIABLE",I), FOR I:1 THRU N DO Y[I]:READ("ENTER SYMBOL FOR TRANSFORMED VARIABLE",I), PRINT("THE RHS'S OF THE D.E.'S ARE FUNCTIONS OF THE ORIGINAL VARIABLES:"), FOR I:1 THRU N DO ( PRINT("ENTER RHS OF",X[I],"D.E."), PRINT("D",X[I],"/DT ="), F[I]:READ(), PRINT("D",X[I],"/DT =",F[I])), PRINT("THE TRANSFORMATION IS ENTERED NEXT:"), FOR I:1 THRU N DO ( PRINT("ENTER",X[I],"AS A FUNCTION OF THE NEW VARIABLES"), PRINT(X[I],"="), G[I]:READ(), PRINT(X[I],"=",G[I])), /* DO IT */ FOR I:1 THRU N DO DEPENDS([X[I],Y[I]],T), FOR I:1 THRU N DO EQ[I]:DIFF(X[I],T)=F[I], TRANS:MAKELIST(X[I]=G[I],I,1,N), FOR I:1 THRU N DO TREQ[I]:EV(EQ[I],TRANS,DIFF), TREQS:MAKELIST(TREQ[I],I,1,N), DERIVS:MAKELIST(DIFF(Y[I],T),I,1,N), NEWEQS:SOLVE(TREQS,DERIVS))$