I just pushed an update to the cl-num-utils repository, merging a branch which implements function approximation with Chebyshev polynomials.
For example,
(defun myfun (x) "Function that we want to approximate." (expt x -2)) (defparameter *myapprox* (chebyshev-approximate #'myfun (interval 2 10) 8) "Chebyshev approximation for MYFUN on the interval [2,10], using 8 Chebyshev polynomials.") (myfun 5d0) ; 0.04d0 (funcall *myapprox* 5) ; 0.04018023309369832d0
Approximation with Chebyshev polynomials is very fast and stable because it does not require a matrix inversion (Chebyshev polynomials are orthogonal), and thus it is a very nice procedure if you want to approximate a "smooth" function that is expensive to evaluate.
I also extended the interval code in cl-num-utils
, now it handles open and infinite endpoints. This extension is experimental and not all functions understand it at the moment, but you can use my new extended-reals library to denote infinites, for example
(chebyshev-approximate #'sqrt (interval 0 (xr:inf)) 10)
would approximate \(x\mapsto\sqrt{x}\) on \([0,\infty)\). I will blog about extended-reals
soon.
Note, if you fix the github issue #12, cl-num-utils will (hopefully) build on lisps other than SBCL
ReplyDeleteI fixed the issue in the latest commit, thanks for the reminder. Note that the library needs the latest let-plus.
Delete