Potrzebuję napisać kod, który zajmuje się generowaniem wielomianów wielowymiarowych i manipulowaniem nimi. Opiszę moje zadanie za pomocą uproszczonego przykładu.Biblioteki do obsługi wielomianów wielowymiarowych
Powiedzmy, że otrzymałem trzy wyrażenia: 2x^2, 3y + 1 i 1z. Potem muszę je pomnożyć, co dałoby mi 6x^2yz + 2x^2z. Następnie chciałbym znaleźć częściowe pochodne tego wyrażenia w odniesieniu do x, yi z. To dałoby mi 12xyz + 4xz, 6x^2z i 6x^2y + 2x^2.
Mój problem polega na robieniu prostych manipulacji takich jak to w wyrażeniach zawierających tysiące zmiennych i potrzebuję prostego sposobu, aby zrobić to systematycznie. Naprawdę chciałbym użyć Pythona, ponieważ mam już wiele funkcji związanych z projektem zakończonych przy użyciu numpy/scipy/matplotlib, ale jeśli istnieje solidny zestaw narzędzi w innym języku, jestem również otwarty na używanie tego języka. Prowadzę badania uniwersyteckie, więc jestem również otwarty na korzystanie z Matlaba.
Nie byłem w stanie znaleźć żadnych dobrych bibliotek Pythona, które mogłyby zrobić to dla mnie łatwo i idealnie chciałbym coś podobnego do scipy polynomial routines, które mogłyby pracować na wielowymiarowych wielomianach. Czy ktoś wie o dobrej bibliotece, która wydaje się odpowiednia dla tego problemu i która byłaby łatwa do zintegrowania z już istniejącym kodem Pythona?
Dzięki!
Kontynuacja: Spędziłem kilka dni pracy z sympy, który okazał się bardzo łatwy w użyciu. Jednak rozmiar problemu, nad którym pracuję, znacznie się zmniejszył, więc teraz przejdę do zbadania matlab. Aby uzyskać bardzo przybliżoną ocenę prędkości przy użyciu małego rozmiaru próbki, obliczenie każdej częściowej pochodnej wielomianu rzędu 2 zawierającego 250 zmiennych zajęło około 5 sekund.
Kontynuacja # 2: Prawdopodobnie powinieneś był zrobić to z powrotem, gdy wciąż pracowałem nad tym problemem, ale równie dobrze mogłem poinformować wszystkich, że symboliczna biblioteka matlab była niezwykle porównywalna w tempie do sympy. Innymi słowy, w przypadku dużych obliczeń było ono brutalnie wolne. Obie biblioteki były niezwykle łatwe w obsłudze, więc dla małych obliczeń bardzo polecam albo.
Aby rozwiązać mój problem, ręcznie obliczałem gradienty, uprościłem je, a następnie użyłem znalezionych przeze mnie wzorców do zakodowania pewnych wartości w moim kodzie. To było więcej pracy, ale mój kod był wykładniczo szybszy i ostatecznie użyteczny.
W jaki sposób reprezentatywny jest Twój przykład? Jeśli początkowe polysy są funkcjami tylko jednego var, problem wydaje się łatwiejszy. –
+1: Naprawdę dobre pytanie. Podszedłem * do * zasugerowania SymPy, która oczywiście dokonuje obliczeń symbolicznych (w przeciwieństwie do bibliotek oznaczonych tagami), ale wydaje się, że robi to jedynie numeryczne różnicowanie! http://docs.sympy.org/modules/mpmath/calculus/differentiation.html –
@Nikhil: sympy również robi symboliczne zróżnicowanie. Zobacz mój przykład poniżej. –