I think we should make it so that cos(4*x + 6).replace(2*x + 3, u) works. Aaron Meurer
On Fri, Mar 20, 2015 at 9:09 AM, Mike Boyle <[email protected]> wrote: > I agree that wildcards behave very strangely -- especially under > multiplication, because they can basically divide by whatever they're > multiplying. In my experience, their real power comes from repeated uses. > For example, the following would work in your example, Francesco: > > cos(4*x+6).replace((w*2*x+w*3), u*w) > > Also, note that there is an `exclude` flag to the wildcard constructor that > can help in some cases (though wouldn't have helped in your example). > > > While we're at it, I might add a couple more examples that make your > original suggestion a little more specific, so that they may deal with > Paul's situation more generally. First, assuming there might be another > term in the expression (and, as he mentioned, other `x`s shouldn't be > replaced), this will be do: > > (3 + x*cos(4*x+6)).replace( > lambda expr: expr.is_Add and simplify(expr/(2*x+3)).is_Number, > lambda expr: u*simplify(expr/(2*x+3)) > ) > > That extra condition in the first lambda function is needed to make sure the > whole expression (which is now an `Add`) won't be multiplied by u/(2*x+3). > > Or, if only arguments to `sin` and `cos` functions should be replaced, this > would work: > > (x*(8*x+12) + x*cos(4*x+6)).replace( > lambda expr: (expr.func == cos or expr.func == sin) and > simplify(expr.args[0]/(2*x+3)).is_Number, > lambda expr: expr.func(u*simplify(expr.args[0]/(2*x+3))) > ) > > > > > > > > On Friday, March 20, 2015 at 9:11:40 AM UTC-4, Francesco Bonazzi wrote: >> >> There are also wildcards to use in the replacement matcher, unfortunately >> in SymPy wild symbols often match too much or in an unexpected way. >> >> Consider an attempt with a wild: >> >> In [1]: w = Wild('w') >> >> In [2]: cos(4*x+6).replace(w*(2*x+3), u*w) >> Out[2]: >> ⎛ 2 ⎞ >> ⎜ 4⋅u ⋅x 6⋅u ⎟ >> cos⎜────────── + ───────⎟ >> ⎜ 2 2⋅x + 3⎟ >> ⎝(2⋅x + 3) ⎠ >> >> >> It would be nice to have assumptions work on wildcards, in order to >> restrict their matching possibilities. >> >> On Friday, March 20, 2015 at 9:01:05 AM UTC+1, Paul Royik wrote: >>> >>> >>> Yes. This version is not for me. >>> x in front of cosine shouldn't be replaced. >>> >>> On Thursday, March 19, 2015 at 4:56:42 PM UTC+2, Mike Boyle wrote: >>>> >>>> It seems to me that the easy way to do this is to solve your replacement >>>> for `x`: >>>> >>>> cos(4*x+6).subs(x, (u-3)/2) >>>> >>>> And if this is just a special case of a more general substitution, you >>>> can of course do that solve step with sympy. >>>> >>>> I can't tell from your question, but this might not be exactly what you >>>> wanted. For example, look at >>>> >>>> (x*cos(4*x+6)).subs(x, (u-3)/2) >>>> >>>> This will also replace the `x` out front. If you don't want that, you'd >>>> need to do an even more complicated version of what Francesco suggests. > > -- > 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/e76ad3b1-7fe0-4f3e-9afd-2ff19b1d6124%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/CAKgW%3D6KjNJSLCVUYAkCcN78bgwygUpuBJ4rbJ1FYXX%2BT%2BasYQg%40mail.gmail.com. For more options, visit https://groups.google.com/d/optout.
