simplifying sums of numbers



On 12/29/06, sen1 at math.msu.edu <sen1 at math.msu.edu> wrote:

>   I have a linear interpolation function f made from around 500 data
>   points in the plane

I'm curious about the application -- is it function approximation,
statistics, or what?

> Using linearinterpol gives a function with many summands (as a sum of
> characteristic functions of affine maps).  I have two questions.
>
> 1. In actually evaluating the function f at some point x there seems
>     to be a lot of wasted time since a lot of zeroes are being summed.
>     Is there a better way, short of rewriting the routine?

I'm pretty sure determining which polygon a point falls
into is a well-known problem in computational geometry.
Presumably it is a simple matter of programming to go from
characteristic functions to polygons ...

> 2. Even using the routine, the answer shows up as a sum of many
>     numbers times characteristic functions.  How do I see the actual
>     sum as a floating point number?

Trying the example shown by ? linearinterpol, I get

 - ((9 x - 39) charfun2(x, minf, 3)
 + (30 - 6 x) charfun2(x, 7, inf)
 + (30 x - 222) charfun2(x, 6, 7)
 + (18 - 10 x) charfun2(x, 3, 6))/6

I think ev(<charfun mess>, x = 3.5) for example should cause that
to yield a number.

One way to simplify away some zero terms is to use assume, e.g.

assume (x > 5.5);
load (boolsimp);
ev (<charfun mess>);
 =>  - ((18 - 10 x) charfun(x < 6)
 + charfun(6 <= x and x < 7) (30 x - 222)
 + charfun(7 <= x) (30 - 6 x))/6

(As it stands, Maxima dislikes some unevaluated Boolean
expressions, hence boolsimp.)

Hope this helps
Robert