Ask Your Question

# convolution got the wrong result

Hi, English is not my mother language, so I am trying to make myself clear. And sorry for my grammer mistakes.

I am new to sage and trying to do convolution:f(x) * g(x)?

f(x) = 2, -2 < x < 2; f(x) = 0, x < -2 or x > 2

g(x) = 3/4, 0 < x < 2; g(x) = 0, x < 0 or x > 2

I use the following code to do the job:

x = PolynomialRing(QQ,'x').gen()
f = Piecewise([[(-2, 2), 2 * x^0]])
show(f)
g = Piecewise([[(0, 2), 3/4 * x^0]])
show(g)
m = g.convolution(f)
show(m)


I think I am sure the result should be:

3/2 * x + 3, -2 < x < 0;

3, 0 < x < 2

-3/2 * x + 6, 2 < x < 4

0, x < -2 or x > 4

but it comes out that when 0 < x < 2, the result is 6, which should be 3. There must be something wrong, but I can not figure out. So I am here to ask for help.

Thank you.

edit retag close merge delete

## Comments

Tough nut! I think you are right about the answer being 3 there. You can see the code by typing g.convolution?? and seeing what you get at the end. I'm wondering whether the wrong branch of the code is being taken at if a1-b1<a2-b2: but="" unfortunately="" have="" no="" definite="" answer="" for="" you="" yet="" on="" how="" to="" fix="" this.<="" p="">

( 2011-12-06 07:01:34 -0500 )edit
1

@yideey: By the way, you can fix this yourself by opening the file at devel/sage/sage/functions/piecewise.py and making this switch of fg2 and fg4, then running sage -b, which should work okay since it uses the Python included in Sage.

( 2011-12-06 13:40:23 -0500 )edit

@kcrisman: Thanks for your help. And I am glad that we find the bug.

( 2011-12-06 15:23:05 -0500 )edit

## 2 answers

Sort by » oldest newest most voted

This is apparently indeed a bug. Aside from the example yideey gives, we have the following in the code:

cmd1 = "integrate((%s)*(%s),%s,%s,%s)"%(i1,i2, uu, a1,    tt-b1)    ## if a1+b1 < tt < a2+b1
cmd2 = "integrate((%s)*(%s),%s,%s,%s)"%(i1,i2, uu, tt-b2, tt-b1)    ## if a1+b2 < tt < a2+b1
cmd3 = "integrate((%s)*(%s),%s,%s,%s)"%(i1,i2, uu, tt-b2, a2)       ## if a1+b2 < tt < a2+b2
cmd4 = "integrate((%s)*(%s),%s,%s,%s)"%(i1,i2, uu, a1, a2)          ## if a2+b1 < tt < a1+b2
<snip>
if a1-b1<a2-b2:
if a2+b1!=a1+b2:
h = Piecewise([[(a1+b1,a1+b2),fg1],[(a1+b2,a2+b1),fg4],[(a2+b1,a2+b2),fg3]])


Note how the cmd2 (which becomes fg2) is what is supposed to end up between a1+b2 and a2+b1, but instead the result of cmd4 does (which is fg4).

This is now this bug report on Trac, #12123.

more

## Comments

Also note we may be (finally) redoing piecewise functions soon, which may change some of this.

( 2013-07-31 07:56:13 -0500 )edit

Agreed that it is wrong. After very odd results with something more complicated, I tried convolving two rectangular distributions of unequal width as a test. It is easy enough to show that the result should be a trapezoidal distribution. The result of the convolution in Sage was kind-of the right shape, but the top of the trapezium was detached, and too high by a factor of (exactly) 4.

I'm not a hacker, but would be happy to provide some test cases to somebody who wants to have a go at fixing the code.

more

## Your Answer

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

Add Answer

## Stats

Asked: 2011-12-06 02:39:30 -0500

Seen: 211 times

Last updated: Jul 30 '13