123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 |
- module tpsfns;
- % Expansion of elementary functions as power series using DOMAINVALCHK
- % Example sin a where a is a power series will now be expanded
- %
- % Author: Alan Barnes, March 1989
- % Currently only ps!:expt!: ever gets called and that only for
- % integer exponents
- fluid '(!*numval);
- put('exp, '!:ps!:, 'ps!:exp!:);
- put('log, '!:ps!:, 'ps!:log!:);
- put('sin, '!:ps!:, 'ps!:sin!:);
- put('cos, '!:ps!:, 'ps!:cos!:);
- put('tan, '!:ps!:, 'ps!:tan!:);
- put('asin, '!:ps!:, 'ps!:asin!:);
- put('acos, '!:ps!:, 'ps!:acos!:);
- put('atan, '!:ps!:, 'ps!:atan!:);
- put('sinh, '!:ps!:, 'ps!:sinh!:);
- put('cosh, '!:ps!:, 'ps!:cosh!:);
- put('tanh, '!:ps!:, 'ps!:tanh!:);
- put('asinh, '!:ps!:, 'ps!:asinh!:);
- put('acosh, '!:ps!:, 'ps!:acosh!:);
- put('atanh, '!:ps!:, 'ps!:atanh!:);
- put('expt, '!:ps!:, 'ps!:expt!:);
- % the above is grotty but necessary as unfortunately DOMAINVALCHK
- % passes arglist of sin (rather than sin . arglist) to ps!:sin!: etc
- symbolic procedure ps!:expt!:(base,exp);
- % currently this only gets called when exp is an integer
- % but it should work in general
- begin scalar depvar,about, knownps, ps!:level;
- % begin scalar !*numval, depvar,about, knownps;
- % NB binding of !*numval avoids infinite loop. Not necessary now -- AB?
- ps!:level := 0;
- about:= ps!:expansion!-point base;
- if null about then <<
- about:= ps!:expansion!-point exp;
- depvar:=ps!:depvar exp>>
- else depvar:=ps!:depvar base;
- return
- if null about then % we have two constant power series
- << if ps!:p base then base := ps!:value base;
- if ps!:p exp then exp := ps!:value exp;
- about := simp!* list('expt, base, exp);
- make!-constantps (about, prepsqxx about, depvar) >>
- else
- ps!:expt!-crule(list('expt, base,exp),depvar,about)
- end;
- symbolic procedure ps!:unary!:fn(fn, arg);
- begin scalar !*numval, knownps, ps!:level;
- % NB binding of !*numval avoids infinite loop
- ps!:level := 0;
- return ps!:compile(list(fn, arg),
- ps!:depvar arg,
- ps!:expansion!-point arg)
- end;
- symbolic procedure ps!:cos!: arg;
- ps!:unary!:fn('cos,arg);
- symbolic procedure ps!:sin!: arg;
- ps!:unary!:fn('sin,arg);
- symbolic procedure ps!:tan!: arg;
- ps!:unary!:fn('tan,arg);
- symbolic procedure ps!:log!: arg;
- ps!:unary!:fn('log,arg);
- symbolic procedure ps!:exp!: arg;
- ps!:unary!:fn('exp,arg);
- symbolic procedure ps!:cosh!: arg;
- ps!:unary!:fn('cosh,arg);
- symbolic procedure ps!:sinh!: arg;
- ps!:unary!:fn('sinh,arg);
- symbolic procedure ps!:tanh!: arg;
- ps!:unary!:fn('tanh,arg);
- symbolic procedure ps!:asin!: arg;
- ps!:unary!:fn('asin,arg);
- symbolic procedure ps!:acos!: arg;
- ps!:unary!:fn('acos,arg);
- symbolic procedure ps!:atan!: arg;
- ps!:unary!:fn('atan,arg);
- symbolic procedure ps!:asinh!: arg;
- ps!:unary!:fn('asinh,arg);
- symbolic procedure ps!:acosh!: arg;
- ps!:unary!:fn('acosh,arg);
- symbolic procedure ps!:atanh!: arg;
- ps!:unary!:fn('atanh,arg);
- endmodule;
- end;
|