Operations on Eq objects

25 views
Skip to first unread message

Oscar Benjamin

unread,
Oct 27, 2018, 1:44:09 PM10/27/18
to sy...@googlegroups.com
Hi all,

I find the behaviour of operations involving Eq strange. I would
really like to be able to use Eqs for algebra but they don't seem to
do anything useful. Is this behaviour intentional or is it something
that could be improved?

Setup:
>>> from sympy import *
>>> x = Symbol('x')
>>> y = Symbol('y')
>>> eq = Eq(x, y)
>>> eq
Eq(x, y)
>>> pprint(eq)
x = y

I don't understand what any of these mean:
>>> pprint(2*eq)
2⋅(x = y)
>>> pprint((2*eq).expand())
2⋅(x = y)
>>> exp(eq)
exp(Eq(x, y))
>>> pprint(abs(eq))
│x = y│
>>> eq - 1
-1 + Eq(x, y)
>>> pprint(eq - 1)
-1 + (x = y)

Integration works but differentiation doesn't:
>>> pprint(integrate(eq, x))
⌠ ⌠
⎮ x dx = ⎮ y dx
⌡ ⌡
>>> pprint(integrate(eq, x).doit())
2
x
── = x⋅y
2
>>> diff(eq, x)
Derivative(Eq(x, y), x)
>>> pprint(diff(eq, x))

──(x = y)
∂x
>>> pprint(diff(eq, x).doit())

──(x = y)
∂x

Functions of Eq raise errors:
>>> sin(eq)
...
TypeError: cannot determine truth value of Relational

It looks as if I can chain equations and inequalities but does it
actually mean what it looks like mathematically?
>>> eq < 3
Eq(x, y) < 3
>>> pprint(eq < 3)
x = y < 3

Apart from the inequality example at the end I would like it if all of
the above operations acted on both lhs and rhs separately as in the
case of integration e.g.:

>>> eq
x = y
>>> 2*eq
2*x = 2*y
>>> sin(eq)
sin(x) = sin(y)

The other thing that I don't understand although it is clearly
documented is this:
>>> Eq(1, 1)
True
>>> Eq(1, 0)
False

These True/False values are annoying if you are building up Eqs
programatically e.g. to pass to solve:
>>> solve([Eq(1, 1), Eq(x, y), Eq(x, 1)], [x, y])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/enojb/current/sympy/sympy/sympy/solvers/solvers.py",
line 980, in solve
return reduce_inequalities(f, symbols=symbols)
File "/Users/enojb/current/sympy/sympy/sympy/solvers/inequalities.py",
line 987, in reduce_inequalities
rv = _reduce_inequalities(inequalities, symbols)
File "/Users/enojb/current/sympy/sympy/sympy/solvers/inequalities.py",
line 907, in _reduce_inequalities
'''))
NotImplementedError:
inequality has more than one symbol of interest.

You can solve this last problem with evaluate=False but I really don't
understand why any evaluation is desirable here. I think that solve
has probably gotten confused here for the same reason that any other
code would: the True/False objects don't have any of the same
attributes that an Eq would have:

>>> Eq(0, 1).lhs
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'BooleanFalse' object has no attribute 'lhs'


--
Oscar

Chris Smith

unread,
Oct 27, 2018, 3:40:48 PM10/27/18
to sympy
See this issue for previous discussion.

Oscar Benjamin

unread,
Oct 27, 2018, 5:38:49 PM10/27/18
to sy...@googlegroups.com
Thanks, I've commented there.
> --
> 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 sy...@googlegroups.com.
> Visit this group at https://groups.google.com/group/sympy.
> To view this discussion on the web visit https://groups.google.com/d/msgid/sympy/420d940b-663f-4af7-b4eb-59a048d0bdb3%40googlegroups.com.
> For more options, visit https://groups.google.com/d/optout.
Reply all
Reply to author
Forward
0 new messages