Ask Your Question

convolution got the wrong result

asked 2011-12-06 09:39:30 +0200

yideey gravatar image

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]])
g = Piecewise([[(0, 2), 3/4 * x^0]])
m = g.convolution(f)

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 flag offensive close merge delete


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="">

kcrisman gravatar imagekcrisman ( 2011-12-06 14:01:34 +0200 )edit

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

kcrisman gravatar imagekcrisman ( 2011-12-06 20:40:23 +0200 )edit

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

yideey gravatar imageyideey ( 2011-12-06 22:23:05 +0200 )edit

2 Answers

Sort by ยป oldest newest most voted

answered 2011-12-06 14:36:08 +0200

kcrisman gravatar image

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
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.

edit flag offensive delete link more


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

kcrisman gravatar imagekcrisman ( 2013-07-31 14:56:13 +0200 )edit

answered 2013-07-30 07:02:30 +0200

LostTrolley gravatar image

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.

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

1 follower


Asked: 2011-12-06 09:39:30 +0200

Seen: 425 times

Last updated: Jul 30 '13