2016-09-29 4 views
7

Ich möchte y = (x + 1) ** 3 -2 für x in Sympy lösen, um seine inverse Funktion zu finden.
Ich versuchte mit solve, aber ich habe nicht bekommen, was ich erwartet habe.

Hier ist, was ich in IPython Konsole in cmd (sympy 1.0 auf Python 3.5.2) schrieb:
Wie kann ich y = (x + 1) ** 3 -2 für x in sympy lösen?

In [1]: from sympy import * 
In [2]: x, y = symbols('x y') 
In [3]: n = Eq(y,(x+1)**3 - 2) 
In [4]: solve(n,x) 
Out [4]: 
[-(-1/2 - sqrt(3)*I/2)*(-27*y/2 + sqrt((-27*y - 54)**2)/2 - 27)**(1/3)/3 - 1, 
-(-1/2 + sqrt(3)*I/2)*(-27*y/2 + sqrt((-27*y - 54)**2)/2 - 27)**(1/3)/3 - 1, 
-(-27*y/2 + sqrt((-27*y - 54)**2)/2 - 27)**(1/3)/3 - 1] 

Ich war auf der Suche auf das letzte Element in der Liste in Out [4], aber es ist nicht gleich x = (y + 2) ** (1/3) - 1 (was ich erwartet hatte).
Warum hat sympy das falsche Ergebnis ausgegeben,
und was kann ich tun, damit sympy die von mir gesuchte Lösung liefert?

Ich versuchte mit solveset, aber ich habe die gleichen Ergebnisse wie mit solve.

In [13]: solveset(n,x) 
Out[13]: {-(-1/2 - sqrt(3)*I/2)*(-27*y/2 + sqrt((-27*y - 54)**2)/2 - 27)**(1/3)/ 
3 - 1, -(-1/2 + sqrt(3)*I/2)*(-27*y/2 + sqrt((-27*y - 54)**2)/2 - 27)**(1/3)/3 - 
1, -(-27*y/2 + sqrt((-27*y - 54)**2)/2 - 27)**(1/3)/3 - 1} 

Antwort

3

Wenn Sie erklären, dass x und y positiv sind, dann gibt es nur eine Lösung:

import sympy as sy 
x, y = sy.symbols("x y", positive=True) 
n = sy.Eq(y, (x+1)**3 - 2) 
s = sy.solve(n, x) 
print(s) 

[(y + 2)**(1/3) - 1] 
+0

Dies funktioniert (klingt seltsam, aber die Lösung sollte für alle reellen Zahlen funktionieren), aber wenn ich versuche, es auf eine andere Polynomgleichung wie 'n = Eq (y, (x + 1) ** 5) ', Ich bekomme einen leeren Satz. Weißt du, was ich tun kann, um das x = y ** (1/5) -1 zu bekommen, das ich erwartet habe? (Ich kann das in einer anderen Frage fragen, ob ich dazu sollte.) – DragonautX

+0

@DragonautX: Entschuldigung, ich habe keine gute Antwort auf Ihre allgemeine Frage. – unutbu

+0

Das ist in Ordnung. Am Ende kann ich es immer von Hand machen und von dort aus arbeiten, oder ich kann ein anderes Werkzeug ausprobieren. – DragonautX

4

Sympy hat Ihnen das richtige Ergebnis: Ihr letztes Ergebnis ist äquivalent zu (y + 2) ** (1/3) - 1.

Was Sie suchen ist simplify:

>>> from sympy import symbols, Eq, solve, simplify 
>>> x, y = symbols("x y") 
>>> n = Eq(y, (x+1)**3 - 2) 
>>> s = solve(n, x) 
>>> simplify(s[2]) 
(y + 2)**(1/3) - 1 

edit: Arbeitete mit sympy 0.7.6.1, nach der Aktualisierung auf 1.0 funktioniert es nicht mehr.

+1

ergibt Wie konnten Sie die Gleichung() n zuweisen, ohne dabei ' x, y = Symbole ('x y') '? Außerdem kann ich immer noch nicht die vereinfachte Version erhalten. Ich bekomme '-2 ** (2/3) * (- y + sqrt ((y + 2) ** 2) - 2) ** (1/3)/2 - 1'. – DragonautX

+0

Durch vergessen zu kopieren, sorry. Versuchen Sie 'sol in s: print (simplify (sol))'; Ich glaube, die Reihenfolge ist zufällig. – L3viathan

+2

Ich bekomme das gleiche Ergebnis wie @DragonautX. Mit Sympy Version 1.0 auf Python 3.5.2 –

Verwandte Themen