> There is a distribute() context manager I had forgotten about that, thanks for the reminder!
/c On Wednesday, February 21, 2024 at 4:39:22 PM UTC-6 Aaron Meurer wrote: > There is a distribute() context manager which lets you disable > automatic distribution, though it's not pretty: > > >>> from sympy.core.parameters import distribute > >>> with distribute(False): > ... print(expr.diff(t)) > 3*a*(t - t0)**2 + 2*b*(t - t0) > > While this is less dangerous than the similar evaluate() context > manager, it is possible this could break something if you put too much > under the context. > > As Chris said, we do want to eventually remove this automatic > behavior, but it hasn't been easy to do as a lot of things depend on > it currently. Rearranging things after the fact as Chris suggests is > probably the better solution. There's really no guarantees about what > the form of an expression from diff() will look like. > > Aaron Meurer > > On Sun, Feb 18, 2024 at 12:10 PM Chris Smith <[email protected]> wrote: > > > > Autodistribution of Number into an Add is how SymPy works and there is > no flag for differentiation (or for many functions) that would prevent it. > Simply pass the expression to `factor_terms` to get it cleaned up. (But > that will extract a factor of `t-t0`, too, which you might not want so you > could use `Add(*[factor_terms(i) for i in expr.diff(t).args])` in this > case.) > > > > Some day autodistribution will go away and I expect that we will then > ask how to get constants to distribute into simple expressions. > > > > /c > > > > On Sunday, February 18, 2024 at 4:52:12 AM UTC-6 [email protected] > wrote: > >> > >> Hi all. > >> > >> I have a simple expression: > >> > >> >>> import sympy as sp > >> >>> a, b, t, t0 = sp.symbols('a b t t0') > >> >>> expr = a*(t - t0)**3 + b*(t - t0)**2 > >> > >> And I would like to differentiate it with respect to t: > >> > >> >>> expr.diff(t) > >> 3*a*(t - t0)**2 + b*(2*t - 2*t0) > >> > >> Why is the constant "2" distributed in the second term? > >> It seems like an additional step that SymPy does, which doesn't really > >> "improve" the situation in this case. > >> Maybe there is a more general advantage that's just not visible in > >> this simple case? > >> But if that is so, would it be possible to tell SymPy to skip the > distributing? > >> > >> To be clear, this is the result I was expecting: > >> > >> >>> expr.diff(t) > >> 3*a*(t - t0)**2 + 2*b*(t - t0) > >> > >> For context, this question came up in a slightly more complicated > >> situation: > https://github.com/AudioSceneDescriptionFormat/splines/issues/31 > >> > >> cheers, > >> Matthias > > > > -- > > 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 view this discussion on the web visit > https://groups.google.com/d/msgid/sympy/389f5dd9-1498-455a-b6cc-ffbbff89a9d7n%40googlegroups.com > . > -- 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 view this discussion on the web visit https://groups.google.com/d/msgid/sympy/7a4673b7-4c4e-4101-a4e5-9056847d000en%40googlegroups.com.
