Symboliczne pakiety oprogramowania dla wyrażeń Matrix?

36

Wiemy, że jest symetryczny i pozytywnie określony. Wiemy, że jest ortogonalny:B.AB

Pytanie: czy symetryczny i pozytywnie określony? Odpowiedź: TakBAB

Pytanie: Czy komputer mógł nam to powiedzieć? Odpowiedź: Prawdopodobnie.

Czy istnieją jakieś symboliczne systemy algebry (takie jak Mathematica), które obsługują i propagują znane fakty dotyczące macierzy?

Edycja: Dla jasności zadaję to pytanie dotyczące abstrakcyjnie zdefiniowanych matryc. Tzn. Nie mam wyraźnych wpisów dla i B , po prostu wiem, że są to zarówno macierze, jak i szczególne atrybuty, takie jak symetryczny, pozytywnie określony itp.AB

MRocklin
źródło
5
Brakuje mi oprogramowania, które traktuje matryce symbolicznie (tj. Nie jako tablice). Chciałbym móc mówić o jakiejś symetrycznej macierzy bez martwienia się o jej wpisy. C
JM
6
Pracuje nad tym kilka projektów. Zdarza się, że jestem zaznajomiony z implementacją w SymPy. Jest wadliwy, ale powoli się buduje.
MRocklin
4
To brzmi jak automatyczne potwierdzanie twierdzeń. Sztuką jest więc włączenie do silnika wystarczającego zestawu aksjomatów, aby można go było skutecznie wydedukować za pomocą automatycznego rozumowania (pomyśl PROLOG). Gdybym miał zaprojektować coś takiego, właściwość, którą cytujesz powyżej, jest zdecydowanie czymś, co kodowałbym jako relację fakt / znany, zamiast próbować. Z drugiej strony profesor Paolo Bientinesi na Uniwersytecie RWTH w Aachen. W swojej rozprawie mówi o automatycznym wyprowadzaniu algorytmów algebry liniowej. Używa Mathematica w sposób symboliczny. aices.rwth-aachen.de:8080/~pauldj
Lagerbaer
1
Znam rzeczy Paolo i bibliotekę FLAME. Nie sądzę, że może to zrobić.
Matt Knepley
2
Zgadzam się, że komputerowe systemy algebry dla macierzy byłyby świetne, ale wydaje się, że ich brakuje. Złożyłem nagrodę, aby zwiększyć szansę na uzyskanie odpowiedzi.
Memming

Odpowiedzi:

27

Edycja: teraz jest w SymPy

$ isympy
In [1]: A = MatrixSymbol('A', n, n)
In [2]: B = MatrixSymbol('B', n, n)
In [3]: context = Q.symmetric(A) & Q.positive_definite(A) & Q.orthogonal(B)
In [4]: ask(Q.symmetric(B*A*B.T) & Q.positive_definite(B*A*B.T), context)
Out[4]: True

Starsza odpowiedź, która pokazuje inną pracę

Po dłuższej analizie to właśnie znalazłem.

Aktualna odpowiedź na moje konkretne pytanie brzmi: „Nie, nie ma obecnego systemu, który mógłby odpowiedzieć na to pytanie”. Jest jednak kilka rzeczy, które wydają się zbliżać.

Po pierwsze, Matt Knepley i Lagerbaer wskazali na prace Diego Fabregata i Paolo Bientinesi . Ta praca pokazuje zarówno potencjalne znaczenie, jak i wykonalność tego problemu. To dobra lektura. Niestety nie jestem pewien, jak dokładnie działa jego system ani do czego jest on zdolny (jeśli ktoś zna inne publiczne materiały na ten temat, daj mi znać).

Po drugie, istnieje biblioteka algebry tensorowej napisana dla Mathematica o nazwie xAct, która obsługuje symetrie i takie symbolicznie. Robi niektóre rzeczy bardzo dobrze, ale nie jest dostosowany do specjalnego przypadku algebry liniowej.

Po trzecie, reguły te są formalnie zapisane w kilku bibliotekach dla Coq , zautomatyzowanego asystenta dowodzenia twierdzeń (Google szuka algebry liniowej / macierzowej coq, aby znaleźć kilka). To potężny system, który niestety wydaje się wymagać interakcji człowieka.

Po rozmowie z niektórymi ludźmi dowodzącymi twierdzeniami sugerują przyjrzenie się programowaniu logicznemu (tj. Prologowi, który również sugerował Lagerbaer) dla tego rodzaju rzeczy. O ile mi wiadomo, nie zostało to jeszcze zrobione - mogę się z tym bawić w przyszłości.

Aktualizacja: Zaimplementowałem to za pomocą systemu Maude . Mój kod jest hostowany na github

MRocklin
źródło
1
Kiedy odkryłem, że nie ma dobrego systemu, od razu pomyślałem o napisaniu programu prologu. :)
Memming
1
Dodałem link u dołu do mojego projektu pobocznego, który dotyczy tego problemu.
MRocklin
4

