At some point we might do a simplify sort of treatment for sets.
In the meantime something like the following could work in the case of
monotonic functions. In general we know how to transform Intervals and
FiniteSets. We know that unions and intersections will compose well with
these transformations. That's all you really need.
This should eventually be broken out into methods on the various classes:
def transform_set(x, expr, set):
""" Transform a set by an expression
>>> domain = Interval(-pi, 0, True, True) + Interval(0, pi/2, True,
True)
(0, pi/2) U (-pi, 0)
>>> transform(x, 2*x, domain)
(0, pi) U (-2*pi, 0)
>>> transform(x, x**2, domain)
(0, pi**2)
"""
if isinstance(set, Union):
return Union(transform_set(x, expr, arg) for arg in set.args)
if isinstance(set, Intersection):
return Intersection(transform_set(x, expr, arg) for arg in set.args)
z = Dummy('z', real=True)
f = Lambda(x, expr)
if isinstance(set, Interval):
# TODO: manage left_open and right_open better
left, right = f(set.left), f(set.right)
return Interval(Min(left, right), Max(left, right),
set.left_open, set.right_open)
if isinstance(set, FiniteSet):
return FiniteSet(map(f, set))
On Mon, Jul 29, 2013 at 9:37 PM, Ben Lucato <[email protected]> wrote:
> Thanks - I updated to the git master and now the TransformationSet works.
> Is there some way to take this new TransformationSet object and rewrite it
> as a Union/Interval?
>
> i.e.
>
> get this:
>
> Interval(-2*pi, 0, True, True) + Interval(0, pi, True, True)
>
>
> On Tuesday, 30 July 2013 10:34:48 UTC+10, Matthew wrote:
>
>> This is what I get. Can you verify that things don't work for you? This
>> was done in sympy/master.
>>
>> In [1]: domain = Interval(-pi, 0, True, True) + Interval(0, pi/2, True,
>> True)
>>
>> In [2]: new_domain = TransformationSet(Lambda(x, 2*x), domain)
>>
>> In [3]: domain
>> Out[3]:
>> ⎛ π⎞
>> ⎜0, ─⎟ ∪ (-π, 0)
>> ⎝ 2⎠
>>
>> In [4]: new_domain
>> Out[4]:
>> ⎧ ⎛ π⎞ ⎫
>> ⎨2⋅x | x ∊ ⎜0, ─⎟ ∪ (-π, 0)⎬
>> ⎩ ⎝ 2⎠ ⎭
>>
>> In [5]: 3*pi/4 in new_domain
>> Out[5]: True
>>
>>
>>
>> On Mon, Jul 29, 2013 at 7:24 PM, Ben Lucato <[email protected]> wrote:
>>
>>> Howdy, say I do:
>>>
>>> domain = Interval(-pi, 0, True, True) + Interval(0, pi/2, True, True)
>>>
>>>
>>> I could hope to do a transformation to dilate this domain by a factor 2
>>> from the origin, like so:
>>>
>>>
>>> new_domain = domain.replace(lambda expr: expr.is_Real, lambda expr:
>>> 2*expr)
>>> OR:
>>> new_domain = TransformationSet(Lambda(x, 2*x), domain)
>>>
>>> in either case, checking:
>>>
>>> 3*pi/4 in new_domain
>>>
>>> returns False.
>>>
>>> I may be using TransformationSet incorrectly - I just looked in the docs
>>> and it looked like something relevant. Perhaps it only works for sets?
>>>
>>> --
>>> 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 sympy+un...@**googlegroups.com.
>>> To post to this group, send email to [email protected].
>>>
>>> Visit this group at
>>> http://groups.google.com/**group/sympy<http://groups.google.com/group/sympy>
>>> .
>>> For more options, visit
>>> https://groups.google.com/**groups/opt_out<https://groups.google.com/groups/opt_out>
>>> .
>>>
>>>
>>>
>>
>> --
> 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.
> For more options, visit https://groups.google.com/groups/opt_out.
>
>
>
--
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.
For more options, visit https://groups.google.com/groups/opt_out.