2013-05-08 6 views
7

Wiem, że sympy w Pythonie może ustawić założenia na zmiennych, takich jak x jest dodatni, ujemny, rzeczywisty, złożony, itp. Zastanawiałem się, czy sympy może ustawić założenia na zmiennych względnych do innych zmiennych. Na przykład, jeśli mam zmienne x i y, mogę ustawić sympy, aby założyć, że x> y w swoich rozwiązaniach. Lub alternatywnie, jeśli mam dwie zmienne, a i B, czy mogę ustawić sympy, aby założyć, że a + 2B < 1? Tego rodzaju założenia prawdopodobnie pomogłyby uprościć skomplikowane rozwiązania do rozwiązywania() i wektorów własnych.Założenia ustawień zmiennych Sympy w stosunku do innych zmiennych

Spojrzałem na wszystkie strony i nie znalazłem informacji dotyczących ustalania tego rodzaju założeń w sympy.

Pytam bo jestem stara się znaleźć wektory własne konkretnej macierzy

a,b = symbols('a,b', nonnegative=False) 
M = Matrix([ [1-a-2*b, a, b, b], 
      [a, 1-a-2*b, b, b], 
      [b, b, 1-a-2*b, a], 
      [b, b, a, 1-a-2*b] ]) 

Sympy wyszukuje eigenvalues ​​poprawnie

M.eigenvals() 

który mam MATLAB i potwierdzonych przez WolframAlpha, która wszystko dać takie same wyniki. Jednakże, wektory są bałagan

M.eigenvects() 

MATLAB i WolframAlpha oba wektory powrotne [1,1,1,1] [1, 1,1,1], [0,0, -1,1 ] [-1,1,0,0], które są poprawnymi wektorami własnymi. Nie próbowałem nawet upraszczać wyników sympy, ponieważ są one niewiarygodnie długie i złożone. Podejrzeń, że ma to do czynienia z założenia na zmiennych, takich jak określanie, że a + 2b < 1, ale nie jestem pewien.

Odpowiedz

9

zastanawiałem się, czy aby pisać to jako komentarz, ale to jest zbyt długa:

Krótka odpowiedź: nie w sposób użyteczny.

System założenia SymPy jest obecnie bałaganiarski (wersja 0.7.2, najpóźniej od maja 2013 r.). Istnieje możliwość, że latem tego roku stanie się on lepszy ze względu na przyszły projekt GSoC, ale nie jest to jeszcze pewne.

Istnieją dwa systemy założenia w SymPy. Ten stary, który dodaje założenia do samych Symboli (stąd powoduje problemy z przebudową drzewek wyrażeń) i jest wywoływany w konstruktorze (np. Symbol(..., positive=True)), i jest nowy, oparty na zmiennych globalnych dla globalnych założeń i menedżery kontekstu (with assume(...):) dla lokalnych.

Wiele funkcji w programie SymPy sprawdza stare założenia (na przykład Abs sprawdzi, czy ustawiono argument słowa kluczowego positive), ale nadal mogą występować pomyłki. Nowy system założeń może być mocniejszy, ale w chwili obecnej jest prawie nieużywany (z wyjątkiem bardzo niedawnych submodułów).

W starym systemie założeń nie jest możliwe. W nowym jest to możliwe, ale prawdopodobnie jeszcze nie zaimplementowane i nie używane w żadnej części SymPy.

Masz dwie opcje: pomóż nam przy użyciu systemów założenia lub pomóż nam z modułem macierzy. Obaj mogą użyć trochę więcej miłości.

+1

Witam, wydaje się dużo wiedzieć o systemie założenie. Gdzie mogę uzyskać więcej praktycznych wskazówek na temat aktualnego stanu systemu pod koniec 2016 r. Sympy jest teraz w wersji 1 i wydaje się, że nadal istnieją dwa systemy założeń, ponieważ istnieje moduł założeń i założenia konstruktora symboli Dokumentacja nie wyjaśnia, dlaczego wciąż istnieją dwa systemy lub dają wskazówki wiedzieć, kiedy używać jednego lub drugiego – Shaun

+0

@Shaun, najlepszym miejscem do poproszenia o zaktualizowane instrukcje byłoby sympy listy mailingowej. – Krastanov

4

Założenia tutaj nie wchodzą w grę. To zwykle ma znaczenie tylko, jeśli masz kwadratowe korzenie, ponieważ sqrt(x**2) = x tylko jeśli x >= 0.

Wszystko, co musisz zrobić, to uprościć wynik.Matrix.eigenvects ma flagę simplify, ale najwyraźniej nie upraszcza wyników. Otworzę dla tego problem. W międzyczasie możesz to zrobić ręcznie. Należy pamiętać, że Matrix.simplify aktów w miejscu (jeśli nie tak, można użyć Matrix.applyfunc(simplify)

>>> A = M.eigenvects() 
>>> A[0][2][0].simplify() 
>>> A[1][2][0].simplify() 
>>> pprint(A) 
⎡⎛1, 1, ⎡⎡1⎤⎤⎞, ⎛-4⋅b + 1, 1, ⎡⎡-1⎤⎤⎞, ⎛-2⋅a - 2⋅b + 1, 2, ⎡⎡-1⎤, ⎡0 ⎤⎤⎞⎤ 
⎢⎜  ⎢⎢ ⎥⎥⎟ ⎜    ⎢⎢ ⎥⎥⎟ ⎜     ⎢⎢ ⎥ ⎢ ⎥⎥⎟⎥ 
⎢⎜  ⎢⎢1⎥⎥⎟ ⎜    ⎢⎢-1⎥⎥⎟ ⎜     ⎢⎢1 ⎥ ⎢0 ⎥⎥⎟⎥ 
⎢⎜  ⎢⎢ ⎥⎥⎟ ⎜    ⎢⎢ ⎥⎥⎟ ⎜     ⎢⎢ ⎥ ⎢ ⎥⎥⎟⎥ 
⎢⎜  ⎢⎢1⎥⎥⎟ ⎜    ⎢⎢1 ⎥⎥⎟ ⎜     ⎢⎢0 ⎥ ⎢-1⎥⎥⎟⎥ 
⎢⎜  ⎢⎢ ⎥⎥⎟ ⎜    ⎢⎢ ⎥⎥⎟ ⎜     ⎢⎢ ⎥ ⎢ ⎥⎥⎟⎥ 
⎣⎝  ⎣⎣1⎦⎦⎠ ⎝    ⎣⎣1 ⎦⎦⎠ ⎝     ⎣⎣0 ⎦ ⎣1 ⎦⎦⎠⎦ 
+0

https://code.google.com/p/sympy/issues/detail?id= 3811 – asmeurer

+0

Ah. Dzięki! Th to rozwiązania rozwiązuje wiele problemów, które miałem. Wystąpiły problemy z wektorami własnymi zawierającymi pierwiastki kwadratowe, takie jak sqrt ((K-a) ** 2). Byłoby miło móc określić założenie, że K> a więc to upraszcza jako pozytywne. Na podstawie powyższego posta wydaje się, że nie jest to jeszcze możliwe. – Nate

+1

Możesz to zrobić w pewnym stopniu dzięki nowym założeniom. Spróbuj 'doprecyzuj (expr, Q.pozytywny (K - a))'. – asmeurer

Powiązane problemy