\documentclass{article} \usepackage{open-axiom} \begin{document} \title{\$SPAD/src/algebra nqip.as} \author{Michael Richardson} \maketitle \begin{abstract} \end{abstract} \eject \tableofcontents \eject \section{NagQuadratureInterfacePackage} <>= +++ Author: M.G. Richardson +++ Date Created: 1995 Dec. 07 +++ Date Last Updated: +++ Basic Functions: +++ Related Constructors: +++ Also See: +++ AMS Classifications: +++ Keywords: +++ References: +++ Description: +++ This package provides Axiom-like interfaces to some of the NAG +++ quadrature (numerical integration) routines in the NAGlink. NagQuadratureInterfacePackage: with { nagPolygonIntegrate : (LDF, LDF) -> RCD(integral : DF, errorEstimate : DF) ; ++ nagPolygonIntegrate(xlist,ylist) evaluates the definite integral #if saturn ++ $\int_{x_{1}}^{x_{n}}y(x) \, dx$ #else ++ integrate(y(x), x=x[1]..x[n]) #endif ++ where the numerical value of the function \spad{y} is specified at ++ the \spad{n} distinct points #if saturn ++ $x_{1}, x_{2}, \ldots , x_{n}$. #else ++ x[1], x[2] ... x[n]. #endif ++ The \spad{x} and \spad{y} values are specified in the lists ++ \spad{xlist} and \spad{ylist}, respectively; the \spad{xlist} ++ values must form a strictly monotonic sequence of four or more ++ points. ++ The calculation is performed by the NAG routine D01GAF. ++ ++ An estimate of the numerical error in the calculation is also ++ returned; however, by choosing unrepresentative data points to ++ approximate the function it is possible to achieve an arbitrarily ++ large difference between the true integral and the value ++ calculated. ++ For more detailed information, please consult the NAG ++ manual via the Browser page for the operation d01gaf. nagPolygonIntegrate : MDF -> RCD(integral : DF, errorEstimate : DF) ; } == add { import from NagIntegrationPackage ; import from NagResultChecks ; import from AnyFunctions1 DF ; import from STRG ; import from List STRG ; import from Symbol ; import from LLDF ; import from VDF ; import from MDF ; import from ErrorFunctions ; local ipIfail : INT := -1 ; local d01gafError : DF := 0 ; nagPolygonIntegrate(xlist : LDF, ylist : LDF) : RCD(integral : DF, errorEstimate : DF) == { local lx, ly : INT ; local d01gafResult : RSLT ; lx := (# xlist) pretend INT ; ly := (# ylist) pretend INT ; if lx ~= ly then error ["The lists supplied to nagPolygonIntegrate are of ", "different lengths: ", string(lx), " and ", string(ly), "."] else { d01gafResult := d01gaf(matrix [xlist],matrix [ylist],lx,ipIfail) ; [checkResult(d01gafResult,"ans","D01GAF"), retract(d01gafResult."er") @ DF] } } nagPolygonIntegrate(coords : MDF) : RCD(integral : DF, errorEstimate : DF) == if (ncols(coords) pretend INT) ~= 2 then error ["Please supply the coordinate matrix in ", "nagPolygonIntegrate with each row consisting of ", "a single x-y pair."] else nagPolygonIntegrate(members column(coords,1), members column(coords,2)) ; } #if NeverAssertThis -- Note that the conversions of results from DoubleFloat to Float -- will become unnecessary if outputGeneral is extended to apply to -- DoubleFloat quantities. )lib nrc )lib nqip outputGeneral 5 xvals := [0.00,0.04,0.08,0.12,0.22,0.26,0.30,0.38,0.39,0.42,0.45, 0.46,0.60,0.68,0.72,0.73,0.83,0.85,0.88,0.90,1.00]; yvals := [4.0000,3.9936,3.9746,3.9432,3.8135,3.7467,3.6697,3.4943, 3.4719,3.4002,3.3264,3.3017,2.9412,2.7352,2.6344, 2.6094,2.3684,2.3222,2.2543,2.2099,2.0000]; result := nagPolygonIntegrate(xvals,yvals); result.integral :: Float -- 3.1414 result.errorEstimate :: Float -- - 0.000025627 coords := transpose matrix [xvals, yvals]; result := nagPolygonIntegrate coords; result.integral :: Float -- 3.1414 result.errorEstimate :: Float -- - 0.000025627 nagPolygonIntegrate([1,2,3],[1,2,3,4]) -- Error signalled from user code: -- The lists supplied to nagPolygonIntegrate are of different -- lengths: 3 and 4. nagPolygonIntegrate([[1,2,3],[4,5,6]]) -- Error signalled from user code: -- Please supply the coordinate matrix in nagPolygonIntegrate with -- each row consisting of single a x-y pair. outputGeneral() output "End of tests" #endif @ \section{License} <>= --Copyright (c) 1991-2002, The Numerical ALgorithms Group Ltd. --All rights reserved. -- --Redistribution and use in source and binary forms, with or without --modification, are permitted provided that the following conditions are --met: -- -- - Redistributions of source code must retain the above copyright -- notice, this list of conditions and the following disclaimer. -- -- - Redistributions in binary form must reproduce the above copyright -- notice, this list of conditions and the following disclaimer in -- the documentation and/or other materials provided with the -- distribution. -- -- - Neither the name of The Numerical ALgorithms Group Ltd. nor the -- names of its contributors may be used to endorse or promote products -- derived from this software without specific prior written permission. -- --THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS --IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED --TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A --PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER --OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, --EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, --PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR --PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF --LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING --NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS --SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. @ <<*>>= <> -- NagQuadratureInterfacePackage -- To test: -- sed -ne '1,/^#if NeverAssertThis/d;/#endif/d;p' < nqip.as > nqip.input -- axiom -- )set nag host -- )r nqip.input #unassert saturn #include "axiom.as" DF ==> DoubleFloat ; LDF ==> List DoubleFloat ; LLDF ==> List LDF ; VDF ==> Vector DoubleFloat ; MDF ==> Matrix DoubleFloat ; INT ==> Integer ; RCD ==> Record ; RSLT ==> Result ; STRG ==> String ; <> @ \eject \begin{thebibliography}{99} \bibitem{1} nothing \end{thebibliography} \end{document}