% Copyright The Numerical Algorithms Group Limited 1991. % Certain derivative-work portions Copyright (C) 1988 by Leslie Lamport. % All rights reserved % Title: Integration \begin{page}{ExIntRationalFunction}{Integral of a Rational Function} \beginscroll The following fraction has a denominator which factors into a quadratic and a quartic irreducible polynomial. The usual partial fraction approach used by most other computer algebra systems either fails or introduces expensive unneeded algebraic numbers. We use a factorization-free algorithm. \spadpaste{integrate((x**2+2*x+1)/((x+1)**6+1),x)} There are cases where algebraic numbers are absolutely necessary. In that case the answer to the \spadfun{integrate} command will contain symbols like \spad{\%\%F0} denoting the algebraic numbers used. To find out what the definitions for these numbers is use the \spadfun{definingPolynomial} operation on these numbers. \spadpaste{integrate(1/(x**3+x+1),x) \bound{i}} For example, if a symbol like \spad{\%\%F0} appears in the result of this last integration, then \spad{definingPolynomial \%\%F0} will return the polynomial that \spad{\%\%F0} is a root of. The next command isolates the algebraic number from the expression and displays its defining polynomial. \spadpaste{definingPolynomial(tower(\%).2::EXPR INT) \free{i}} \endscroll \autobuttons\end{page} \begin{page}{ExIntRationalWithRealParameter}{Integral of a Rational Function with a Real Parameter} \beginscroll When real parameters are present, the form of the integral can depend on the signs of some expressions. Rather than query the user or make sign assumptions, \Language{} returns all possible answers. \spadpaste{integrate(1/(x**2 + a),x)} The integrate command generally assumes that all parameters are real. \endscroll \autobuttons\end{page} \begin{page}{ExIntRationalWithComplexParameter}{Integral of a Rational Function with a Complex Parameter} \beginscroll If the parameter is complex instead of real, then the notion of sign is undefined and there is a unique answer. You can request this answer by prepending the word `complex' to the command name: \spadpaste{complexIntegrate(1/(x**2 + a),x)} \endscroll \autobuttons\end{page} \begin{page}{ExIntTwoSimilarIntegrands}{Two Similar Integrands Producing Very Different Results} \beginscroll The following two examples illustrate the limitations of table based approaches. The two integrands are very similar, but the answer to one of them requires the addition of two new algebraic numbers. This one is the easy one: \spadpaste{integrate(x**3 / (a+b*x)**(1/3),x)} The next one looks very similar but the answer is much more complicated. Only an algorithmic approach is guaranteed to find what new constants must be added in order to find a solution: \spadpaste{integrate(1 / (x**3 * (a+b*x)**(1/3)),x)} \endscroll \autobuttons\end{page} \begin{page}{ExIntNoSolution}{An Integral Which Does Not Exist} \beginscroll Most computer algebra systems use heuristics or table-driven approaches to integration. When these systems cannot determine the answer to an integration problem, they reply "I don't know". \Language{} uses a complete algorithm for integration. It will conclusively prove that an integral cannot be expressed in terms of elementary functions. When \Language{} returns an integral sign, it has proved that no answer exists as an elementary function. \spadpaste{integrate(log(1 + sqrt(a*x + b)) / x,x)} \endscroll \autobuttons\end{page} %% This example is broken %\begin{page}{ExIntChangeOfVariables}{No Change of Variables is Required} %\beginscroll %Unlike computer algebra systems which rely on heuristics and %table-lookup, the algorithmic integration facility %of \Language{} never requires you to make a change of variables %in order to integrate a function. %\spadpaste{integrate(sec(x)**(4/5)*csc(x)**(6/5),x)} %\endscroll %\autobuttons\end{page} \begin{page}{ExIntTrig}{A Trigonometric Function of a Quadratic} \beginscroll \Language{} can handle complicated mixed functions way beyond what you can find in tables: \spadpaste{integrate((sinh(1+sqrt(x+b))+2*sqrt(x+b))/(sqrt(x+b)*(x+cosh(1+sqrt(x+b)))),x)} Whenever possible, \Language{} tries to express the answer using the functions present in the integrand. \endscroll \autobuttons\end{page} \begin{page}{ExIntAlgebraicRelation}{Integrating a Function with a Hidden Algebraic Relation} \beginscroll A strong structure checking algorithm in \Language{} finds hidden algebraic relationships between functions. \spadpaste{integrate(tan(atan(x)/3),x)} The discovery of this algebraic relationship is necessary for correctly integrating this function. \downlink{Details.}{ExIntAlgebraicRelationExplain} \space{1} \endscroll \autobuttons\end{page} \begin{page}{ExIntAlgebraicRelationExplain}{Details for integrating a function wiht a Hidden Algebraic Relation} \beginscroll Steps taken for integration of: \centerline{{\em f := tan(atan(x)/3)}} \beginitems \item 1. Replace {\em f} by an equivalent algebraic function {\em g} satisfying the algebraic relation: \centerline{{\em g**3 - 3*x*g - 3*g + x = 0}} \item 2. Integrate {\em g} using using this algebraic relation; this produces: \centerline{{\em (24g**2 - 8)log(3g**2 - 1) + (81x**2 + 24)g**2 + 72xg - 27x**2 - 16}} \centerline{{\em / (54g**2 - 18)}} \item 3. Rationalize the denominator, producing: \centerline{{\em (8log(3g**2-1) - 3g**2 + 18xg + 15)/18}} \item 4. Replace {\em g} by the initial {\em f} to produce the final result: \centerline{{\em (8log(3tan(atan(x/3))**2-1) - 3tan(atan(x/3))**2 - 18xtan(atan(x/3) + 16)/18)}} \enditems \endscroll \autobuttons\end{page} \begin{page}{ExIntRadicalOfTranscendental}{An Integral Involving a Root of a Transcendental Function} \beginscroll This is an example of a mixed function where the algebraic layer is over the transcendental one. \spadpaste{integrate((x + 1) / (x * (x + log x)**(3/2)),x)} \endscroll \autobuttons\end{page} \begin{page}{ExIntNonElementary}{An Integral of a Non-elementary Function} \beginscroll While incomplete for non-elementary functions, \Language{} can handle some of them: \spadpaste{integrate(exp(-x**2) * erf(x) / (erf(x)**3 - erf(x)**2 - erf(x) + 1),x)} \endscroll \autobuttons\end{page}