Subject: interface for numerical integration, roots etc
From: Leo Butler
Date: Tue, 25 May 2010 22:38:13 +0100 (BST)
On Tue, 25 May 2010, John Lapeyre wrote:
< Hi,
<
< I made a start on writing emulators for Mma NIntegrate
< and FindRoot.
<
< The code is at:
< https://sourceforge.net/projects/ribot/files/
<
< Since there has been interest in developing the interface in
< maxima proper, I thought it might be better to write a
< maxima interface and write an Mma-like wrapper, rather than
< the other way around.
<
< One of the main issues is how to pass options (these functions
< take many options). It would be nice to have a uniform, flexible
< system. For instance in perl, {} constructs an anonymous hash,
< which can be used to pass options
< foo( x,y,x, { OPT1 => 1, OPT2 => "cat" })
<
< Mma uses OptionA -> 1, which is a special syntax for
< Rule(OptionA,1). So I use a routine that filters these
< rules from an argument list and stores them in a hash.
< But, it's not clear that this is the best way to implement
< something like this for maxima (assuming people want to get
< away from a big pile of randomly named global variables and
< a flat list of FORTRAN inspired arguments). I do like groupimg
< iterator-like things as lists-- [x,a,b]. They are easier to read,
< offer a more flexible interface, and are easy to process.
<
< As said, I'd rather find something for maxima and then put an Mma layer
< on it-- something that is not so much of an issue with
< Array,Table,Tuples, etc. Maybe its enough to only change Rule to rule
< and FunctionName to function_name... Or maybe
< options(op1,val1,opt2,val2,...)
< Using 'esprel=10-3 as in the maxima quadpack interface is tempting,
< but not as a general soution because they look like equations.
< Maybe options( 'opt1=val1, ...) (and I think there may be
< a way to automatically quote all the LHS's ?)
Hi John, you might be confusing form and substance. Remember that =>
in Perl is just a fancy , operator implemented by the parser. You can
do similar things in Maxima:
infix("->");
"->"(a,b) ::= buildq([a:a,b:b],['a,b]);
allows you to pass options like in Perl:
(%o104) f(x,[y]):=[x,y]
(%i105) f(x,u->v);
(%o105) [x,[[u,v]]]
(%i106) (u:1,t:2,v:3,f(x,u->v,t->w));
(%o106) [x,[[u,3],[t,w]]]
(you see that -> quotes the lhs, just like Perl's =>)
so the interface changes, but underneath ...
I would be interested in seeing a way to define a function that allows
you to specify the argument type, e.g.
f(x::integerp) := ...
as you can in Maple. This was discussed a while ago, but I don't know
what came of it.
My 2p.
Leo
<
< Following are notes on the current NIntegrate and FindRoot, which is
< working fairly well. There is a large amount of documentation on
< the Mma functions online. Notice that find_root , newton, romberg,
< and quadpack are somewhat unified by this interface. There are
< many more examples in tests/rtest_mixima.mac and
< tests/rtest_nintegrate.mac.
<
< * NIntegrate
<
< This makes calls to the maxima quadpack and romberg routines.
< Multiple integrals are implemented automatically as in Mma, but via nesting, which is slow.
< Details of the call are different from Mma. Here is an example call
<
< NIntegrate(sin(sin(x)),[x,0,2], Rule(Method,NewtonCotesRule),
< Rule(MinRecursion,2),Rule(MaxRecursion,12),Rule(PrecisionGoal,10),Rule(AccuracyGoal,Infinity);
<
< Specifiying the Rules is optional.
< Method can be one of Automatic NewtonCotesRule=RombergRule QagsRule Oscillatory=GaussKronrodRule6
< GaussKronrod=GaussKronrodRule=GaussKronrodRule1
< GaussKronrodRule2 GaussKronrodRule3 GaussKronrodRule4 GaussKronrodRule5
<
< Some rules are duplicated for deprecated Mma
< options. Here, the Rule Oscillatory does not work with
< infinite intervals, whereas in Mma 3.0 it *only* works
< with infinite intervals
<
< The default Method is Automatic which makes a few tests to
< choose a method: Eg, Infinite interval, singularity at endpoints.
< It is a good start, but needs improvment.
<
< Other options are PrecisionGoal and AccuracyGoal. Options
< MinRecursion and MaxRecursion are only used with
< RombergRule method. See examples in
< tests/rtest_mixima_nintegrate.mac
<
<
< * FindRoot
<
< With two boundary points, the secant method in maxima find_root is used.
< Examples:
< FindRoot(sin(x) = x/2,[ x, 0.1, %pi]);
< FindRoot(sin(x) - x/2,[ x, 0.1, %pi], Rule(PrecisionGoal,3), Rule(AccuracyGoal,10));
< FindRoot(sin(x) - x/2,[ x, 0.1, %pi]);
<
< With one starting point, Newton's method is used (using a modified version of the
< maxima function to include, for instance, a limit on the number of iterations).
< Examples:
< FindRoot(sin(x) = x/2,[ x, 1.0]);
< FindRoot(sin(x) = x/2,[ x, 1.0],Rule(MaxIterations,10));
< FindRoot(sin(x) - x/2,[ x, 1.0]);
<
< The options PrecisionGoal and AccuracyGoal are supported by the secant method.
< The options AccuracyGoal and MaxIterations are supported by Newton's method.
<
< Note that in Newton's method AccuracyGoal determines how close the function evaluation
< must be to zero, not how close the variable will be to it's true value.
< Eg, the default AccuracyGoal is 6, but
< FindRoot(((Sin((x-10))-x)+10),[x,0]); gives 9.98318 .
< I more sophisticated stopping criterion ought to be used.
<
<
< John
< _______________________________________________
< Maxima mailing list
< Maxima at math.utexas.edu
< http://www.math.utexas.edu/mailman/listinfo/maxima
<
<
--
The University of Edinburgh is a charitable body, registered in
Scotland, with registration number SC005336.