I'm trying to solve the following equation, with python 3.6.3:
I did
from sympy import *
x = Symbol('x', real=True)
solve(abs((abs(x**2-1)-x))-x)
but I get the following message:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python36-32\lib\site-packages\sympy\solvers\solvers.py", line 1065, i
n solve
solution = _solve(f[0], *symbols, **flags)
File "C:\Python36-32\lib\site-packages\sympy\solvers\solvers.py", line 1366, i
n _solve
candidates = _solve(piecewise_fold(expr), symbol, **flags)
File "C:\Python36-32\lib\site-packages\sympy\solvers\solvers.py", line 1634, i
n _solve
raise NotImplementedError('\n'.join([msg, not_impl_msg % f]))
NotImplementedError: multiple generators [x, Abs(-x**2 + x + 1)]
No algorithms are implemented to solve equation -x + Abs(-x**2 + x + 1)
But with python 2.7.14 and matlab I get answers. Am I missing something?
This gives [1, -1 + sqrt(2), 1 + sqrt(2)]
if you use the current master and manually rewrite the expression as Piecewise. Apparently the rewriting is incomplete when done by solve
itself:
>>> solve((abs((abs(x**2-1)-x))-x).rewrite(Piecewise))
[1, -1 + sqrt(2), 1 + sqrt(2)]
The SymPy codebase could be changed with the following diff to correct the problem:
diff --git a/sympy/solvers/solvers.py b/sympy/solvers/solvers.py
index 172d504..96bfa94 100644
--- a/sympy/solvers/solvers.py
+++ b/sympy/solvers/solvers.py
@@ -1020,8 +1020,13 @@ def _sympified_list(w):
# Abs
fi = fi.replace(Abs, lambda arg:
separatevars(Abs(arg)) if arg.has(*symbols) else Abs(arg))
- fi = fi.replace(Abs, lambda arg:
- Abs(arg).rewrite(Piecewise) if arg.has(*symbols) else Abs(arg))
+ while True:
+ was = fi
+ fi = fi.replace(Abs, lambda arg:
+ (Abs(arg).rewrite(Piecewise) if arg.has(*symbols)
+ else Abs(arg)))
+ if was == fi:
+ break
for e in fi.find(Abs):
if e.has(*symbols):