Artifact 899dac9356583f119819a9ccc537b9d72dca157f1fdd0de0975aff7875b210ad:
- Executable file
r37/packages/taylor/taylor.red
— part of check-in
[f2fda60abd]
at
2011-09-02 18:13:33
on branch master
— Some historical releases purely for archival purposes
git-svn-id: https://svn.code.sf.net/p/reduce-algebra/code/trunk/historical@1375 2bfe0521-f11c-4a00-b80e-6202646ff360 (user: arthurcnorman@users.sourceforge.net, size: 50464) [annotate] [blame] [check-ins using] [more...]
module Taylor; %**************************************************************** % % THE TAYLOR PACKAGE % ================== % %**************************************************************** % % Copyright (C) 1989,1990,1991,1992,1993,1994,1995,1996,1997,1998,1999 % by Rainer M. Schoepf, all rights reserved. % % Copying of this file is authorized only if either % (1) you make absolutely no changes to your copy, including name, or % (2) if you do make changes, you name it something other than % taylor.red. % % Error reports please to: Rainer Schoepf % Zentrum fuer Datenverarbeitung % der Universitaet Mainz % Anselm-Franz-von-Bentzel-Weg 12 % D-55099 Mainz % Germany % Email: <Schoepf@Uni-Mainz.DE> % % % This package implements a new data structure: % % >>> the TAYLOR KERNEL <<< % % and the functions necessary to operate on it. % % A TAYLOR KERNEL is a kernel of the following form: % % (Taylor!* TayCoeffList TayTemplate TayOrig TayFlags) % % where: % Taylor!* is a symbol identifying the kernel. % TayCoeffList is a list of TayCoeff's. % A TayCoeff is a pair % (TayPowerList . StandardQuotient). % A TayPowerList is a list of TayDegreeList's, % each of which is a list of integers that % denote the exponents of the Taylor variables. % TayTemplate is a list of lists, each containing the three % elements TayVars, TayPoint, TayOrder, % TayNextOrder, (being the list of variables, the % expansion point the power of the variable in the % last coefficient computed, and the power of the % next coefficient, respectively) % It is used as a template for the car of the % pairs in a TayCoeffList. % TayOrig is the original expression to be Taylor expanded, % as a standard quotient. It is held mainly for % the use by possible future extensions. % This part is nil if the switch taylorkeeporiginal % was off during expansion. % TayFlags is currently unused and reserved for future % extensions. % % % %***************************************************************** % % Revision history % %***************************************************************** % % % 17-Jun-97 2.1g % Minor improvement in procedure taylorexpand!-samevar: do not signal % an error if we are content with the terms we got (i.e. third % argument flg is nil. % % 16-Apr-97 2.1f % Slight improvement in tracing output (smacro Taylor!-trace). % Avoid infinite recursion when mcd is off (pointed out by % Wolfram Koepf). % % 03-May-95 2.1e % Corrected differentation of Taylor kernels if expansion point % depends on variable. (Integration still gives wrong result.) % Printing procedures did not always work for right hand side of % rules. % % 03-Apr-95 2.1d % Removed special handling for constant Taylor series in taysimptan, % taysimpsin and taysimpsinh, as it didn't work when the function in % question has a pole and the expansion point. % % 09-Jan-95 2.1c % Changed rules in tayfns.red to new ~~ format. % % 22-Jul-94 2.1b % Corrected glitch in function common!-increment. % % 10-Jun-94 2.1a % Corrected expansion of tan at pole up to order 0: make quottaylor % and invtaylor signal restartable error, have taylorexpand truncate % its result. % Operator expint is now called ei. % Changed error message in taysimpasin to signal a branch point, not % an essential singularity. % % 08-May-94 2.1 % Added implicit_taylor and inverse_taylor. % % % 02-May-94 2.0c % Corrected missing Next field in function taylor2e. % % 14-Apr-94 2.0b % Corrected function expttayi. % Renamed pos!-rat!-kern!-pow to rat!-kern!-pow and changed calling % convention, moved to tayutils module. % subfg!* changed from global to fluid. % Removed a few unused local variables. % Added TayExp!-max2. % Rewrote expansion code for monomials to produce higher order terms. % % 14-Mar-94 2.0a % Corrected generation of simple Taylor kernels when switch mcd is % off. % Added code to catch looping with increased order, introduced a % better error message. % Added a few missing parentheses in functions taysimpexpt and % tayrevert1. % % 03-Mar-94 2.0 % Introduced rational exponents for Puiseux series. This required % changes to various functions: % Taylor exponent manipulation functions % expttayrat % expttayrat!* (removed) % pos!-rat!-kern!-pow % smallest!-increment and common!-increment % truncate!-Taylor!* % tayrevert1 % Added exceeds!-order!-variant that uses strict greaterp, rather % than geq as exceeds!-order does. % Added lcmn to compute the least common multiple of two integers. % Replaced call to subs2 with binding of !*sub2 by subs2!* in % functions below. % Removed error type inttaylorwrttayvar, no longer generated. % % % % 15-Feb-94 1.9c % Improved taysimpsinh to generate hyperbolic functions in the % the coefficients of the result rather than exponentials. % Improved handling of zero Taylor kernels if TayOrig is present. % Improved taylorexpand!-samevar to handle expansions in more % than one variable. % Corrected Taylor substitution to handle parallel substitution % of several Taylor variables. % Updated check for differentiation rules of kernels. % Added new error types for Taylor expansion of implicit and % inverse functions. % Made division by zero in taysubst recoverable error during % expansion. % Corrected term ordering in Taylorexpand!-diff2. % Corrected addition and multiplication of Taylor kernels in % taylorexpand!-sf. % Added taysimpasec!* to handle singular arguments of asec and % friends. % % 02-Dec-93 1.9b % Added missing setting of TayOrig part in make!-var!-Taylor!*. % Corrected handling of substitution of all Taylor variables in % taysubst. % Ensure that psi is declared algebraic operator. % Corrected substitution of Taylor variable by a power of itself. % % 30-Nov-93 1.9a % Corrected cdr of nil in several places, caused by makecoeffs % returning an empty list. % Improved handling of zero Taylor kernels if TayOrig is present. % Added missing setting of TayOrig part in taylorexpand!-diff2. % % 29-Nov-93 1.9 % Added min2!-order and replace!-next. % Improved basic Taylor manipulation functions addtaylor, multtaylor, % quottaylor. % Added taylorsingularity feature to expansion code. % % % 24-Nov-93 1.8h % Changed calling convention for addtaylor1 to include the template. % % 15-Nov-93 1.8g % Rewritten parts of subsubtaylor to better recognize invalid % substitutions. % % 09-Nov-93 1.8f % Added TayExp!-geq and TayExp!-leq. % Changed protocol of truncate!-coefflist and exceeds!-order to use % the next part rather than the order part of a template. % Cleaned up inv!.tp!.. % % 08-Nov-93 1.8e % Improved handling of negative first coefficient in taysimplog. % Removed binding of !*taylorautocombine in taysimpsq!*. % % 03-Nov-93 1.8d % Improved taysimpsq and taysimpf to avoid returning a constant Taylor % series as part of an expression. % Fixed bug in error handling of expansion code that would produce % "This can't happen" error message. % Improved error detection for (unknown) operators with logarithmic % singularity in derivative. % Removed tayinpoly/tayinpoly1 (no longer used). % Replaced !*f2q by !*TayExp2q in difftaylorwrttayvar. % Changed evaluation and printing procedures so that they can be used % in rule patterns. % Corrected bug in Taylor kernel integration if the switch % taylorkeeporiginal was on. % Improved integration of Taylor kernels in combination with % logarithmic terms. % Rewrote rules integration rules in algebraic form. % Added TpNextList smacro. % Changed mult!.comp!.tp!. in preparation for non-integer exponents, % to handle next parts. % Added invert!-powerlist smacro and used in invtaylor1. % Renamed taydegree!-lessp to taydegree!< and % taydegree!-strict!-less!-or!-equal!-p to taydegree!-strict!<!=. % Added smacro prune!-coefflist. % Introduced prepTayExp. % Changed protocol for add!.comp!.tp!. to return a list of the new % template, so that an empty template can be distiguished from % failure. % Changed procedures for Taylor reversion to use addtaylor and friends % instead of addtaylor1, etc. % Added an increment argument to all the makecoeff... procedures. % Added smallest!-increment and common!-increment procedures. % Rewrote taysimpsq to better handle Taylor kernel in denominator. % % 23-Sep-93 1.8c % Changed Taylor!-generate!-big!-O to produce a capital O even if % !*lower is t. % % 03-Sep-93 1.8b % Changed multintocoefflist to bind !*sub2 and first call subs2 % and then resimp so that power substitutions are carried out % properly. % % 02-Sep-93 1.8a % Corrected stupid error that caused car/cdr of an atom. % Corrected code for expansion by differentiation and for caching % of intermediate results to use the template of the computed kernel % rather than the template given to the expansion functions. % Corrected truncate!-Taylor!* to correctly handle the case that % the kernel to be truncated has already fewer terms than expected. % % 17-Aug-93 1.8 % Improvement in expttayrat if zero is raised to negative power; % this might be a case for expansion to higher order. % Rewritten code for expansion by differentiation to handle % occurrence of a kernel in its own derivative. % % % 12-Aug-93 1.7e % Rewritten part of the expansion by differentiation code to try % to differentiate once and expand the result. % Slight improvement in trace printing. % % 13-Jul-93 1.7d % Corrected taysimpasin and taysimpasin!* to handle branch points % correctly. % simpTaylor!* can now handle free variables as part of Taylor!* % kernel. % % 28-Jun-93 1.7c % Corrected error introduced by last change to mult!.comp!.tp!. % and inv!.tp!. % % 21-Jun-93 1.7b % Changed taylor2f to not collect zero coefficients into coefflist. % Changed subs2coefflist to leave out zero coefficients. % Set default of Taylorautocombine switch to on. % Replaced calls to subs2!* be calls to subs2 with explicit binding % of !*sub2. % % 17-Jun-93 1.7a % Added get!-min!-degreelist to find minimum degree list of a % coefflist; corrected mult!.comp!.tp!. and inv!.comp!.tp!. to % use it. % Corrected error in quottaylor that could wrongly calculate first % coefficient of result. % Shortened lines in tayfns.red to 72 characters. % Improved taysimpexp and expttayrat!* to yield an exponential only % if there are no analytical terms. % Added code to expand inverse trigonometric and hyperbolic functions % around their logarithmic singularities. % Corrected taysimpsin, improved taysimpsinh. % % 15-Jun-93 1.7 % Added a lot of utility functions to test for zero, constant, % and nonzero constant Taylor series. % Rewritten the Taylor simplification functions in modules TaySimp % and TayFns to handle non-analytical terms as well. % Split expttayrat into two procedures. % % % 14-Jun-93 1.6 % Added Taylor!*!-zerop and TayCoeffList!-zerop. % Introduced addtaylor!-as!-sq, multtaylor!-as!-sq, and % quottaylor!-as!-sq. % Changed taymincoeff into an expr procedure, added tayminpowerlist. % simptaylor returns now the input if it cannot expand. % Added trtaylor switch and some procedures for tracing. % Added Taylor!-error!*, currently used only in taysimplog. % Added TayExpnd module, removed taylorexpand from tayinterf module. % Moved taymincoeff and tayminpowerlist into TayUtils module. % Corrected procedures in tayfns.red to not crash for Taylor kernels % with empty TayCoefflist. % % % 10-Jun-93 1.5b % Introduced get!-degreelist. % Rewritten exceeds!-order to be tail-recursive. % Changed protocol for makecoeffs call, introduced makecoeffs0. % Introduced !*TayExp2q to convert a power into a standard quotient. % % 09-Jun-93 1.5a % Introduced has!-TayVars predicate, replaced calls to smemberlp % and smemqlp by it. % Split addtaylor, multtaylor and quottaylor into two procedures. % Replaced taysimpp by expttayi in difftaylor. % Introduced taysimpsq!* (taysimpsq with taylorautoexpand off). % % 08-Jun-93 1.5 % Introduction of special operations for exponents in powerlists: % TayExp!-<op>. The macro Taylor!: is used to replace normal % operations by these. % Changed makecoeffpairs and addcoeffs to avoid consing pairs and % taking them apart again. % Changed makecoeffpairshom to allow steps different from 1. % % % 07-Jun-93 1.4l % Introduced TayNextOrder and made corresponding changes to the % sources. % Added addto!-all!-TayTpElOrders function. % Corrected problem in expttayrat that would result in extra (wrong) % terms if there was no constant term in the Taylor series to be % raised to a power. % Removed some calls to !*n2f. % Replaced call to subs2 by subs2!* in taysimptan. % Corrected generation of new template in inttaylorwrttayvar % % 03-Jun-93 1.4k % Changed expttayi to handle negative integer powers as well, % changed taysimpp correspondingly. % % 27-May-93 1.4j % Corrected some oversights in taysimpexpt. % Added smacro TayTpVars. % Added code to taysimpp to handle s.f. as main variable. % Added function subtr!-degrees to tayutils.red. % Corrected error in var!-is!-nth in tayintro.red. % Corrected error in taydegree!-lessp in tayutils.red that caused % incorrect ordering of coefficients. % Corrected error in quottaylor1. % % 06-May-93 1.4i % Changed printing routines for better interface to fancy printing. % % 21-Apr-93 1.4h % Corrected cosec --> csc, cosech --> csch in tayfns.red. % Corrected taysimpsin to calculate coth with correct overall sign. % Improved handling of poles in taysimptan. % Rewritten taysimpsin to use exponential rather than tangent. % Added slight optimization in taylorsamevar if desired matches % actual expansion order. % % 01-Apr-93 1.4g % Changed multtaylor1 so that in multiplication of Taylor kernels % products would be simplified as well. % Changed taysimptan to allow expansion point to be a pole of tan, % cot, tanh, or coth. % Changed constant!-sq!-p and taysimpexpt to recognize constant % expression in first argument to expt. % Changed printing so that only non-vanishing terms are counted. % Introduced taysimpsinh for simplifcation of expressions involving % sinh, coth, sech, csch. % Added subs2coefflist and resimpcoefflist smacros. % Modified addtaylor1, multtaylor1, quottaylor1 and invtaylor1 to call % subs2coefflist. % Protected klist property of atom Taylor!* against being filled % unnecessarily with intermediate results. % Changed expttayrat to print a more meaningful error message when it % detects a branch point. % Improved taysimpexpt to handle more cases. % % 08-Mar-93 1.4f % Changed printing of Taylor kernels to include `(nn terms)' instead % of `...'. % % 25-Feb-93 1.4e % Made expttayi more efficient by replacing straightforward % multiplication by a scheme that computes powers of 2. % Corrected error in taysimpexp. % % 24-Feb-93 1.4d % Corrected error in taydiffp. % Made especially multtaylor1, but also addtaylor1 and expttayrat % more efficient. % % 01-Feb-93 1.4c % Corrected error in tayrevert1: constant term was missing. % Changed frlis!* from global to fluid. % Corrected error in taylor2f that caused certain expressions, like % i^2, not to be simplified correctly (discovered by Stan Kameny). % % 16-Apr-92 1.4b % Corrected errors in taysimpexpt, mult!.comp!.tp!., and expttayrat. % The error corrected in version 1.4a was also present in invtaylor. % Corrected error in taylor2e/taylor2f. % Improved printing of negative coefficients. % Corrected error in subsubtaylor. % Corrected error in taysimpexp. % Added simp0fn property to Taylor!* for proper handling of % substitutions. % Added make!-cst!-coefficient smacro. % Added partial suppression of printing of coefficients and % TAYLORPRINTTERMS variable. % % 11-Feb-92 1.4a % Corrected error in quottaylor1: If numerator or denominator had % a zero constant term, the result had the wrong number of terms. % % 09-Jan-92 1.4 % Implemented Taylor reversion. % % % 07-Jan-92 1.3e % Corrected bug in taysimpsin: wrong type of return value. % % 27-Nov-91 1.3d % Corrected glitch in quottaylor1: Taylor kernel representing 0 % as numerator gave an error. % % 06-Nov-91 1.3c % Improved support for integration of expressions involving Taylor % kernels. % % 31-Oct-91 1.3b % Added (limited) support for the integration of Taylor kernels. % % 19-Jul-91 1.3a % Introduced taysimpmainvar for main variables that are standard % forms, as in factored expressions. Changed taysimpp accordingsly. % Introduced new smacros !*tay2f and !*tay2q that make Taylor kernels % unique. % % 03-Jun-91 1.3 % Started version for REDUCE 3.4. % Updated diffp according to changes for REDUCE 3.4. % Replaced freeof by has!-Taylor!* in taysimpf and taysimpt, and by % depends in difftaylor and taylor2e. % Changed module names to conform to file names. % Moved (nearly) all smacros into header (taylor) module, % made cst!-Taylor!* an smacro, moved remaining functions from % taymacros into tayutils, deleted taymacros module. % Made makecoeffpairs (in module taybasic) from smacro to expr. % Changed taylorsamevar to use TayOrig part of Taylor kernel if % present. % Changed Taylor printing functions since it is now possible to % pass information of operator precedence (via pprifn property). % Fixed bug in subsubtaylor (found by H. Melenk): did not substitute % in expansion point. % Changed error handling to call new function rerror instead of % rederr. % Changed for use of new hooks prepfn2, subfunc, and dfform % instead of redefining sqchk, subsublis, and diffp. % % 20-Oct-90 1.2j % Added check in subsubtaylor for variable dependency. % Fixed stupid bug in taylorsamevar. % Corrected taysimpexpt to handle rational exponents with ON RATIONAL. % Corrected expttayrat: looks now at first NON-ZERO coefficient to % determine whether root can safely be computed. % Fixed bug in mult!.comp!.tp.. % Added error check in invtaylor1 and quottaylor1. % Fixed bug in quottaylor1 that produced wrong results for % multidimensional Taylor series, introduced taydegree!-min2 and % taydegree!-strict!-less!-or!-equal!-p. % % 05-Oct-90 1.2i % Replaced variable name nn by nm in taysimpsq to avoid name conflicts % with the SPDE package by Fritz Schwartz. % Replaced call to apply by apply1 in taysimpkernel. % Minor changes in expttayrat, taysimplog, taysimpexp, and taysimptan: % inserted explicit calls to invsq to allow negative numbers in % denominator. % Fixed bugs in difftaylorwrttayvar, inttaylorwrttayvar and % subsubtaylor: treatment of a Taylor kernel expanded about infinity % would give a wrong result. Found by John Stewart. % % 11-Aug-90 1.2h % Replaced call to get!* by get in diffp since get!* will no longer % be available in REDUCE 3.4. % Fixed bug in multintocoefflist that was introduced by replacing % car by TayCfPl. % Moved setting of TayOrig part from taylor1 to taylorexpand. This % avoids Taylor kernels in the TayOrig part of multidimensional % Taylor expansions. It does not fully solve the problem since % they can still be generated by applying the Taylor operator to % expressions that do not contain fully Taylor-combined Taylor % kernels. % Reversed list of expansions in call to taylorexpand in simptaylor. % Modified taylor1 accordingly. Previously this could trigger a % `This can't happen' error message (due to incorrect ordering of % the Taylor variables). % Removed procedures delete!-coeff and replace!-coeff since they are % no longer used. % Moved call to subs2 out of differentiation loop in taylor2f, % improves timing significantly; deleted superfluous declared % integer variable. % Fixed bug in taylorsamevar. % Added extra checks and double evaluation of lists in simptaylor. % Replaced a number of ./ by !*f2q, introduced some !*n2f conversion % functions. % Development frozen, version shipped out. % % 06-May-90 1.2g % Fixed bug in taylor2e that caused order of kernels in homogenous % expansions to be reverted. Discovered by Karin Gatermann. % Removed binomial!-coeff since no longer needed (in expttayrat). % Replaced some forgotten car/cdr by TayCfPl/TayCfSq. % Reordered import declarations. % Replaced many semicolons by dollar signs. Decreases amount of % printing during input of this file. % Minor bug fix in taysimpsin. % Minor change in taysimpasin and taysimpatan. % Split inttaylorwrttayvar into two procedures, added check for % logarithmic term in integration procedure inttaylorwrttayvar1. % Replaced combination of addsq and negsq by subtrsq in quottaylor1, % subsubtaylor and taysimplog. % Renamed taygetcoeff to TayGetCoeff (doesn't make any difference % on case-insensitive systems). % Minor changes in taymultcoeffs, multintocoefflist, resimptaylor, % taylor1sq, taylor2f, negtaylor1, quottaylor1, invtaylor1, % expttayrat, subsubtaylor, difftaylor, taysimpasin, taysimpatan, % taysimplog, taysimpexp, taysimptan, difftaylorwrttayvar, % inttaylorwrttayvar1, addtaylor1 (cons -> TayMakeCoeff). % Similar change in taysimpp (cons -> .**, i.e. to). % % 29-Mar-90 1.2f % Fixed bug in taysimpf (addition of Taylor kernels) that could cause % "This can't happen" message. % Fixed bug in difftaylorwrttayvar: arguments to make!-cst!-coefflis % were interchanged. % Fixed similar bug in expttayrat (this procedure was never used!) % Added forgotten call to list in taylor2f. % Changed representation of big-O notation: print O(x^3,y^3) instead % of O(x^3*y^3) if expansion was done up to x^2*y^2. % Introduced new version of expttayrat (algorithm as quoted by Knuth) % which is faster by about a factor of two. % Fixed Taylor!-gen!-big!-O so that expansion point at infinity % is treated correctly for homogeneously expanded series. % % 27-Feb-90 1.2e % Removed procedures addlogcoeffs, addexpcoeffs and addtancoeffs, % inserted code directly into taysimplog, taysimpexp, and % taysimptan. % taylorvars renamed to TayVars. % find!-non!-zero moved into Taylor!:macros module. % % 26-Feb-90 1.2d % Added following selector, constructor, and modification smacros: % TayCfPl, TayCfSq, TayMakeCoeff, set!-TayCfPl, set!-TayCfSq, % TayTpElVars, TayTpElPoint, TayTpElOrder. % Some minor changes in several procedures to improve readability. % % 19-Jan-90 1.2c % Removed first argument of addtaylor since never used. % % 14-Nov-89 1.2b % Added taysimpsin. % Split tayinpoly1 off from tayinpoly, modified expttayrat % accordingly. % Changed global declarations to fluid. No reason to prevent % binding. % % 11-Nov-89 1.2a % Minor changes in the procedures changed yesterday (cleanup). % Added procedure taysimptan. % Replaced taylor1sq by taylorexpand in taysimpf1. % taysimpsq partly rewritten (will these bugs never die out?) % taysimpf1 renamed to taysimpf, taylor!*!-sf!-p to % Taylor!-kernel!-sf!-p. % Replaced a few of these by Taylor!-kernel!-sq!-p. % % 10-Nov-89 1.2 % Introduced taylorexpand to be the heart of simptaylor and to % replace simptaylor in taysimpt and multpowerintotaylor. % Added new versions of procedures taysimplog and taysimpexp % (Knuth's algorithm). % Taylor!:basic module moved up (so that some smacros are % defined earlier). % % % 09-Nov-89 1.1b % Fixed bug in taylor2e: quottaylor1 got the wrong template so % that it would truncate the resulting coeff list. % Added call to subs2 after call to diffsq in taylor2f so that % expressions containing radicals are simplified already at % this point. % % 21-Aug-89 1.1a % Fixed bug in taysimpp: it could return a s.q. instead of a s.f. % Added a few forgotten import declarations. % % 31-Jul-89 1.1 % Slight changes in calls to confusion, minor change in taysimpp. % Introduced big-O notation, added taylorprintorder switch. % taysimpasin and taysimpatan now also calculate the inverse % hyperbolic functions. % New smacro Taylor!-kernel!-sq!-p replaces combinations of % kernp and Taylor!*p. % % % 24-Jul-89 1.0a % Bug fix in constant!-sq!-p: mvar applied to s.q., not s.f. % Added safety check in taysimpt. % % 27-May-89 1.0 % Decided to call this version 1.0, it seems to be sufficiently (?) % bug free to do so. % Minor bug fix in expttayrat (forgotten variable declaration). % % % 25-May-89 0.9l % Bug fixed in taylor2e % (thanx to Rich Winkel from UMC for pointing out this one). % Cleaned up the code for truncating when combining Taylor kernels % of different order. % Introduced taysimpasin for computing the asin, acos, etc. % of a Taylor kernel. % Changed some internal procedures to call addtaylor1, etc. % instead of addtaylor, etc. if both arguments have the same % template. % Changed representation of the coefflist: expansion with respect % to one variable is a special case of homogeneous expansion. % This is now reflected in the internal representation. These % changes make the code shorter since all expansions are % done the same way (fewer checks necessary). % % 23-Mar-89 0.9k % Numerous bug fixes. % Changed subsubtaylor to allow error checking in var!-is!-nth. % Rewrote taydegree!-lessp to iterate over its arguments rather % than call itself recursively. % Introduced exceeds!-order instead of taydegree!-lessp % (in truncate!-coefflist and multtaylor1). % Minor changes in Taylor!*!-sf!-p, taysimpexp, var!-is!-nth, % taysimpexpt, and inttaylorwrttayvar. % Changed simptaylor!* to apply resimp to all coefficients and % to the tayorig part. % Changed subsubtaylor to allow substitution of a kernel into a % homogeneously expanded expression. % Changed difftaylorwrttayvar to allow differentiation of % homogeneously expanded expressions. % Changed subsubtaylor so that substitution of a kernel is possible % (not only a variable). % New constructor smacros make!-Taylor!* and TayFlagsCombine replace % explicit list building. % New procedures: get!-degree and truncate!-coefflist induced % changes in addtaylor/multtaylor/quottaylor/invtaylor. % This fixes the other problem pointed out by H. Melenk. % Split addtaylor/multtaylor the same way as quottaylor/invtaylor. % Introduced taylorautocombine switch and interface to simp!* % (via mul!* list). % Added symbolic; statement in taylor!-intro module; necessary % until module/endmodule are fixed to work together with faslout. % Changed subsubtaylor to return a conventional prefix form % if all Taylor variables are substituted by constants. % Changed difftaylorwrttayvar to ensure that the coefflist of % the Taylor kernel it returns is not empty. % Changed subsubtaylor to avoid 0**n for n<=0 when substituting % a Taylor variable (to signal an error instead); changed % taylor!-error accordingly. % Added taylortemplate operator, removed smacro % taylor!-map!-over!-coefficients. % Added code for expansion about infinity. % Split quottaylor into two parts: the driver (quottaylor) and % the routine doing the work (quottaylor1). Same for invtaylor. % Rewrote the expansion procedures taylor1, taylor2,... % Change in taylor2e: added flg parameter, introduced % delete!-superfluous!-coeffs. % Added set!-tayorig and multintocoefflist. % Replaced simp by simp!* for simplication of tayorig part in % taysimplog and taysimpexpt. % Removed taysimpsq in taylorseriesp: it now returns t iff its % argument is a Taylor kernel disguised as a standard quotient. % Added taylororiginal operator. % Added a number of tests if tayorig of a Taylor kernel is non-nil % if !*taylorkeeporiginal is set. % Replaced calls to simpdiff in taylor2e and simpexpt by a call % to simp. % Minor change in taylor!*print!*1. % H. Melenk discovered that the code did not behave as documented: % addition of Taylor kernels differing only in their order did not % work, and Taylor expansion of a Taylor kernel w.r.t. one of its % variables would fail. % Corrected the latter problem by changing the substitution code % to allow a Taylor variable to be replaced by a constant. % taylorseriesp is now a boolean operator and therefore only % usable in if statements. % Replaced calls to subsq1/subf1 by subsq/subf, % definitions of subsq1 and taymaxdegree deleted. % Minor changes in taylor2hom and taylor2e. % % 28-Nov-88 0.9j % Changed printing of `. . . ' to `...'. % Changed simptrig to simp in taysimpatan. % Changed simptaylor to simplify all its arguments, not only % the first one. % Added !*verboseload switch to conditionalize printing of % loading info. % Changed taylor2 to call taylor!-error instead of rederr. % Modified taylor!-error accordingly. % % 16-Nov-88 0.9i % Fixed a Typo in quottaylor. % Inserted module/endmodule declarations. % Added errorset in taylor2 to catch zero denominators, etc., % caused by expansion about essential singularities. % % 10-Nov-88 0.9h % Fixed bugs that caused taking car of an atom (found by A.C.Hearn). % taysimpt used multf instead of multpf. % I also discovered a car/cdr of nil in % makecoeffpairs1/makecoeffpairshom1. % Reason: (nil . nil) == (nil), but what I want is % ((nil . nil)) == ((nil)). Stupid, eh? % % 23-Jul-88 0.9g % Added dmode!* to list of fluid variables, % removed taylor!-map!-over!-coefficients!-and!-orig. % % 26-May-88 0.9f % Minor bug fix in taydegree!-lessp. % % 25-May-88 0.9e % Fixed a number of smaller bugs. % Finally implemented multiplication and division for % homogeneously expanded Taylor series. % Today I realized that the procedure diffp in ALG2 had % been changed for REDUCE 3.3. % % 21-May-88 0.9d % Fixed bug in invtaylor. % Rewrote quottaylor to do direct division rather use invtaylor. % % 14-May-88 0.9c % Fixed substitution for expansion variable. % % 11-May-88 0.9b % Fixed user interface functions taylorseriesp and taylortostandard. % % 10-May-88 0.9a % Small changes in subsubtaylor and difftaylor to make the code % compilable, plus minor bug fixes. % % 08-May-88 0.9 % invtaylor changed to allow inversion of multidimensional % Taylor kernels (but still not for homogeneous expansion). % % % 06-May-88 0.8i % `conc' changed to `join' (for mnemonic purposes). % % 29-Apr-88 0.8h % Minor bug fix in invtaylor (missing quote). % % 21-Mar-88 0.8g % Minor change in TayDegreeSum. % % 17-Jan-88 0.8f % Started implementation of homogeneous expansion % (required change in conversion to prefix form). % % 16-Jan-88 0.8e % Minor change in the definition of confusion. % % 15-Jan-88 0.8d % Changed to conform to REDUCE 3.3 % (SWITCH statement, minor changes in parsing). % % 03-Jan-88 0.8c % First version that is supposed to return always a correct result % (but not all possible cases are handled). % % %***************************************************************** % % Things to do: % %***************************************************************** % % a) Finish implementation of homogeneous expansion (hard). % b) Find a method to handle singularities (very hard). % c) Perhaps I should change the definition of ORDP to order % Taylor kernels in some special way? % d) An interface for the PART operator is desirable. Currently % Taylor kernels are converted into prefix form. % Alas, with REDUCE 3.x this requires redefinition of some % functions. (More hooks, please!) % Same applies to COEFF and COEFFN. % e) Rewrite the expansion code to recursively descend a standard % form. This allows recognition of certain special functions, % e.g., roots and logarithms. (Much work, requires rewriting % of a large part of the code.) % f) With e) it is easy to implement a DEFTAYLOR operator so that % the user may define the Taylor expansion of an unknown % function. % g) This would also allow the use of Taylor for power series % solutions of ODEs. % h) Implement a sort of lazy evaluation scheme, similar to the % one used in the TPS package written by Alan Barnes and % Julian Padget. This would allow the calculation of more % terms of a series when they are needed. % i) Replace all non-id kernels that are independent of the Taylor % variables by gensyms. This would reduce the size of the % expressions. % % create!-package('(Taylor TayIntro TayUtils TayIntrf TayExpnd TayBasic TaySimp TaySubst TayDiff TayConv TayPrint TayFront TayFns TayRevrt TayImpl TayPart), '(contrib taylor)); %***************************************************************** % % Non-local variables used in this package % %***************************************************************** fluid '(Taylor!:version % version number Taylor!:date!* % release date TaylorPrintTerms % Number of terms to be printed !*tayexpanding!* !*tayrestart!* !*taylorkeeporiginal % \ !*taylorautoexpand % \ !*taylorautocombine % > see below !*taylorprintorder % / !*trtaylor % / convert!-Taylor!* !*sub2 !*verboseload); share TaylorPrintTerms; comment This package has six switches: `TAYLORKEEPORIGINAL' causes the expression for which the expansion is performed to be kept. `TAYLORAUTOEXPAND' makes Taylor expressions ``contagious'' in the sense that all other terms are automatically Taylor expanded and combined. `TAYLORAUTOCOMBINE' causes taysimpsq to be applied to all expressions containing Taylor kernels. This is equivalent to applying `TAYLORCOMBINE' to all those expressions. If `TAYLORPRINTORDER' is set to ON Taylor kernels are printed in big-O notation instead of just printing three dots. `TRTAYLOR', if on, prints some information about the expansion process. `VERBOSELOAD' is a variable used by Portable Standard Lisp and causes a loading info to be printed; switch taylorautocombine, taylorautoexpand, taylorkeeporiginal, taylorprintorder, trtaylor, verboseload; convert!-Taylor!* := nil; % flag indicating that Taylor kernels % should be converted to prefix forms TaylorPrintTerms := 5; % Only this nubmer of non-zero terms % will normally be printed. !*taylorkeeporiginal := nil; % used to indicate if the original % expressions (before the expansion) % are to be kept. !*taylorautoexpand := nil; % set if non-taylor expressions are to % be expanded automatically on % combination. !*taylorautocombine := t; % set if taysimpsq should be added to % the MUL!* list. !*taylorprintorder := t; % set if Taylor kernels should be printed % with big-O notation, now on by default. %!*verboseload := nil; % set if loading info should be printed !*tayexpanding!* := nil; % set by taylorexpand to indicate that % expansion is in progress. !*tayrestart!* := nil; % set by Taylor!-error!* if expansion is % in progress to indicate that the error % might disappear if the order is % increased. Taylor!:version := "2.1g"; % version number of the package Taylor!:date!* := "17-Jun-97"; % release date if !*verboseload then << terpri (); prin2 "TAYLOR PACKAGE, version "; prin2 Taylor!:version; prin2 ", as of "; prin2 Taylor!:date!*; prin2t " for REDUCE 3.6 being loaded..."; terpri () >> ; exports !*tay2f, !*tay2q, !*TayExp2q, copy!-list, cst!-Taylor!*, get!-degree, get!-degreelist, has!-Taylor!*, has!-TayVars, make!-cst!-coefficient, make!-cst!-coefflis, make!-cst!-powerlist, make!-Taylor!*, multintocoefflist, nzerolist, prepTayExp, resimpcoefflist, resimptaylor, set!-TayCfPl, set!-TayCfSq, set!-TayCoeffList, set!-TayFlags, set!-TayOrig, set!-TayTemplate, subs2coefflist, TayCfPl, TayCfSq, TayCoeffList, TayDegreeSum, TayExp!-difference, TayExp!-greaterp, TayExp!-lessp, TayExp!-max2, TayExp!-min2, TayExp!-minus, TayExp!-minusp, TayExp!-plus, TayExp!-plus2, TayExp!-times, TayExp!-times2, TayFlags, TayFlagsCombine, TayGetCoeff, Taylor!*p, Taylor!-kernel!-sf!-p, Taylor!-kernel!-sq!-p, Taylor!:, TayMakeCoeff, taymincoeff, taymultcoeffs, TayOrig, TayTemplate, TayTpElNext, TayTpElOrder, TayTpElPoint, TayTpElVars, TayVars, TpDegreeList; imports % from REDUCE kernel: !*f2q, !*i2rn, !*p2f, !*p2q, !:minusp, confusion, domainp, eqcar, kernp, lastpair, lc, ldeg, lpriw, mathprint, mk!*sq, mksp, multsq, mvar, nlist, numr, over, prin2t, red, resimp, rndifference!:, rnminus!:, rnminusp!:, rnplus!:, rnprep!:, rnquotient!:, rntimes!:, simprn, smember, subs2, subs2!*, % from module Tayintro: smemberlp, % from module Tayutils: add!-degrees; %***************************************************************** % % General utility smacros % %***************************************************************** symbolic smacro procedure nzerolist n; % % generates a list of n zeros % nlist (0, n); symbolic smacro procedure copy!-list l; % % produces a copy of list l. % append (l, nil); %***************************************************************** % % Selector and constructor smacros for Taylor kernels % %***************************************************************** symbolic smacro procedure make!-Taylor!* (cflis, tp, orig, flgs); % % Builds a new Taylor kernel structure out of its parts. % {'Taylor!*, cflis, tp, orig, flgs}; symbolic smacro procedure TayMakeCoeff (u, v); % % Builds a coefficient from degreelist and s.q. % u . v; comment Selector smacros for the parts of a Taylor kernel; symbolic smacro procedure TayCoeffList u; cadr u; symbolic smacro procedure TayTemplate u; caddr u; symbolic smacro procedure TayOrig u; cadddr u; symbolic smacro procedure TayFlags u; car cddddr u; symbolic smacro procedure TayCfPl u; car u; symbolic smacro procedure TayCfSq u; cdr u; symbolic smacro procedure TayTpVars tp; for each x in tp join copy!-list car x; symbolic smacro procedure TayVars u; TayTpVars TayTemplate u; symbolic smacro procedure TayGetCoeff (degrlis, coefflis); (if null cc then nil ./ 1 else TayCfSq cc) where cc := assoc (degrlis, coefflis); symbolic smacro procedure TayTpElVars u; car u; symbolic smacro procedure TayTpElPoint u; cadr u; symbolic smacro procedure TayTpElOrder u; caddr u; symbolic smacro procedure TayTpElNext u; cadddr u; symbolic smacro procedure TpDegreeList tp; for each x in tp collect TayTpElOrder x; symbolic smacro procedure TpNextList tp; for each x in tp collect TayTpElNext x; %symbolic smacro procedure TayDegreeList u; % TpDegreeList TayTemplate u; symbolic smacro procedure TayDegreeSum u; for each x in TayTemplate u sum TayTpElOrder x; comment Modification smacros; symbolic smacro procedure set!-TayCoeffList (u, v); % % Sets TayCoeffList part of Taylor kernel u to v % rplaca (cdr u, v); symbolic smacro procedure set!-TayTemplate (u, v); % % Sets TayTemplate part of Taylor kernel u to v % rplaca (cddr u, v); symbolic smacro procedure set!-TayOrig (u, v); % % Sets TayOrig part of Taylor kernel u to v % rplaca (cdddr u, v); symbolic smacro procedure set!-TayFlags (u, v); % % Sets TayFlags part of Taylor kernel u to v % rplaca (cddddr u, v); symbolic smacro procedure set!-TayCfPl (u, v); rplaca (u, v); symbolic smacro procedure set!-TayCfSq (u, v); rplacd (u, v); comment Smacro that implement arithmetic operations on exponents in powerlist; symbolic smacro procedure exponent!-check!-int rn; if cddr rn=1 then cadr rn else rn; symbolic procedure !*TayExp2q u; if atom u then !*f2q (if zerop u then nil else u) else cdr u; symbolic procedure !*q2TayExp u; (if null x then confusion '!*q2TayExp else exponent!-check!-int car x) where x := simprn {mk!*sq u}; symbolic procedure prepTayExp u; if atom u then u else rnprep!: u; symbolic macro procedure TayExp!-plus x; if null cdr x then 0 else if null cddr x then cadr x else expand(cdr x,'TayExp!-plus2); symbolic procedure TayExp!-plus2(e1,e2); if atom e1 and atom e2 then e1+e2 else exponent!-check!-int( if atom e1 then rnplus!:(!*i2rn e1,e2) else if atom e2 then rnplus!:(e1,!*i2rn e2) else rnplus!:(e1,e2)); symbolic procedure TayExp!-difference(e1,e2); if atom e1 and atom e2 then e1-e2 else exponent!-check!-int( if atom e1 then rndifference!:(!*i2rn e1,e2) else if atom e2 then rndifference!:(e1,!*i2rn e2) else rndifference!:(e1,e2)); symbolic procedure TayExp!-minus e; if atom e then -e else rnminus!: e; symbolic macro procedure TayExp!-times x; if null cdr x then 1 else if null cddr x then cadr x else expand(cdr x,'TayExp!-times2); symbolic procedure TayExp!-times2(e1,e2); if atom e1 and atom e2 then e1*e2 else exponent!-check!-int( if atom e1 then rntimes!:(!*i2rn e1,e2) else if atom e2 then rntimes!:(e1,!*i2rn e2) else rntimes!:(e1,e2)); symbolic procedure TayExp!-quotient(u,v); exponent!-check!-int rnquotient!:(if atom u then !*i2rn u else u, if atom v then !*i2rn v else v); symbolic procedure TayExp!-minusp e; if atom e then minusp e else rnminusp!: e; symbolic procedure TayExp!-greaterp(a,b); TayExp!-lessp(b,a); symbolic macro procedure TayExp!-geq x; {'not,'TayExp!-lessp . cdr x}; symbolic procedure TayExp!-lessp(e1,e2); if atom e1 and atom e2 then e1<e2 else !:minusp TayExp!-difference(e1,e2); symbolic macro procedure TayExp!-leq x; {'not,'TayExp!-greaterp . cdr x}; symbolic procedure TayExp!-max2(e1,e2); if TayExp!-lessp(e1,e2) then e2 else e1; symbolic procedure TayExp!-min2(e1,e2); if TayExp!-lessp(e1,e2) then e1 else e2; symbolic macro procedure Taylor!: u; sublis('((plus . TayExp!-plus) (plus2 . TayExp!-plus2) (difference . TayExp!-difference) (minus . TayExp!-minus) (times . TayExp!-times) (times2 . TayExp!-times2) (minusp . TayExp!-minusp) (greaterp . TayExp!-greaterp) (geq . TayExp!-geq) (lessp . TayExp!-lessp) (leq . TayExp!-leq) (max2 . TayExp!-max2) (min2 . TayExp!-min2)), cadr u); comment Smacros and procedures that are commonly used ; symbolic smacro procedure TayFlagsCombine (u, v); % % Not much for now % nil; symbolic smacro procedure get!-degree dg; % % Procedure to handle degree parts of Taylor kernels. % Taylor!: for each n in dg sum n; symbolic smacro procedure get!-degreelist dgl; for each dg in dgl collect get!-degree dg; symbolic smacro procedure invert!-powerlist pl; Taylor!: for each nl in pl collect for each p in nl collect -p; symbolic smacro procedure taymultcoeffs (c1, c2); % % (TayCoeff, TayCoeff) -> TayCoeff % % multiplies the two coefficients c1,c2. % both are of the form (TayPowerList . s.q.) % so generate an appropriate degreelist by adding the degrees. % TayMakeCoeff (add!-degrees (TayCfPl c1, TayCfPl c2), multsq (TayCfSq c1, TayCfSq c2)); symbolic smacro procedure prune!-coefflist(cflist); <<while not null cflis and null numr TayCfSq car cflis do cflis := cdr cflis; cflis>> where cflis := cflist; symbolic smacro procedure multintocoefflist(coefflis,sq); % % (TayCoeffList, s.q.) -> TayCoeffList % % Multiplies each coefficient in coefflis by the s.q. sq. % for each p in coefflis collect TayMakeCoeff(TayCfPl p,resimp subs2!* multsq(TayCfSq p,sq)); symbolic smacro procedure subs2coefflist clist; for each pp in clist join ((if not null numr sq then {TayMakeCoeff(TayCfPl pp,sq)}) where sq := subs2!* TayCfSq pp); symbolic smacro procedure resimpcoefflist clist; for each cc in clist collect TayMakeCoeff(TayCfPl cc,subs2 resimp TayCfSq cc); symbolic smacro procedure resimptaylor u; % % (TaylorKernel) -> TaylorKernel % % u is a Taylor kernel, value is the Taylor kernel % with coefficients and TayOrig part resimplified % make!-Taylor!* ( resimpcoefflist TayCoeffList u, TayTemplate u, if !*taylorkeeporiginal and TayOrig u then resimp TayOrig u else nil, TayFlags u); symbolic smacro procedure make!-cst!-powerlist tp; % % (TayTemplate) -> TayPowerList % % Generates a powerlist for the constant coefficient % according to template tp % for each el in tp collect nzerolist length TayTpElVars el; symbolic smacro procedure make!-cst!-coefficient (cst, tp); % % (s.q., TayTemplate) -> TayCoefficient % % Generates the constant coefficient cst % according to Taylor template tp % TayMakeCoeff (make!-cst!-powerlist tp, cst); symbolic smacro procedure make!-cst!-coefflis (cst, tp); % % (s.q., TayTemplate) -> TayCoeffList % % Generates a TayCoeffList with only the constant coefficient cst % according to Taylor template tp % {make!-cst!-coefficient (cst, tp)}; symbolic smacro procedure cst!-Taylor!* (cst, tp); % % (s.q., TayTemplate) -> TaylorKernel % % generates a Taylor kernel with template tp for the constant cst. % make!-Taylor!* ( make!-cst!-coefflis (cst, tp), tp, cst, nil); comment Predicates; symbolic smacro procedure has!-Taylor!* u; % % (Any) -> Boolean % % checks if an expression u contains a Taylor kernel % smember ('Taylor!*, u); symbolic smacro procedure Taylor!*p u; % % (Kernel) -> Boolean % % checks if kernel u is a Taylor kernel % eqcar (u, 'Taylor!*); symbolic smacro procedure Taylor!-kernel!-sf!-p u; % % (s.f.) -> Boolean % % checks if s.f. u is a Taylor kernel % not domainp u and null red u and lc u = 1 and ldeg u = 1 and Taylor!*p mvar u; symbolic smacro procedure Taylor!-kernel!-sq!-p u; % % u is a standard quotient, % returns t if it is simply a Taylor kernel % kernp u and Taylor!*p mvar numr u; symbolic smacro procedure has!-TayVars(tay,ex); % % Checks whether ex contains any of the Taylor variables % of Taylor kernel tay. % smemberlp(TayVars tay,ex); symbolic procedure Taylor!*!-zerop tay; TayCoeffList!-zerop TayCoefflist tay; symbolic procedure TayCoeffList!-zerop tcl; null tcl or null numr TayCfSq car tcl and TayCoeffList!-zerop cdr tcl; comment smacros for the generation of unique Taylor kernels; symbolic smacro procedure !*tay2f u; !*p2f mksp (u, 1); symbolic smacro procedure !*tay2q u; !*p2q mksp (u, 1); comment some procedures for tracing; symbolic smacro procedure Taylor!-trace u; if !*trtaylor then lpri("Taylor: " . if u and atom u then list u else u); symbolic smacro procedure Taylor!-trace!-mprint u; if !*trtaylor then mathprint u; endmodule; end;