Fourier series of a 2step function?



On Sept 20, 2008, 2:04 AM(!!), Richard Hennessy wrote:


> It could be better, but it's late.
>
> Rich
> I was working on declaring functions peicewise and I came up with this 
> (probably not very good solution).  I have
> defined some functions that allow you to declare a function in sections 
> (pw) like you want and integrate (pwdefint and
> pwintegrate) and differentiate (pwdiff).
>
> (%i1) set_display('ascii)$
> (%i2) pwintegrate(expr,x):=
> block
>    ([__i, __k,__l],
>        if matrixp(expr) then
>            (
>                __l:[],
>                if length(expr[1]) = 11 then
>                (
>                    for __i: 1 thru length(expr) do 
> __l:endcons([expr[__i,5],expr[__i,7], integrate(expr[__i,11],
> x)],__l),
>                    pw(__l,x)
>                )
>            )
>        else
>            integrate(expr,x)
>    )$

> (%i6) f:[-inf, 0, -15, x, -10, sin(x^2)*x*20+cos(3*x)*10, -5, x^2+x+6, -2, 
> 10*x, 0, x, 10, 0, inf]$
>
>
> (%i9) pwdefint(pw(f,x),x,-inf,inf), numer,ratprint=false;
> (%o9) 
> 7.250095748755271
>

This is an interesting use of Maxima's matrix tools to deal with
piecewise continuous functions.

I think you get better numerial accuracy if you omit "numer",
(and I don't think "ratprint:false" matters), and let Maxima
do it as it wants and then use float( result ), as in

----------------------------------
(%i9) ans1 : pwdefint(pw(f,x),x,-inf,inf), numer,ratprint=false;
(%o9)                          7.250095748755271
(%i10) ans2 : (pwdefint(pw(f,x),x,-inf,inf) ,float(%%) );
(%o10)                         7.25009572340884
(%i11) (ans1-ans2)/ans2 ;
(%o11)                       3.4960133751591161E-9
---------------------
Also, when I use your  pwdiff(...) function as in
---------------------
(%i12) pwdiff(pw(f,x),x,1);
------------------
I get row after row of Col 1 = [ if ]
                                             [ if ]
                                             [ if ]
                                              etc.
and like wise for all the columns, the only output
of use is Col 11.
------------------
Another way to define piecewise continuous functions
would be using unit_step(x), as in

(%i16) u( x ) := unit_step(x)$
(%i17) uu( x1, x2 ) := u( x - x1 ) - u( x - x2 )$
(%i18) (load(draw),load(qdraw))$
               qdraw(...), qdensity(...), syntax: type qdraw();

/* here we plot uu( 1, 2 ) using qdraw  */

(%i19) qdraw( yr( -1, 2 ), xr( -1, 3 ), ex( uu( 1, 2 ), x, 0, 3 )  )$

/*  which gives a nice unit square wave  */

/* let's define a two element pw function as  */

(%i20) g(x) := x*uu( 0, 1)  +  x^2*uu( 1, 2)$

/*  and plot it  */

(%i21) qdraw( yr( -1, 5), xr( -1, 3), ex( g(x), x, 0, 3)  )$

/* which shows func "x" from (0, 1) and "x^2
   from (1, 2)  */

Can you work with this definition of a piecewise cont.
function and get the correct integrals and derivatives?

It would be nice if fourie.mac were augmented with
the ability to handle this type of input function.

Ted Woollett