Thanks for the interesting examples.

Shouldn't we fix ba.tabulate().cub to be _exact_ (to working precision)
when the desired function is cubic or less?


On Sun, Nov 27, 2022 at 12:45 PM Oleg Nesterov <o...@redhat.com> wrote:

> On 11/27, Oleg Nesterov wrote:
> >
> > On 11/25, Julius Smith wrote:
> > >
> > > I would expect ba.tabulate() to be unbeatable when the function being
> > > sampled is actually linear, quadratic, or cubic,
> >
> > Well ;) If the function is cubic then chebtab() will win even with NX=1.
> > Ignoring the floating point issues, chebtab() will be simply equal to
> > the approximated function. If the function is "nearly cubic", chebtab()
> > should likely win anyway, I guess, but this depends.
>
> Let me provide a couple of stupid test-cases just in case ;)
>
>         CK = 1;
>         FX(x) = x^3 - 2*x^2 - 100* x - 1;
>         X0 = 0;
>         X1 = 10;
>         NX = 50;
>         CD = 3;
>
>         // Both ch() and tb() create rdtable of size=200 and both use cubic
>         // polynomial, so this comparison is more or less fair.
>         ch(x) =     chebtab(CK, FX, NX, CD,    X0,X1, x);
>         tb(x) = ba.tabulate(CK, FX, NX*(CD+1), X0,X1, x).cub;
>
>         maxerr = abs : max ~ _;
>
>         line(n, x0,x1) = x0 + (ba.time%n)/n * (x1-x0);
>         process = line(50000, X0,X1) <: FX-tb,FX-ch : par(i,2,maxerr);
>
> compiled with -a plot.cpp
>
>         $ /tmp/c-plot -n 50000  | tail -1
>         0.600803971     5.68434189e-13
>
> e-13 is just the floating point errors. The close result if I change ch(x)
> to use NX=1.
>
> Lets add some "noise" to FX,
>
>         FX(x) = x^3 - 2*x^2 - 100* x - 1 + sin(x); // sin(x) is small
> compared to poly
>
> Now,
>
>         $ /tmp/c-plot -n 50000  | tail -1
>         0.59773165      5.20619665e-07
>
> OK, lets recall that ba.tabulate() doesn't play well near X0, X1, lets help
> tabulate() to be more accurate:
>
>         // ensure that ba.tabulate() always have at least 4 valid points
>         offs = 4 * (X1-X0) / (NX*(CD+1));
>         process = line(50000, X0+offs,X1-offs) <: FX-tb,FX-ch :
> par(i,2,maxerr);
>
> now ba.tabulate() works MUCH better but chebtab() still wins:
>
>         $ /tmp/c-plot -n 50000  | tail -1
>         1.42467743e-05  5.20622848e-07
>
> Oleg.
>
>

-- 
"Anybody who knows all about nothing knows everything" -- Leonard Susskind
_______________________________________________
Faudiostream-users mailing list
Faudiostream-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/faudiostream-users

Reply via email to