Ask Your Question
1

Defining a periodic function.

asked 2013-09-15 06:57:16 +0100

lc gravatar image

Hi,

I am a new sage user. I'd like to define simple periodic maps over \R which plot and integrate correctly (eg. a square signal (which of course is discontinuous but which I would still like to be able to plot in a way that makes it clear that the function is not multivalued at discontinuity points)). I tried different approaches none of which gave satisfactory results.

Any hint on how to do that nicely (or what would be the obstacles)?

Thank you

edit retag flag offensive close merge delete

Comments

John Palmieri gravatar imageJohn Palmieri ( 2013-09-18 01:39:55 +0100 )edit

3 Answers

Sort by ยป oldest newest most voted
0

answered 2013-09-16 10:00:37 +0100

lc gravatar image

Thank-you for the quick answer.

frac() gives a function which is periodic on positive reals. I just adapted your solution to get it periodic on \RR.

f = lambda x: 1 if (x - RR(x).floor()) < 1/2 else 0

I would have liked to be able to define a symbolic function though. Is it doable?

I was also trying to get a function whose plot is correct (without asking it to be pointwise) as it is the case for Piecewise().

Below are some of the things (not chronologically ordred though) I had tried (just for completness as I guess they are just full of beginer's classical mistakes).

f(x)=sum((-1)^k*unit_step(x-k),k,0,infinity)

which does not evaluate

f1(x)=0
f2(x)=1
h=Piecewise([[(-oo,0),f1],[(0,1),f2],[(1,2),f1],[(2,+oo),f1]],x)
h.plot()

returns ValueError: cannot convert float NaN to integer.

f(x)=sum(h(x-2*k),k,0,infinity)

returns ValueError: Value not defined outside of domain.

f(x)=sum(h(x-2*k),k,0,4)

also returns ValueError: Value not defined outside of domain.

I also tried to redefine unit_step:

def echelon_unite(x):
#
    if x<0:
        hres=0
    else:
        hres=1
    return hres

problem integral(echelon_unite(x),x,-10,3) returns 13

numerical integral returns a coherent result.

Other tentative with incoherent result (still with integrate and not numerical_integral)

  def Periodisation_int(f,a,b):
        x = var('x')
        h0(x) = (x-b)-(b-a)*floor((x-b)/(b-a))
        hres = compose(f,h0)
        return hres


sage: g=Periodisation_int(sin,0,1)
sage: integrate(g(x),x,0,2)
-cos(1) + 2
sage: integrate(g(x),x,0,1)
-cos(1) + 1
sage: integrate(g(x),x,1,2)
-1/2*cos(1) + 1

My guess is I was using integrate on inappropriate objects. I would still like to know how to define corresponding symbolic function (if it is possible).

Thanks again,

best regards.

edit flag offensive delete link more
0

answered 2013-09-15 07:55:07 +0100

tmonteil gravatar image

updated 2013-09-15 08:00:50 +0100

You should tell us about your different approaches, and what was wrong with them. I am not sure whether you ask about defining a function or plotting it. Here would be my direct lazy approach, without more informations about your needs. To define a periodic function, use the .frac() method of real numbers. In your case:

sage: f = lambda x: 1 if RR(x).frac() < 1/2 else 0
sage: plot(f, 0, 4)

If you do not like the vertical line at the discontinuities, you can look at the options of the plot() function:

sage: plot?

In your case, you can try:

sage: plot(f, 0, 4, plot_points='1000', linestyle='', marker='.')

For the integral, since the finction is defined point by points (not a symbolic function), you can do a numerical integration:

sage: numerical_integral(f, 0, 4)
(2.0, 2.2315482794965646e-14)
edit flag offensive delete link more
0

answered 2013-09-18 14:37:39 +0100

nbruin gravatar image

The object you get out of Periodisation_int is not a symbolic function, but when you call it with x you get a symbolic expression anyway, so it doesn't really matter (and most symbolic machinery is for expressions anyway). If you really want a symbolic function you can do:

def per(f,a,b):
    x = SR.var('x')
    CSRx = CallableSymbolicExpressionRing( (x,))
    t = f((x-b)-(b-a)*floor((x-b)/(b-a)))
    h = CSRx(t)
    return h

where the whole bit with CSRx is to actually get a symbolic function (something you can call). I'm not so sure that integrate knows what to do with this symbolic function, though.

edit flag offensive delete link more

Your Answer

Please start posting anonymously - your entry will be published after you log in or create a new account.

Add Answer

Question Tools

Stats

Asked: 2013-09-15 06:57:16 +0100

Seen: 1,680 times

Last updated: Sep 18 '13