Take a look at https://github.com/sympy/sympy/pull/7318. I remember that this PR didn't work for all matrices (I guess matices including expressions with sqrt(2)). If we find a better way to determine the common factor, I'll update the PR.
On Saturday, November 28, 2015 at 8:08:52 PM UTC+1, Riccardo Rossi wrote: > > Dear Mateusz, > > what you suggest is exactly what i was hoping for and could not find by > googling > > i'll definitely try that out :-) > > Dzienkuje Bardzo! (hope spelling is correct and...that i guessed correctly > your nationalty) > > cheers > Riccardo > > On Saturday, November 28, 2015 at 11:07:20 AM UTC+1, Mateusz Paprocki > wrote: >> >> Hi, >> >> On 27 November 2015 at 19:34, Riccardo Rossi <[email protected]> wrote: >> > Dear list, >> > >> > i am a newby to sympy, and i should say that i liked what i found, so >> ... >> > first of all kudos to the developers. >> > >> > as of now i can succesfully generate my finite element matrices using >> sympy, >> > which saves me quite a lot of work. >> > >> > the point is that now i would like to optimize a bit what i did, and i >> would >> > like to collect some common factors between the entries of a matrix. >> > >> > for example imagine that i have (pseudocode and just an example, no >> physics >> > behind) >> > >> > a,b = symbols('a b') >> > >> > A = Matrix(2,1) >> > A[0] = a*(exp(a+b)+exp(b^2)) >> > A[1] = b*(exp(a+b)+exp(b^2)) >> > >> > i would like a way to detect that the term >> > (exp(a+b)+exp(b^2)) >> > >> > is common to the different entries and eventually later on do something >> of >> > the type >> > >> > aux = (exp(a+b)+exp(b^2)) >> > A[0] = a*aux >> > A[1] = b*aux >> > >> > note that later on for me it would be still interesting to do something >> > similar on SOME of the entries of the matrix >> > >> > for example if i had >> > >> > A = Matrix(3,1) >> > A[0] = a*(exp(a+b)+exp(b^2)) >> > A[1] = b*(exp(a+b)+exp(b^2)) >> > A[2] = a+b >> > >> > i would still love to have >> > >> > >> > aux = (exp(a+b)+exp(b^2)) >> > A[0] = a*aux >> > A[1] = b*aux >> > A[2] = a+b >> > >> >> you could use cse() (common subexpression elimination) for this, e.g.: >> >> In [1]: from sympy import * >> >> In [2]: var('a,b') >> Out[2]: (a, b) >> >> In [3]: aux = exp(a + b) + exp(b**2) >> >> In [4]: Matrix([a*aux, b*aux, a + b]) >> Out[4]: >> Matrix([ >> [a*(exp(b**2) + exp(a + b))], >> [b*(exp(b**2) + exp(a + b))], >> [ a + b]]) >> >> In [5]: replacements, (M,) = cse(_) >> >> In [6]: M >> Out[6]: >> Matrix([ >> [a*x1], >> [b*x1], >> [ x0]]) >> >> In [7]: replacements >> Out[7]: [(x0, a + b), (x1, exp(b**2) + exp(x0))] >> >> In [8]: M.subs(list(reversed(replacements))) >> Out[8]: >> Matrix([ >> [a*(exp(b**2) + exp(a + b))], >> [b*(exp(b**2) + exp(a + b))], >> [ a + b]]) >> >> However, this may not be exactly what you want, because it eliminates >> `a + b` as well. >> >> Mateusz >> >> > >> > >> > thanks in advance for any suggestion. >> > >> > cheers >> > Riccardo >> > >> > -- >> > 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 http://groups.google.com/group/sympy. >> > To view this discussion on the web visit >> > >> https://groups.google.com/d/msgid/sympy/a72b7481-c0c8-49a2-9a1f-3e88ae8f5f3d%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 http://groups.google.com/group/sympy. To view this discussion on the web visit https://groups.google.com/d/msgid/sympy/f517f999-8cba-4170-b6d7-7c5c1f48829e%40googlegroups.com. For more options, visit https://groups.google.com/d/optout.
