2016-11-24 32 views
8

documentation on nonlinsolve daje ten przykład:Ponieważ przykład w dokumentacji jest uszkodzony, w jaki sposób mogę rozwiązać nieliniowy układ równań numerycznie w SymPy?

from sympy.core.symbol import symbols 
from sympy.solvers.solveset import nonlinsolve 
x, y, z = symbols('x, y, z', real=True) 
nonlinsolve([x*y - 1, 4*x**2 + y**2 - 5], [x, y]) 
{(-1, -1), (-1/2, -2), (1/2, 2), (1, 1)} 

ale nawet w żywej powłoki na swojej stronie internetowej, że zgłasza błąd:

>>> from sympy.solvers.solveset import nonlinsolve 
Traceback (most recent call last): 
    File "<string>", line 1, in <module> 
ImportError: cannot import name nonlinsolve 

Jak mogę używać nonlinsolve rozwiązać układ równań numerycznie? Wiem, że mogę użyć ufuncify, aby przekonwertować równania w system, który może rozwiązać scipy.optimize.fsolve, ale wolałbym uniknąć tych kilku linii na płycie głównej i po prostu użyć SymPy bezpośrednio. Nie jest zalecane używanie solve. W przypadku nieliniowych układów równań dokumentacja zaleca sympy.solvers.solveset.nonlinsolve, którą próbuję tutaj użyć.

+0

użyj 'sympy.solve ([x * y - 1, 4 * x ** 2 + y ** 2 - 5], [x, y])' – Stelios

+1

@Stelios Zgodnie z dokumentacją Sympy, [używając ' rozwiązać "nie jest zalecane" (http://docs.sympy.org/dev/modules/solvers/solvers.html). Dodam oświadczenie na ten temat do mojego pytania. –

+0

Dokumenty są być może nieco agresywne.zestaw układów naprawczych ma zastąpić rozwiązanie, ale wciąż istnieją przypadki, w których jest to konieczne, na przykład systemy nieliniowe. – asmeurer

Odpowiedz

3

Wygląda na to, że ten moduł nie jest dołączony do wersji 1.0.0, ale jest dostępny tylko w bieżącym head. W każdym razie dobrym pomysłem może być sprawdzenie obecnego stanu repozytorium sympy, ponieważ ich wydania są raczej rzadkie.

Według docs, to jest tak proste, jak

git clone git://github.com/sympy/sympy.git 
cd sympy 
sudo python setupegg.py develop 

(musiałem użyć python3 zamiast python jak mam oba 3 instalacji całego systemu Python 2 i Python. Też ewentualnie można użyć virtualenv Aby uniknąć sudo.)

Po tym, najnowsza wersja github będzie dostępna ze zwykłym import.

import sympy 
print(sympy.__version__) 
# 1.0.1.dev 

Teraz przykład działa:

from sympy.core.symbol import symbols 
from sympy.solvers.solveset import nonlinsolve 
x, y, z = symbols('x, y, z', real=True) 
nonlinsolve([x*y - 1, 4*x**2 + y**2 - 5], [x, y]) 
# {(-1, -1), (-1/2, -2), (1/2, 2), (1, 1)} 

PS: Jeśli naprawdę interesuje Cię rozwiązanienumeryczne, to wydaje się, że rzecz pasuje lepiej do ciebie: ufuncify + fsolve. SymPy to system algebry komputerowej, więcdołoży wszelkich starań, aby rozwiązać nieliniowo, nie numerycznie, system . I oczywiście nie może (jak wszystkie rozwiązują analitycznych):

nonlinsolve([x**5 + x**2 + 1], [x]) 
# {(CRootOf(x**5 + x**2 + 1, 0),), (CRootOf(x**5 + x**2 + 1, 1),), (CRootOf(x**5 + x**2 + 1, 2),), (CRootOf(x**5 + x**2 + 1, 3),), (CRootOf(x**5 + x**2 + 1, 4),)} 
+0

Użytkownicy systemu Windows: https://github.com/sympy/sympy, pobierz plik ZIP, rozwiń go w wygodnym nowym folderze, dysk CD w folderze zawierającym plik setup.py, a następnie wykonaj polecenie 'python setup.py install' . Przygotuj się na długie oczekiwanie, podczas gdy proces ten będzie przebiegał i zmierza do wniosku. Następnie sprawdź, czy możesz 'importować sympy' i że' sympy .__ version__' jest tym, czego oczekiwałeś. –

6

Jeśli chcesz rozwiązać systemów numerycznie, użyj nsolve. To wymaga wstępnego odgadnięcia dla rozwiązania (istnieje również wiele opcji, które możesz zastosować, aby użyć różnych solverów, zobacz http://docs.sympy.org/latest/modules/solvers/solvers.html#sympy.solvers.solvers.nsolve i http://mpmath.org/doc/current/calculus/optimization.html).

In [1]: nsolve([x*y - 1, 4*x**2 + y**2 - 5], [x, y], [1, 1]) 
Out[1]: 
matrix(
[['1.0'], 
['1.0']]) 

Dla rozwiązań symbolicznych, polecam przy użyciu starego solve, aż nonlinsolve dojrzewa.