2016-09-29 9 views
7

Chciałbym rozwiązać y = (x + 1) ** 3 -2 dla x w sympy, aby znaleźć jego funkcję odwrotną.
Próbowałem użyć solve, ale nie dostałem tego, czego się spodziewałem.

Oto co napisałem w konsoli ipython w cmd (sympy 1,0 na Python 3.5.2):
Jak mogę rozwiązać y = (x + 1) ** 3 -2 dla x w sympy?

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] 

Szukałem na ostatni element listy w Out [4], ale to nie jest równy x = (y + 2) ** (1/3) - 1 (czego się spodziewałem).
Dlaczego program Sympy wyświetlił nieprawidłowy wynik,
i co mogę zrobić, aby rozwiązanie sympy było rozwiązaniem, którego szukałem?

Próbowałem użyć solveset, ale mam takie same wyniki jak przy użyciu 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} 

Odpowiedz

3

Jeśli zadeklarujesz, że x i y są pozytywne, to istnieje tylko jedno rozwiązanie:

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) 

daje

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

To działa (brzmi to dziwnie, rozwiązanie powinno działać dla wszystkich liczb rzeczywistych), ale kiedy próbuję rozszerzyć to na inne równanie wielomianowe, takie jak 'n = Eq (y, (x + 1) ** 5) ', otrzymuję pusty zestaw. Czy wiesz, co mogę zrobić, aby uzyskać x = y ** (1/5) -1, którego oczekiwałem? (Mogę zapytać o to w innym pytaniu, czy powinienem.) – DragonautX

+0

@DragonautX: Przepraszam, nie mam dobrej odpowiedzi na twoje ogólne pytanie. – unutbu

+0

W porządku. Koniec końców, zawsze mogę to zrobić ręcznie i pracować stamtąd, lub mogę wypróbować inne narzędzie. – DragonautX

4

Sympy dał ci poprawny wynik: Twój ostatni wynik jest równoważny (y + 2) ** (1/3) - 1.

Czego szukasz 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 

edytuj: Praca z sympy 0.7.6.1, po aktualizacji do wersji 1.0 nie działa.

+1

Jak byłeś w stanie przypisać EQ() n nie robiąc ' x, y = symbole ("x y") '? Ponadto nadal nie mogę uzyskać uproszczonej wersji, którą otrzymałeś. Otrzymuję '-2 ** (2/3) * (- y + sqrt ((y + 2) ** 2) - 2) ** (1/3)/2 - 1'. – DragonautX

+0

Zapominając skopiować, przepraszam. Cóż, spróbuj 'dla sol in s: print (upraszczaj (sol))'; Uważam, że zamówienie jest losowe. – L3viathan

+2

Otrzymuję ten sam wynik co @DragonautX. Używanie wersji sympy 1.0 na python 3.5.2 –

Powiązane problemy