Features; general comments... a couple suggestions..
Subject: Features; general comments... a couple suggestions..
From: shorne at energetiq.com
Date: Mon, 5 Jan 2009 17:22:23 -0500
First -- I don't post very often, though I follow the group in detail and
have used maxima
for years -- so I hope you'll all forgive the length of this note..
I've been using Maxima (and free math software, in general) for a whole
lot of years.
In fact I started the sourceforge Maxima site, when Bill Schelter passed
away.
I'm not by any means a lisp hacker and don't feel qualified to work
as a developer -- though I've supported other projects in the past
(particularly g77).
My own belief is that there are a host of superb free tools to do
numerical
mathematics. Three that jump to mind are the statistical package R, the
matlab clone
Octave, and the Scilab package. I have used the latter for many years in
many real
applications -- not toy problems, but real programs that guided
development of hardware
that is for sale in the real world.
What Maxima brings to the table is explicitly _not_ numerical
capabilities.
I'm worried a bit that Maxima seems to be experiencing "feature creep" --
that effort is being invested by the community into developing Maxima into
a clone of already available tools -- instead of concentrating on those
areas where Maxima is unique -- symbolic manipulation.
(And, maybe, arbitrary precision numerics... but even that is a stretch,
given that the gnu mp
package could be hooked to from Scilab... )
I claim that Maxima does not "need" (for instance) a highly developed,
native, numerical curve fitting
package. However, the development model for Maxima -- a sort of
free-for-all -- is actually
quite productive. Chaos can be good. One downside of the free-for-all
development
model is that as feature after feature is added, if there's no ability to
easily _build_ an executable
with a subset of features, the memory and disk footprint of the system can
grow to the point
where running it on minimal hardware can become an issue. I've seen
requests in the
group for versions that might run on tiny hardware -- eg phones, or net
appliances.
I think it's important to remember that the original MIT Macsyma ran on a
computer that
was, by todays standards, a digital watch.
The linux kernel build process has (I assume it still does? ) front ends
that allow
a lot of customization. I claim an interesting project, for someone who
has a solid
architectural knowledge of Maxima, would be a similar build system -- a
scheme that would
permit customization and optimization for various levels of features,
performance, memory footprint,
and disk footprint.
Functional featues --
If I had my druthers, the single most useful feature that Maxima is
missing is something along
the lines of the Macsyma taylor_solve.
Rationale --
It's very common for a math/physics/EE calculation to boil down to
something
like f(x,y) = 0, solve for y in terms of x.
f(x,y) is often horrid. But it's often possible to find an approximate
series expansion -- a polynomial
in x and y, valid in some physically interesting region.
Solving this for y(x) is a known problem -- newton diagram, puiseux
expansions --
but is absolutely non-trivial, and very interesting from both
a programming and mathematical point of view.
There are a bunch of rather pretty complications to be dealt with.
A couple specific instances for where this problem turns up --
Anywhere you have an eigenvalue problem with a parametric dependence - -
these come up everywhere.
EE -- I had to figure out how to tune an RF generator (via changing
frequency) to maintain
zero reflected power, in a plasma reactor, with a varying parameter
(plasma load impedance).
Boiling down the problem via laplace transforms gets you to f(x,y)=0, with
f a polynomial
in x and y.
Something to get started with --
an incomplete and (I believe) buggy version....
I've hacked at this ovre the years, with little success..
http://alamos.math.arizona.edu/~rychlik/577-dir/lecture15.htmlhttp://alamos.math.arizona.edu/~rychlik/577-dir/lecture16.htmlhttp://alamos.math.arizona.edu/~rychlik/577-dir/puiseux.macsyma
Thanks for the bandwidth --
Steve
?iga Lenar?i? <ziga.lenarcic at gmail.com>
Sent by: maxima-bounces at math.utexas.edu
12/31/2008 10:54 AM
To
maxima at math.utexas.edu
cc
Subject
[Maxima] Fitting in Maxima
Maxima is actually lacking a proper fitting facilities (like many
other things). lsquares is a poor excuse for a fitting package in
many aspects:
-slow
-complicated to use
-unintuitive
-cryptic name (should be LeastSquares/least_squares, not lsquares_mse
and what not)
I think the latter three (if not all four) aspects of lsquares
package applies well to a lot of maxima functions, if they even exist
(still no ODE integrator or fast numerical linear algebra
functions)... Especialy cryptic names are the plague of maxima. What
can a user dechipher from 'create_list' and 'makelist'. It makes no
sense..
However not to be too critical towards maxima developers (since a lot
of problems really originate from 30 years old code, which nobody
dares to rewrite), I find the new draw package extremely well
designed (esp. compared to plot2d), easy to use and useful (though
some names, like "terminal" or "enhanced3d", originating from gnuplot
should be translated to meaningful names like "output".) and I really
like the fact that new gamma implementations feel like a complete
coherent package, naming and functionality-wise.
There sadly is no "manual" written for extending maxima, no
directions for adding functionality to maxima. I feel if new
additions to maxima aren't guided by some central guidance document,
different maxima level naming conventions, internal naming
conventions, packages doubling or only partially implementing desired
featureset ('vect' and 'vector' for instance) will keep maxima being
a nonelegant mess of poor implementations (which you must admit in
many areas it is).
I would really like, somebody wrote such a document with maybe some
general plan of maxima features to be added or reimplemented in a
better way.
Of course I'm not only complaining but I will gladly contribute. I
have very little experience with lisp and symbolic computations
source code, but have some experience with numerical methods..
I will try to add linear fitting and also nonlinear fitting
functionality to maxima via a nice full featured package. I'm also
thinking of writing numerical ode solving package, but that's a much
tougher task, so maybe in the future.
I have a working linear fitting function written in Maxima language
and while writing it, many questions regarding adding functionality
to Maxima.
1) What is the current naming convenction for new functions in Maxima?
It seems that new functions are named in a
whole_words_separated_with_underscore. I personally much prefer the
Mathematica's CapitalsForEachWord, which is easier to read, easier to
type and also leaves more room for user defined variables or
functions (which are typically small caps). I understand the need for
backwards compatibility, but new conventions could be applied to new
functionality easily. I'm glad that at least MATLAB's abrvtdfunnames
aren't encouraged, but are sadly very common in maxima.
2) Are there any internal (lisp) naming conventions? Code reuse would
benefit from this.
3) When should new functionality be implemented in Maxima language
and when in lisp if for instance some problem can be solved in both?
4) Will there be possibility to call compiled numerical libraries
(ATLAS ..) from lisp in the future? I know gcl is kinda the limiting
factor right now.. I think f2cl conversions of numerical libraries
should not be a part of maxima. Especially if the user has to call
them with their fortran names. It's better to implement an
unoptimised original algorithm in lisp by hand (and tailored to
maxima's needs), since f2cl translations do not inherit the speed of
original fortran porgrams, neither are they consistent with other
maxima code or gain anything. So it's like using fortran without
speed, why would you do that? Ideally we should use ATLAS for
numerical linear algebra, so speed-wise maxima would be on par with
MATLAB and mathematica. Any chance of this becoming reality?
5) List of lists vs matrix : transpose does not work on list of
lists, therefore one has to convert list of lists to matrix,
transpose and convert back. I don't see what functionality is gained
by reprezenting matrices with a 'matrix. In case we use a special
construct for matrices, we should at least make something of it. A
matrix could carry some useful flags about it's contents: real/
complex, diagonal, symetric, numerical(all elements) ... which would
then updated at any operation on matrix and used when solution or a
system or eigenvalues are needed for choosing the best algorithm for
the job (i.e. if all elements are numeric, the matrix is passed to
ATLAS numerical libraries). Transpose should accept also a list of
lists. I'd rather see, 'matrix didn't exist since it's more trouble
for the user, than what it's worth.
6) There is no real SVD in Maxima? (don't suggest lapack dgesvd)
Maybe it should be implemented..
6) What functionality should Maxima provide regarding function fitting?
I intend to write functions with similar calling structure as
Mathematicas
Fit - linear fitting (via missing SVD)
FindFit - nonlinear fitting via levenberg-marq. minimisation (from
Numerical Recipes)
Suggestions regarding implementation of fitting are welcome!
Here is a linear fitting function in maxima language (hey! it works!)
and examples:
/****** MAXIMA *******/
Fit(data, functionlist, vars) := block(
[numer:true,float:true,
lambdalist, design_matrix,
alpha_matrix, beta_vector, sol,
vector_b],
lambdalist: map(
lambda([what], apply( 'lambda, what) ),
makelist( [vars,functionlist[function_index]] , function_index, 1,
length(functionlist)) )
,
design_matrix:
makelist(
makelist(
apply(lambdalist[function_index],
makelist(data[data_index][k], k, 1 , length(vars)) )
, function_index, 1, length(functionlist))
, data_index, 1, length(data))
,
vector_b:
makelist(
data[data_index][length(vars) + 1]
, data_index, 1, length(data))
,
design_matrix: apply('matrix, design_matrix),
alpha_matrix: transpose(design_matrix) . design_matrix,
beta_vector: transpose(design_matrix) . vector_b,
sol: alpha_matrix^^-1 . beta_vector,
sol: subst( '"[", 'matrix , transpose(sol) )[1]
,
apply("+" , sol * functionlist )
) $
/* 2d example */
data2d: [ [1, 2, 2] , [ 3, 2, 5], [1, 5, 4], [3, 5, 5],[2,1,3],
[-1,0,7]] $
fit2d: Fit( data2d, [1,x,y,x*y], [x,y] );
load(draw) $
draw3d(
color = red,
point_size = 3, point_type = 7,
points(data2d),
color = black,
explicit( fit2d , x, -1, 4, y, 0, 5)
)$
/* 1d example, 1000 points */
dejta: makelist( [float(i/50), sin(i/50)+random(0.2)] , i, 0, 1000),
numer$
fit:Fit( dejta, [1, x, sin(x)], [x]);
draw2d(
color = blue,
points(dejta),
color = red,
explicit( fit, x, dejta[1][1]-1, dejta[length(dejta)][1]+1)
) $
/******** MAXIMA ********/
I would like Fit to use svd instead of ^^-1, since it's more robust,
but looks like i have to implement svd first? How and where should
svd be implemented in Maxima?
hny
?iga Lenar?i?
_______________________________________________
Maxima mailing list
Maxima at math.utexas.edu
http://www.math.utexas.edu/mailman/listinfo/maxima