diff --git a/basis-splines.lisp b/basis-splines.lisp index f93aaf35207eb31b9848c687db322ab3403e7ca4..e9215f22dd8df38930f718bfbf677c7a64e06e8a 100644 --- a/basis-splines.lisp +++ b/basis-splines.lisp @@ -1,6 +1,6 @@ ;; Basis splines. ;; Liam Healy 2008-02-18 14:43:20EST basis-splines.lisp -;; Time-stamp: <2009-01-25 10:11:48EST basis-splines.lisp> +;; Time-stamp: <2009-01-28 20:55:57EST basis-splines.lisp> ;; $Id$ (in-package :gsl) @@ -12,6 +12,7 @@ (defmobject basis-spline "gsl_bspline" ((order sizet) (number-of-breakpoints sizet)) "basis spline" + :gsl-version (1 9) :documentation ; FDL "Allocate a workspace for computing B-splines. The number of breakpoints is given by number-of-breakpoints. This leads to n = @@ -22,6 +23,7 @@ (defmfun knots (breakpoints workspace) "gsl_bspline_knots" (((mpointer breakpoints) :pointer) ((mpointer workspace) :pointer)) + :gsl-version (1 9) :documentation ; FDL "Compute the knots associated with the given breakpoints and store them in the workspace.") @@ -30,16 +32,22 @@ "gsl_bspline_knots_uniform" ((a :double) (b :double) ((mpointer workspace) :pointer)) :return (workspace) + :gsl-version (1 9) :documentation ; FDL "Compute knots uniformly on the interval [a, b] and store them in the workspace.") ;;; Evaluation of B-splines -(defmfun evaluate-bspline (x B workspace) +(defmfun evaluate + ((workspace basis-spline) x + &key (B (make-marray 'double-float + :dimensions (number-of-coefficients workspace)))) "gsl_bspline_eval" ((x :double) ((mpointer B) :pointer) ((mpointer workspace) :pointer)) + :definition :method :outputs (B) + :gsl-version (1 9) :documentation ; FDL "Evaluate all B-spline basis functions at the position x and store them in the GSL vector B, so that the ith element of B is B_i(x). @@ -53,27 +61,31 @@ ;;; These are not documented but are in ;;; /usr/include/gsl/gsl_bspline.h; are they officially supported? -(defmfun bspline-ncoeffs (B) +(defmfun number-of-coefficients (bspline) "gsl_bspline_ncoeffs" - (((mpointer B) :pointer)) - :c-return sizet) + (((mpointer bspline) :pointer)) + :c-return sizet + :gsl-version (1 9)) -(defmfun bspline-order (B) +(defmfun order (bspline) "gsl_bspline_order" - (((mpointer B) :pointer)) - :c-return sizet) + (((mpointer bspline) :pointer)) + :c-return sizet + :gsl-version (1 9)) -(defmfun number-of-breakpoints (B) +(defmfun number-of-breakpoints (bspline) "gsl_bspline_nbreak" - (((mpointer B) :pointer)) + (((mpointer bspline) :pointer)) :c-return sizet - :documentation "The number of breakpoints of the basis spline B.") + :gsl-version (1 9) + :documentation "The number of breakpoints of the basis spline bspline.") -(defmfun breakpoint (i B) +(defmfun breakpoint (i bspline) "gsl_bspline_breakpoint" - ((i sizet) ((mpointer B) :pointer)) + ((i sizet) ((mpointer bspline) :pointer)) :c-return :double - :documentation "The ith breakpoint of the basis spline B.") + :gsl-version (1 9) + :documentation "The ith breakpoint of the basis spline bspline.") ;;; Examples and unit test @@ -105,7 +117,7 @@ ;; Fit matrix (dotimes (i ndata) ;; Compute B_j - (evaluate-bspline (maref x i) B bw) + (evaluate bw (maref x i) :b B) ;; Fill in row i of X (dotimes (j ncoeffs) (setf (maref Xmatrix i j) (maref B j)))) @@ -115,9 +127,11 @@ (loop for xi from 0.0d0 to 15.0d0 by 0.1d0 with yval and yerr do - (evaluate-bspline xi B bw) + (evaluate bw xi :b B) (multiple-value-setq (yval yerr) (multi-linear-estimate B c cov)) collect yval into yvals collect yerr into yerrs finally (return (values yvals yerrs))))) + +(save-test basis-spline (bspline-example)) diff --git a/chebyshev.lisp b/chebyshev.lisp index 67b551ccc810bc8b7f6dc5b6965bfb6170782fc5..bbf3c920e8cc389a3c376977499834d009a78544 100644 --- a/chebyshev.lisp +++ b/chebyshev.lisp @@ -1,6 +1,6 @@ ;; Chebyshev Approximations ;; Liam Healy Sat Nov 17 2007 - 20:36 -;; Time-stamp: <2009-01-25 10:12:45EST chebyshev.lisp> +;; Time-stamp: <2009-01-28 19:05:30EST chebyshev.lisp> ;; $Id$ (in-package :gsl) @@ -26,12 +26,13 @@ ;;; The functions that don't return are defined, but it is recommended ;;; to use the functions that do return error (and ignore it if -;;; desired) in the form of #'evaluate-chebyshev. +;;; desired) in the form of #'evaluate. -(defmfun evaluate-chebyshev (chebyshev x &optional order) +(defmfun evaluate ((object chebyshev) x &key order) ("gsl_cheb_eval" "gsl_cheb_eval_n") - ((((mpointer chebyshev) :pointer) (x :double)) - (((mpointer chebyshev) :pointer) (order sizet) (x :double))) + ((((mpointer object) :pointer) (x :double)) + (((mpointer object) :pointer) (order sizet) (x :double))) + :definition :method :c-return :double :documentation ; FDL "Evaluate the Chebyshev series at a point x. If order is supplied, @@ -89,8 +90,8 @@ (format t "~&~a ~a ~a ~a" x (chebyshev-step x) - (evaluate-chebyshev cheb x 10) - (evaluate-chebyshev cheb x))))))) + (evaluate cheb x :order 10) + (evaluate cheb x))))))) (defun chebyshev-point-example (x) (check-type x double-float) @@ -101,9 +102,9 @@ (derivative-chebyshev deriv cheb) (integral-chebyshev integ cheb) (list - (evaluate-chebyshev cheb x) - (evaluate-chebyshev deriv x) - (evaluate-chebyshev integ x)))) + (evaluate cheb x) + (evaluate deriv x) + (evaluate integ x)))) ;;; Unit test (save-test chebyshev diff --git a/documentation/status.text b/documentation/status.text index 5f345c4d4f88dca6d5e8634f4cf03d25d06389d7..09d580a4cda9f4edf587efc87da0eda903ed411e 100644 --- a/documentation/status.text +++ b/documentation/status.text @@ -35,6 +35,7 @@ series-acceleration linear-least-squares nonlinear-least-squares minimization-multi +basis-spline === GSL questions === Sun Nov 9 2008: @@ -48,3 +49,6 @@ Sun Jan 11 2009: gsl_permutation_valid (presumably combination too) signals an error if the permutation is invalid, rather than just returning an error code. Is this intentional? +Wed Jan 28 2009: +What are the _e functions in interpolation for, how are the results to +be interpreted? diff --git a/gsll-tests.asd b/gsll-tests.asd index 6036e1866c367b7cd2691b5fcd9f3735bd51d0bd..6c8100572f86c64a6916036bdd53b60d95b03a35 100644 --- a/gsll-tests.asd +++ b/gsll-tests.asd @@ -1,6 +1,6 @@ ;; Definition of GSLL system ;; Liam Healy -;; Time-stamp: <2009-01-26 22:45:42EST gsll-tests.asd> +;; Time-stamp: <2009-01-28 20:59:16EST gsll-tests.asd> ;; $Id$ (asdf:defsystem "gsll-tests" @@ -24,6 +24,7 @@ (:file "airy") (:file "autocorrelation") (:file "axpy") + (:file "basis-spline") (:file "bernoulli") (:file "bessel") (:file "beta") diff --git a/gsll.asd b/gsll.asd index 975c2a05b2bfa03bcda2ed9caccf2ba02db4a499..f40230c6b851f694b41551b3ee773e812df2de93 100644 --- a/gsll.asd +++ b/gsll.asd @@ -1,6 +1,6 @@ ;; Definition of GSLL system ;; Liam Healy -;; Time-stamp: <2009-01-24 16:56:13EST gsll.asd> +;; Time-stamp: <2009-01-28 21:05:10EST gsll.asd> ;; $Id$ (asdf:defsystem "gsll" @@ -196,4 +196,4 @@ (:file "minimization-multi" :depends-on (generic)) (:file "linear-least-squares") (:file "nonlinear-least-squares" :depends-on (generic)))) - (:file "basis-splines" :depends-on (init data)))) + (:file "basis-splines" :depends-on (init data random)))) diff --git a/init/init.lisp b/init/init.lisp index 0c606ffa8d3030296fe9203cf3f3c9455ac99c1d..01ad46714ebf9d71be89a06383ec9a9e47f1eb79 100644 --- a/init/init.lisp +++ b/init/init.lisp @@ -1,6 +1,6 @@ ;; Load GSL ;; Liam Healy Sat Mar 4 2006 - 18:53 -;; Time-stamp: <2009-01-26 21:39:39EST init.lisp> +;; Time-stamp: <2009-01-27 21:32:59EST init.lisp> ;; $Id$ (defpackage gsll @@ -44,8 +44,9 @@ (pushnew :callback-toplevel-only *features*)) ;;; CFFI currently doesn't allow uninterned callback names for CCL; -;;; patch here. - +;;; patch here. This patch can be removed once the fix in CFFI: +;;; http://common-lisp.net/pipermail/cffi-devel/2009-January/003046.html +;;; makes it into a released version. #-openmcl (import 'cl-utilities:with-unique-names :gsll) #+openmcl diff --git a/init/mobject.lisp b/init/mobject.lisp index 9a63b10bc72f483f74a155a4ba3baa36cf1cabd1..4e43f43ffac6a2a3203b546776d2f9180018ee75 100644 --- a/init/mobject.lisp +++ b/init/mobject.lisp @@ -1,7 +1,6 @@ ;; Definition of GSL objects and ways to use them. ;; Liam Healy, Sun Dec 3 2006 - 10:21 -;; Time-stamp: <2009-01-25 17:27:46EST mobject.lisp> -;; $Id$ +;; Time-stamp: <2009-01-28 19:19:54EST mobject.lisp> ;;; GSL objects are represented in GSLL as and instance of a 'mobject. ;;; The macro demobject takes care of defining the appropriate @@ -149,6 +148,10 @@ (defgeneric name (object) (:documentation "The name given to the GSL object.")) +(export 'evaluate) +(defgeneric evaluate (object point &key) + (:documentation "Evaluate the GSL object.")) + ;;; Pointer type (eval-when (:compile-toplevel :load-toplevel :execute) (defconstant +foreign-pointer-class+ (class-name (class-of (cffi:null-pointer))) diff --git a/interpolation/evaluation.lisp b/interpolation/evaluation.lisp index 265390059cc010da2421be75aef77ef5f0b9efed..7f453a574f3d087354c7725f34348b340736e2c1 100644 --- a/interpolation/evaluation.lisp +++ b/interpolation/evaluation.lisp @@ -1,12 +1,14 @@ ;; Evaluation of interpolation functions. -;; Liam Healy, Sun Nov 4 2007 - 18:40 +;; Liam Healy Sun Nov 4 2007 - 18:40 +;; Time-stamp: <2009-01-28 19:22:15EST evaluation.lisp> (in-package :gsl) -(defmfun evaluate-interpolation (interpolation xa ya x acceleration) +(defmfun evaluate ((interpolation interpolation) x &key xa ya acceleration) "gsl_interp_eval" (((mpointer interpolation) :pointer) (xa :pointer) (ya :pointer) (x :double) ((mpointer acceleration) :pointer)) + :definition :method :inputs (xa ya) :c-return :double :documentation ; FDL @@ -14,73 +16,76 @@ point x, using the interpolation object interpolation, data arrays xa and ya and the accelerator acceleration.") -(defmfun derivative-evaluate-interpolation (interpolation xa ya x acceleration) +(export 'evaluate-derivative) +(defgeneric evaluate-derivative (object point &key) + (:documentation ; FDL + "Find the derivative of an interpolated function for a given point + x, using the interpolation object interpolation, data arrays + xa and ya and the accelerator acceleration.")) + +(defmfun evaluate-derivative + ((interpolation interpolation) x &key xa ya acceleration) "gsl_interp_eval_deriv" (((mpointer interpolation) :pointer) (xa :pointer) (ya :pointer) (x :double) ((mpointer acceleration) :pointer)) + :definition :method :inputs (xa ya) - :c-return :double - :documentation ; FDL - "Find the derivative of an interpolated function for a given point + :c-return :double) + +(export 'evaluate-second-derivative) +(defgeneric evaluate-second-derivative (object point &key) + (:documentation ; FDL + "Find the second derivative of an interpolated function for a given point x, using the interpolation object interpolation, data arrays - xa and ya and the accelerator acceleration.") + xa and ya and the accelerator acceleration.")) -(defmfun second-derivative-evaluate-interpolation (interpolation xa ya x acceleration) +(defmfun evaluate-second-derivative + ((interpolation interpolation) x &key xa ya acceleration) "gsl_interp_eval_deriv2" (((mpointer interpolation) :pointer) (xa :pointer) (ya :pointer) (x :double) ((mpointer acceleration) :pointer)) + :definition :method :inputs (xa ya) - :c-return :double - :documentation ; FDL - "Find the second derivative of an interpolated function for a given point - x, using the interpolation object interpolation, data arrays - xa and ya and the accelerator acceleration.") + :c-return :double) -(defmfun integral-evaluate-interpolation (interpolation xa ya x low high acceleration) +(export 'evaluate-integral) +(defgeneric evaluate-integral (object lower-limit upper-limit &key) + (:documentation ; FDL + "Find the numerical integral of an interpolated function over the + range [low, high], using the interpolation object interpolation, + data arrays xa and ya and the accelerator 'acceleration.")) + +(defmfun evaluate-integral + ((interpolation interpolation) low high &key xa ya acceleration) "gsl_interp_eval_integ" - (((mpointer interpolation) :pointer) (xa :pointer) (ya :pointer) (x :double) + (((mpointer interpolation) :pointer) (xa :pointer) (ya :pointer) (low :double) (high :double) ((mpointer acceleration) :pointer)) + :definition :method :inputs (xa ya) - :c-return :double - :documentation ; FDL - "Find the numerical integral of an interpolated function over the - range [low, high], using the interpolation object interpolation, - data arrays xa and ya and the accelerator 'acceleration.") + :c-return :double) ;;; Spline -(defmfun evaluate-spline (spline x acceleration) +(defmfun evaluate ((spline spline) x &key acceleration) "gsl_spline_eval" (((mpointer spline) :pointer) (x :double) ((mpointer acceleration) :pointer)) - :c-return :double - :documentation - "Find the interpolated value of y for a given - point x, using the spline object spline, data arrays - xa and ya and the accelerator 'acceleration.") + :definition :method + :c-return :double) -(defmfun derivative-evaluate-spline (spline x acceleration) +(defmfun evaluate-derivative ((spline spline) x &key acceleration) "gsl_spline_eval_deriv" (((mpointer spline) :pointer) (x :double) ((mpointer acceleration) :pointer)) - :c-return :double - :documentation ; FDL - "Find the derivative of an interpolated function for a given point - x, using the spline object spline, data arrays - xa and ya and the accelerator acceleration.") + :definition :method + :c-return :double) -(defmfun second-derivative-evaluate-spline (spline x acceleration) +(defmfun evaluate-second-derivative ((spline spline) x &key acceleration) "gsl_spline_eval_deriv2" (((mpointer spline) :pointer) (x :double) ((mpointer acceleration) :pointer)) - :c-return :double - :documentation ; FDL - "Find the second derivative of an interpolated function for a given point - x, using the spline object spline, data arrays - xa and ya and the accelerator acceleration.") + :definition :method + :c-return :double) -(defmfun integral-evaluate-spline (spline x low high acceleration) +(defmfun evaluate-integral ((spline spline) low high &key acceleration) "gsl_spline_eval_integ" - (((mpointer spline) :pointer) (x :double) (low :double) (high :double) + (((mpointer spline) :pointer) (low :double) (high :double) ((mpointer acceleration) :pointer)) - :c-return :double - :documentation ; FDL - "Find the numerical integral of an interpolated function over the - range [low, high], using the spline object spline, - data arrays xa and ya and the accelerator acceleration.") + :definition :method + :c-return :double) diff --git a/interpolation/spline-example.lisp b/interpolation/spline-example.lisp index 6cd0b2ac92ab5370171ce5249f63bab79bd30e09..c047e1f22462ab8f653f320a332342b5199113fe 100644 --- a/interpolation/spline-example.lisp +++ b/interpolation/spline-example.lisp @@ -1,6 +1,6 @@ ;; Example spline ;; Liam Healy, Sat Nov 10 2007 - 21:18 -;; Time-stamp: <2009-01-26 22:43:41EST spline-example.lisp> +;; Time-stamp: <2009-01-28 19:05:32EST spline-example.lisp> ;; $Id$ (in-package :gsl) @@ -22,6 +22,6 @@ collect (+ i (cos (expt i 2)))))) (spline (make-spline *cubic-spline-interpolation* xarr yarr))) (loop for xi from (maref xarr 0) below (maref xarr 9) by step - collect (list xi (evaluate-spline spline xi acc))))) + collect (list xi (evaluate spline xi :acceleration acc))))) (save-test interpolation (spline-example 0.1d0)) diff --git a/interpolation/types.lisp b/interpolation/types.lisp index a8859dd6bd75b450f52756b26f8f458a6dec7dcc..67448f23938dcca652eaf50be6b4251f0f453fbf 100644 --- a/interpolation/types.lisp +++ b/interpolation/types.lisp @@ -1,6 +1,6 @@ ;; Interpolation types ;; Liam Healy, Sun Nov 4 2007 - 17:41 -;; Time-stamp: <2008-12-26 17:23:12EST types.lisp> +;; Time-stamp: <2009-01-28 21:02:31EST types.lisp> ;; $Id$ (in-package :gsl) @@ -53,28 +53,29 @@ :documentation ; FDL "The name of the interpolation type.") -(defmfun interpolation-minimum-size (interpolation) - "gsl_interp_min_size" - ((interpolation :pointer)) - :c-return :uint - :documentation ; FDL - "The minimum number of points required by the +(export 'minimum-size) +(defgeneric minimum-size (object) + (:documentation ; FDL + "The minimum number of points required by the interpolation. For example, Akima spline interpolation - requires a minimum of 5 points.") + requires a minimum of 5 points.")) + +(defmfun minimum-size ((object interpolation)) + "gsl_interp_min_size" + ((object :pointer)) + :definition :method + :c-return :uint) -(defmfun name ((interpolation spline)) +(defmfun name ((object spline)) "gsl_spline_name" - ((interpolation :pointer)) + ((object :pointer)) :definition :method :c-return :string :documentation ; FDL "The name of the interpolation type.") -(defmfun spline-minimum-size (interpolation) +(defmfun minimum-size ((object spline)) "gsl_spline_min_size" - ((interpolation :pointer)) - :c-return :uint - :documentation ; FDL - "The minimum number of points required by the - interpolation. For example, Akima spline interpolation - requires a minimum of 5 points.") + ((object :pointer)) + :definition :method + :c-return :uint) diff --git a/tests/basis-spline.lisp b/tests/basis-spline.lisp new file mode 100644 index 0000000000000000000000000000000000000000..65e3471ddd016411bed9cbba10ae66c1ecb45a99 --- /dev/null +++ b/tests/basis-spline.lisp @@ -0,0 +1,161 @@ +;; Regression test BASIS-SPLINE for GSLL, automatically generated + +(in-package :gsl) + +(LISP-UNIT:DEFINE-TEST BASIS-SPLINE + (LISP-UNIT::ASSERT-NUMERICAL-EQUAL + (LIST + (LIST 1.113654203601724d0 1.0568431616397642d0 + 0.9959492337772601d0 0.9313857548888193d0 + 0.863566059849049d0 0.7929034835325566d0 + 0.7198113608139506d0 0.6447030265678376d0 + 0.567991815668826d0 0.4900910629915223d0 + 0.4114141034105349d0 0.33237427180047124d0 + 0.25338490303593875d0 0.17485933199154502d0 + 0.09721089354189752d0 0.020852922561604002d0 + -0.05380124607472819d0 -0.1263382774924911d0 + -0.1963448368170776d0 -0.26340758917387974d0 + -0.32711319968829033d0 -0.3870483334857016d0 + -0.4427996556915059d0 -0.49395383143109584d0 + -0.5400975258298641d0 -0.5808174040132021d0 + -0.6157001311065035d0 -0.6443323722351599d0 + -0.6663007925245643d0 -0.681192057100109d0 + -0.6885928310871858d0 -0.6882406224802292d0 + -0.6804763107498367d0 -0.6657916182356474d0 + -0.6446782672773008d0 -0.6176279802144353d0 + -0.5851324793866916d0 -0.547683487133707d0 + -0.5057727257951217d0 -0.45989191771057447d0 + -0.4105327852197051d0 -0.3581870506621524d0 + -0.30334643637755515d0 -0.24650266470555254d0 + -0.18814745798578414d0 -0.12877253855788895d0 + -0.06886962876150586d0 -0.008930450936274169d0 + 0.05055327257816704d0 0.10908981944217858d0 + 0.16618746731612122d0 0.22135449386035613d0 + 0.27409917673524387d0 0.32392979360114527d0 + 0.37035462211842163d0 0.41288193994743294d0 + 0.451020024748541d0 0.48427715418210626d0 + 0.5121616059084895d0 0.5341816575880516d0 + 0.5498455868811536d0 0.5588101965535437d0 + 0.5613263897925215d0 0.5577935948907731d0 + 0.548611240140985d0 0.5341787538358442d0 + 0.5148955642680376d0 0.4911610997302516d0 + 0.4633747885151729d0 0.4319360589154882d0 + 0.39724433922388425d0 0.35969905773304744d0 + 0.31969964273566454d0 0.2776455225244224d0 + 0.23393612539200775d0 0.1889708796311067d0 + 0.14314921353440657d0 0.09687055539459387d0 + 0.050534333504354934d0 0.004539976156376795d0 + -0.04071308835665385d0 -0.08482543174205076d0 + -0.1273976257071268d0 -0.16803024195919558d0 + -0.20632385220557026d0 -0.24187902815356413d0 + -0.27429634151049076d0 -0.3031763639836635d0 + -0.3281196672803953d0 -0.34872682310799963d0 + -0.36459840317379d0 -0.3754490487696755d0 + -0.38144967952594844d0 -0.3828852846574976d0 + -0.38004085337921073d0 -0.37320137490597705d0 + -0.36265183845268406d0 -0.3486772332342208d0 + -0.3315625484654752d0 -0.31159277336133623d0 + -0.28905289713669163d0 -0.2642279090064302d0 + -0.23740279818544016d0 -0.2088625538886101d0 + -0.1788921653308282d0 -0.14777662172698278d0 + -0.11580091229196256d0 -0.0832500262406557d0 + -0.050408952787950545d0 -0.017562681148735534d0 + 0.015003799462100892d0 0.04700549982967023d0 + 0.07815743073908425d0 0.1081746029754547d0 + 0.13677202732389296d0 0.16366471456951057d0 + 0.18856767549741946d0 0.21119592089273095d0 + 0.23126446154055688d0 0.24848830822600862d0 + 0.262582471734198d0 0.27333670464506554d0 + 0.2808397267178692d0 0.2852549995066957d0 + 0.2867459845656324d0 0.2854761434487657d0 + 0.28160893771018297d0 0.275307828903971d0 + 0.2667362785842169d0 0.2560577483050075d0 + 0.2434356996204298d0 0.22903359408457066d0 + 0.21301489325151723d0 0.19554305867535646d0 + 0.17678155191017514d0 0.15689383451006045d0 + 0.13604336802909917d0 0.11439361402137835d0 + 0.09210803404098494d0 0.06935008964200592d0 + 0.04628324237852822d0 0.02307095380463884d0 + -1.23314525575291d-4 -0.023136101058027207d0 + -0.045803944238629914d0 -0.06796338251329648d0 + -0.08945095432793991d0 -0.11010319812847329d0 + -0.12975665236080958d0 -0.1482478554708619d0 + -0.16541334590454326d0) + (LIST 0.04806705033080089d0 0.04089343066177248d0 + 0.034838795412388296d0 0.029937767075799458d0 + 0.026213618017648477d0 0.02364307349757936d0 + 0.022116901458296107d0 0.021430143053988868d0 + 0.021322348932951398d0 0.021540474336457206d0 + 0.02188188435996076d0 0.0222054540673857d0 + 0.022423602505266982d0 0.022489166302883192d0 + 0.02238377836450195d0 0.022109367422047044d0 + 0.02168242334336044d0 0.02113023443609739d0 + 0.020488349912733197d0 0.019798630587670535d0 + 0.019107308016746295d0 0.018462493935536436d0 + 0.01791066877595287d0 0.017491988069952717d0 + 0.017234883590369513d0 0.017151229365993295d0 + 0.017233730244902976d0 0.017456620038303405d0 + 0.017779406748415688d0 0.01815223131949235d0 + 0.018521196010261802d0 0.018836982485690906d0 + 0.019073196350902363d0 0.019217327089085613d0 + 0.019264592249754273d0 0.019215982089075496d0 + 0.019076879879751867d0 0.018856100653805198d0 + 0.01856521914615675d0 0.018218084594983138d0 + 0.017830438293313017d0 0.017419558956751364d0 + 0.017003863777589945d0 0.01660239464194822d0 + 0.01623412741882151d0 0.015917067816497d0 + 0.015667148919313503d0 0.015497022432401463d0 + 0.0154149182208477d0 0.015423795822817681d0 + 0.01552098712890699d0 0.015698422254754915d0 + 0.015943380857972117d0 0.01623958758583504d0 + 0.016568424163857006d0 0.016910065000328406d0 + 0.01724442257851929d0 0.017551871015661132d0 + 0.017813775603460553d0 0.01801288827774422d0 + 0.018133681647331996d0 0.01816539214712614d0 + 0.018110548009755003d0 0.017976914236131087d0 + 0.017774358040422943d0 0.017514489203896186d0 + 0.017210386693353747d0 0.016876358562229223d0 + 0.016527686124981858d0 0.016180304623312883d0 + 0.01585037544111259d0 0.015553715088123652d0 + 0.015305069750358231d0 0.015117264542195192d0 + 0.015000309281752947d0 0.014960591645559853d0 + 0.015000309281752937d0 0.015117264542195157d0 + 0.01530506975035818d0 0.01555371508812358d0 + 0.015850375441112518d0 0.016180304623312797d0 + 0.016527686124981775d0 0.01687635856222915d0 + 0.01721038669335367d0 0.017514489203896116d0 + 0.017774358040422877d0 0.01797691423613104d0 + 0.018110548009754975d0 0.018165392147126116d0 + 0.018133681647331996d0 0.01801288827774424d0 + 0.017813775603460587d0 0.017551871015661177d0 + 0.017244422578519335d0 0.01691006500032847d0 + 0.016568424163857065d0 0.016239587585835095d0 + 0.01594338085797217d0 0.015698422254754957d0 + 0.015520987128907015d0 0.0154237958228177d0 + 0.015414918220847689d0 0.015497022432401438d0 + 0.015667148919313464d0 0.015917067816496943d0 + 0.016234127418821458d0 0.016602394641948143d0 + 0.017003863777589865d0 0.017419558956751284d0 + 0.017830438293312937d0 0.01821808459498308d0 + 0.018565219146156692d0 0.018856100653805146d0 + 0.01907687987975183d0 0.019215982089075486d0 + 0.019264592249754298d0 0.01921732708908566d0 + 0.01907319635090242d0 0.01883698248569099d0 + 0.018521196010261903d0 0.018152231319492448d0 + 0.01777940674841578d0 0.01745662003830348d0 + 0.017233730244903024d0 0.017151229365993295d0 + 0.017234883590369458d0 0.01749198806995261d0 + 0.017910668775952716d0 0.018462493935536253d0 + 0.019107308016746087d0 0.019798630587670316d0 + 0.02048834991273299d0 0.02113023443609719d0 + 0.02168242334336027d0 0.022109367422046923d0 + 0.02238377836450188d0 0.022489166302883185d0 + 0.022423602505267034d0 0.022205454067385794d0 + 0.021881884359960874d0 0.021540474336457317d0 + 0.021322348932951436d0 0.02143014305398876d0 + 0.022116901458295757d0 0.023643073497578673d0 + 0.02621361801764738d0 0.029937767075797934d0 + 0.03483879541238634d0 0.0408934306617701d0 + 0.04806705033079808d0)) + (MULTIPLE-VALUE-LIST (BSPLINE-EXAMPLE)))) +