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.

Reply via email to