Niektóre obliczenia macierzy symbolicznej (np. Uzupełnianie macierzy blokowej) można wykonać za pomocą pakietu NCAlgebra http://www.math.ucsd.edu/~ncalg/ (działającego pod matematyką).

Bergman http://servus.math.su.se/bergman/ to pakiet w Lisp o podobnych możliwościach.

Niektóre istotne dokumenty:
http://math.ucsd.edu/~helton/osiris/COMPALG2000/ohRevisIJC.pdf
http://math.ucsd.edu/~thesis/thesis/dkronewitter/dkronewitter.pdf
http: // www. tandfonline.com/doi/abs/10.1080/00207170600882346

Arnold Neumaier
źródło
3

CAS2x23x3B

Powstaje zatem pytanie, a co z Nmacierzą wymiarową? Może uda ci się wymyślić schemat indukcyjny, w którym N-1 x N-1zakłada się, że for jest prawdą, a następnie skonstruować nową macierz blokową o całkowitym rozmiarze, N x Naby udowodnić, że jest ona pozytywnie określona i symetryczna.

Więc ostatnie pytanie, które oprogramowanie lepiej nadaje się do tego zadania (jeśli w ogóle), moje doświadczenie było z ( MATLAB/MuPadi Derivenadal go używa) i żadne z nich nie radzi sobie dobrze z wektorami i macierzami. MATLABdzieli wszystko na komponenty i Derivemoże deklarować, Non-scalarsale nie stosuje wobec nich żadnych zasad uproszczenia.

a×(b×c)=(ab)c(ac)b

ja72
źródło
2

Minęło trochę czasu, odkąd ostatni raz użyłem jednego z tych pakietów, ale pomyślałem, że możesz to zrobić w językach takich jak Mathematica, używając asercji. Coś w rodzaju Assert [A, Symmetric] mówi Mathematica, że ​​A jest macierzą symetryczną i tak dalej. W tej chwili nie mam dostępu do żadnej przydatnej opcji, więc należy to sprawdzić.

eeismail
źródło
1
Myślę, że masz na myśli polecenie Mathematica Assumingzamiast Assert. Assumingzastosuje te założenia podczas uproszczenia lub integracji wyrażenia, ale w dokumentacji nie jest jasne, czy właściwości macierzy są propagowane. Domyślam się, że takie właściwości nie są przenoszone przez obliczenia symboliczne.
Geoff Oxberry
To może być prawda. Tak jak powiedziałem, to było eony temu (jeszcze w czasach, gdy kończyłem szkołę). Ale pamiętam, że kiedyś mogłem zrobić coś takiego. (Być może było to z MuPadem, jak zaimplementowano w Scientific WorkPlace.) Ale nie mam już dostępu do SWP, aby to sprawdzić (tylko Windows i nie mam emulatora na moim pudełku).
aeismail
MuPAD jest teraz częścią Matlaba. Zgodnie z dokumentacją użycie założeń jest podobne do Mathematica.
Geoff Oxberry
MuPAD radzi sobie tylko z macierzą o stałym rozmiarze i nie przyjmuje arbitralnych założeń, takich jak pozytywna definitywność. Nie może także odpowiedzieć na pytanie o pozytywną definitywność pierwotnie zadanego BAB.
Memming
@Memming: Wystarczająco uczciwy. Jak powiedziałem, moja pamięć MuPAD była znacznie nieaktualna, ponieważ ostatnio korzystałem z programu regularnie około 2006 roku (kiedy przestawiłem się z komputera na Mac).
aeismail
2

Klon 15 nie może tego zrobić. Nie ma właściwości „Ortogonalne” dla macierzy (chociaż ma Symmetric i PositiveDefinite).

GertVdE
źródło
1
Zaktualizowano do Klonu 16 -> brak właściwości „Ortogonalne” ani.
GertVdE
1

W Mathematica możesz przynajmniej sprawdzić te właściwości dla określonych matryc. Na przykład macierz, Ajak opisano:

In[1]:= A = {{2.0,-1.0,0.0},{-1.0,2.0,-1.0},{0.0,-1.0,2.0}};
        {SymmetricMatrixQ[A],PositiveDefiniteMatrixQ[A]}
Out[2]= {True,True}

Dla matrycy B:

In[3]:= B = {{0, -0.80, -0.60}, {0.80, -0.36, 0.48}, {0.60, 0.48, -0.64}};
        Transpose[B] == Inverse[B]
Out[4]= True

Następnie:

In[5]:= c = B.A.Transpose[B];
        {SymmetricMatrixQ[c],PositiveDefiniteMatrixQ[c]}
Out[6]= {True,True}

Matryce matematyczne i dokumentacja algebry liniowej

lincz
źródło
7
Rozumiem, że powyższe predykaty weryfikują tę właściwość dla danej macierzy, zamiast symbolicznie propagować te właściwości, o co pyta Matt.
Matt Knepley
O tak. Przepraszam za to. Źle zrozumiałem.
lynchs,