A further change could be to integrate for an Expression using a SegmentBinding:
)co gsl EF ==> Expression Float DF ==> DoubleFloat integrationQng(expr : EF, sb : SegmentBinding(EF)) : Record(result: DF, abserr: DF, neval: Integer) == (var, a, b) := (variable sb, lo segment sb, hi segment sb) integrationQng(makeFloatFunction(expr,var)$MakeFloatCompiledFunction(EF),a::DF,b::DF)$Gsl integrationQng(exp(-y^2),y=0..1) This is arguably more idiomatic. --- Mark On 11/04/2015 01:58 PM, Bill Page wrote: > On 3 November 2015 at 20:03, Alasdair McAndrew <amc...@gmail.com> wrote: >> A few thoughts: >> >> How do we allow for optional parameters (epsabs, epsrel, limit etc)? The >> approach taken by GSLL, and therefore by me in my version of gsl.spad was >> to overload the integration function, and to give values for the extra >> parameters when they weren't given by the user. This all had to be done in >> order: epsabs, epsrel, limit. This means that you can't set the limit >> without setting epsabs and epsrel first. Is there a "named" way of entering >> optional parameters in spad: >> integrationQng(x+->sin(x^2),0.0,%pi/2,'limit=2000) say? This means that the >> user can set any optional parameters, in any order. > The primary example of something like this is the options for the > 'draw' command. You can see the source code in > fricas/src/algebra/drawopt.spad and how it is used in draw.spad. But > a simplified form of this is just > > (1) -> vars:=OrderedVariableList [epsabs,epsrel,limit] > > (1) OrderedVariableList([epsabs,epsrel,limit]) > Type: Type > (2) -> opts:List Record(key:vars,val:Any) > Type: Void > (3) -> opts:=[[epsabs,1.0E-20],[limit,1000]] > > (3) [[key= epsabs,val= 0.1 E -19],[key= limit,val= 1000]] > Type: List(Record(key: OrderedVariableList([epsabs,epsrel,limit]),val: Any)) > > (4) -> opts:=[[notakey,3]] > > Cannot convert the value from type Variable(notakey) to > OrderedVariableList([epsabs,epsrel,limit]) . > > Using this the syntax for options could be > > integrationQng(x+->sin(x^2),0.0,%pi/2,[[limit,2000]]) > > The outter [ ] forms a list and the inner [option,value] forms a > record. Each function would have to be defined twice - once with > options and once without (to avoid having to write [[]] in each > function). To process the options one must scan the list for specific > keys. > > (5) -> for opt in opts repeat output [lookup opt.key,opt.val] > [1,0.1 E -19] > [3,1000] > Type: Void > > For more control and a slightly better syntax one can replace this > with a specific domain using this representation similar to DrawOpts. > > Of course underneath at the Lisp/GSLL level you would have to pass all > the "optional" parameters and provide your own defaults. > >> Improper integrals: GSLL has three separate functions: qagi (integrating >> from -inf to +inf), qagiu (integrating from a to inf, a being finite), and >> qagil (integrating from -inf to b). For each function it makes a >> substitution so that the integral is defined between 0 and 1 - you can see >> the substitutions in the gsl source file integration/qags.c. Thus the GSLL >> tests for qagi, qagiu, and qagil independently. The approach taken in >> Maxima is to have just one function, which they call quad_qagi, which can be >> used for any integral involving infinity, and which makes the appropriate >> substitution depending on which of the limits is finite. > I think maybe Ralf's proposal is a reasonable one. E.g. > > (6) -> a:OrderedCompletion DoubleFloat > Type: Void > (7) -> a:=plusInfinity() > > (7) + infinity > Type: OrderedCompletion(DoubleFloat) > (8) -> b:OrderedCompletion DoubleFloat > Type: Void > (9) -> b:=3.141592 > > (9) 3.141592 > Type: OrderedCompletion(DoubleFloat) > (10) -> retract(b)@DoubleFloat > > (10) 3.141592 > Type: DoubleFloat > (11) -> b:=%pi/2 > > (11) 1.5707963267948966 > Type: OrderedCompletion(DoubleFloat) > > So then > > integrationQng(f,0. 0::DF, plusInfinity()) > >> Names of functions: gslIntegrationQng, integrationQng, quadQng...? (I like >> the last because it's short!) > Actually as we implement more and more integrations functions it seems > reasonable to me that there be a package specifically for integration, > e.g. GSLintegration. Then the names could appear as qng$GSLintegration > or just 'qng' in the appropriate context. > > I would also like to get rid of the requirement to pass a function and > allow just an Expression, e.g. > > qng(sin(x^2), 0.0,%pi/2,[[limit,2000]])$GSLintegration > >> Other GSL/GSLL functions... I suppose some numerical linear algebra >> (including eigensystems) would be nice, random number generation, and >> numerical ODE solving - GSL supports a host of different methods, mainly >> embedded Runge-Kutta methods of different orders. I think that FFTs and >> other transforms (wavelets) are better suited for purely numerical software, >> like GNU Octave. Also, the GSL implementation of FFT is not the most >> optimized: if we wanted one we should go for FFTW ("Fastest Fourier >> Transform in the West"). >> > I have an application where I would like to use a good ODE solver. I > will work on that. > > I was also looking into other interesting packages available in > QuickLisp and which might be amenable to the same interface approach > as GSLL. One thing that stood out was graphics such as 'vgplot' as an > interface to GnuPlot > > https://github.com/volkers/vgplot > > and also Cl-ppplot which is an interface to the even more capable > > http://plplot.sourceforge.net/ > > Cheers, > Bill. > -- You received this message because you are subscribed to the Google Groups "FriCAS - computer algebra system" group. To unsubscribe from this group and stop receiving emails from it, send an email to fricas-devel+unsubscr...@googlegroups.com. To post to this group, send email to fricas-devel@googlegroups.com. Visit this group at http://groups.google.com/group/fricas-devel. For more options, visit https://groups.google.com/d/optout.