On Wed, Jun 7, 2017 at 11:35 AM, <[email protected]> wrote: > I'm trying to write a generic function to convolve two functions (in one > dimension, for now) and came across a few issues I don't know how to solve. > Rather than give up, maybe I can start a discussion. Some Sympy follows: > > a , b = symbols('a b', positive=True) > f = exp(-a*x) > g = exp(-b*x) > integrate(f.subs(x,tau)*g.subs(x,t-tau), (tau,0,t)) > > > 1. I had to compute the range of integration myself (tau, 0, t). This isn't > a fatal problem, but piecewise doesn't have enough information to compute it > simply. (My long term solution is to propose a replacement for the > piecewise function, but I'm not there yet.) > > The answer is below: > > Piecewise((t*exp(-b*t), Eq(a, b)), (1/(a*exp(b*t) - b*exp(b*t)) - > 1/(a*exp(a*t) - b*exp(a*t)), True)) > > > The answer is correct, but there are problems trying to incorporate it into > a larger function. > > 2. It is not obvious in advance the answer will depend on whether a = b. Is > there some way to assume in advance that a=b or a!=b?
The assumptions don't work with this yet, but the simplest way is to just do expr = integrate(f.subs(x,tau)*g.subs(x,t-tau), (tau,0,t)) expr.subs(Eq(a, b), True) > > 3. The second condition, True, isn't helpful. To understand what True > means, one has to keep track of the previous conditions. Is there some way > to replace the True with a != b. I don't think there's a simple way to do it, but it can be represented that way. It might be useful to have a Piecewise method that replaces the True condition with the negation of the other conditions. > > 4. This is a simpler question, but I can't figure it out. How do I > manipulate the second answer to my preferred form? This is harder, because it's hard to get SymPy to prefer exp(-a) over exp(a). Using simplify gives (exp(a*t) - exp(b*t))*exp(-t*(a + b))/(a - b) There is a related bug here https://github.com/sympy/sympy/issues/11506. If it were fixed you could use cancel(expr, exp(-a*t), exp(-b*t)). The only way I found to do it is simplify(expr.subs({a: -a, b: -b})).subs({a: -a, b: -b}) Aaron Meurer > > (exp(-b*t)-exp(-a*t))/(a-b) > > Is there a simple way to do it programmatically? > > Thanks > > -- > You received this message because you are subscribed to the Google Groups > "sympy" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > To post to this group, send email to [email protected]. > Visit this group at https://groups.google.com/group/sympy. > To view this discussion on the web visit > https://groups.google.com/d/msgid/sympy/9d71a081-e038-4712-93de-aca17f951e15%40googlegroups.com. > For more options, visit https://groups.google.com/d/optout. -- You received this message because you are subscribed to the Google Groups "sympy" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at https://groups.google.com/group/sympy. To view this discussion on the web visit https://groups.google.com/d/msgid/sympy/CAKgW%3D6%2BUC9na0-qBjkndORvu%3D3Mi3dz2LfA1hEe6aD1n5MSdgw%40mail.gmail.com. For more options, visit https://groups.google.com/d/optout.
