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