Pacchetti software simbolici per espressioni Matrix?


36

Sappiamo che è simmetrico e definito positivo. Sappiamo che è ortogonale:AB

Domanda: simmetrico e definito positivo? Risposta: SìBAB

Domanda: un computer potrebbe avercelo detto? Risposta: probabilmente.

Esistono sistemi simbolici di algebra (come Mathematica) che gestiscono e propagano fatti noti sulle matrici?

Modifica: per essere chiari, sto facendo questa domanda sulle matrici definite in modo astratto. Cioè non ho voci esplicite per e , so solo che sono entrambe matrici e hanno attributi particolari come simmetrici, positivi definiti, ecc.AB


5
Quello che mi manca è un software che tratta simbolicamente le matrici (cioè non come matrici). Vorrei poter parlare di una matrice simmetrica senza doversi preoccupare delle sue voci. C
JM,

6
Ci sono alcuni progetti che lavorano su questo. Ho familiarità con l'implementazione in SymPy. È difettoso ma si sta lentamente costruendo.
MRocklin,

4
Sembra una dimostrazione del teorema automatizzato. Il trucco è quindi includere un insieme sufficiente di assiomi nel tuo motore in modo che possa essere dedotto in modo efficiente mediante ragionamenti automatici (pensa a PROLOG). Se dovessi progettare una cosa del genere, la proprietà che citi sopra è sicuramente qualcosa che codificherei come relazione di fatto / nota piuttosto che provare. D'altra parte, c'è il Prof. Paolo Bientinesi alla RWTH Aachen University. Nella sua tesi di laurea parla della derivazione automatica di algoritmi di algebra lineare. Usa Mathematica in modo simbolico. aices.rwth-aachen.de:8080/~pauldj
Lagerbaer

1
Conosco le cose di Paolo e la libreria FLAME. Non penso che possa farlo.
Matt Knepley,

2
Concordo sul fatto che i sistemi di algebra computerizzata per le matrici sarebbero grandi, ma sembrano mancare. Ho messo una taglia per aumentare la possibilità di ottenere una risposta.
Memming

Risposte:


27

Modifica: questo è ora in 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

Risposta precedente che mostra altri lavori

Quindi dopo aver esaminato questo per un po ', questo è quello che ho trovato.

La risposta attuale alla mia domanda specifica è "No, non esiste un sistema attuale in grado di rispondere a questa domanda". Vi sono tuttavia alcune cose che sembrano avvicinarsi.

In primo luogo, Matt Knepley e Lagerbaer hanno entrambi indicato di lavorare di Diego Fabregat e Paolo Bientinesi . Questo lavoro mostra sia la potenziale importanza che la fattibilità di questo problema. È una buona lettura Sfortunatamente non sono sicuro di come funzioni il suo sistema o di cosa sia capace (se qualcuno sa di altro materiale pubblico su questo argomento fammelo sapere).

In secondo luogo, esiste una libreria di algebra tensoriale scritta per Mathematica chiamata xAct che gestisce simmetrie e simbolicamente. Fa alcune cose molto bene, ma non è adattato al caso speciale dell'algebra lineare.

Terzo, queste regole sono scritte formalmente in un paio di librerie di Coq , un assistente dimostratore di teoremi automatizzato (Google cerca qualche algebra lineare / matrice di coq per trovarne alcune). Questo è un sistema potente che purtroppo sembra richiedere l'interazione umana.

Dopo aver parlato con alcune persone che dimostrano teoremi , suggeriscono di esaminare la programmazione logica (cioè Prolog, che anche Lagerbaer ha suggerito) per questo genere di cose. Per quanto ne so, questo non è ancora stato fatto - potrei giocarci in futuro.

Aggiornamento: l'ho implementato usando il sistema Maude . Il mio codice è ospitato su github


1
Quando ho scoperto che non esisteva un buon sistema, il mio primo istinto era quello di scrivere un programma di prolog. :)
Memming

1
Ho aggiunto un link in basso a un mio progetto laterale che affronta questo problema.
MRocklin,

Si potrebbe SymPydedurre una semplificazione della moltiplicazione e dell'inversione della matrice?
Royi

4

Alcuni calcoli con matrici simboliche (ad es. Completamento di matrici di blocchi) possono essere eseguiti con il pacchetto NCAlgebra http://www.math.ucsd.edu/~ncalg/ (che funziona con matematica).

Bergman http://servus.math.su.se/bergman/ è un pacchetto in Lisp con funzionalità simili.

Alcuni documenti pertinenti:
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


3

Penso che la maggior parte dei CASsistemi sia in grado di dimostrarlo 2x2e per le 3x3matrici, dato un costrutto simbolico ortonormale , come le matrici di rotazione. Alla fine, dovrai scomporre il risultato per capire se è positivo o meno. La simmetria è più facile da mostrare.B

La domanda diventa allora: che dire di una Nmatrice dimensionale? Forse puoi escogitare uno schema induttivo in cui N-1 x N-1si presume che sia vero e quindi costruire una nuova matrice di blocchi con dimensione complessiva N x Nper dimostrare che è positivo definito e simmetrico.

Quindi l'ultima domanda, su quale software sia più adatto all'attività (se presente), la mia esperienza è stata con MATLAB/MuPade Derive(ancora lo uso) e nessuno dei due gestisce molto bene vettori e matrici. MATLABsuddivide tutto in componenti e Derivepuò dichiarare Non-scalarsma non applica loro alcuna regola di semplificazione.

Spero che questo post fornirà ulteriori informazioni su questo tipo di "buco" e su come colmarlo. Per me, voglio un software che possa aiutarmi a semplificare le espressioni con più prodotti punto e croce di vettori, insieme alle matrici di rotazione usano identità ben note come:a×(b×c)=(ab)c(ac)b


2

È passato un po 'di tempo dall'ultima volta che ho usato uno di questi pacchetti, ma ho pensato che potevi farlo in lingue come Mathematica attraverso l'uso di asserzioni. Qualcosa come Assert [A, Symmetric] dice a Mathematica che A è una matrice simmetrica e così via. Non ho accesso a nessuno dei due al momento, quindi questo è qualcosa che dovrebbe essere verificato.


1
Penso che intendi il comando Mathematica Assuminginvece di Assert. Assumingapplicheranno questi presupposti durante la semplificazione o l'integrazione di un'espressione, ma la documentazione non è chiara sul fatto che le proprietà della matrice siano propagate. La mia ipotesi è che tali proprietà non siano portate attraverso calcoli simbolici.
Geoff Oxberry,

Questo potrebbe essere vero. Come ho detto, questo è successo eoni fa (ai tempi della mia scuola di specializzazione). Ma ricordo di essere stato in grado di fare qualcosa del genere una volta. (Forse è stato con MuPad, come implementato in Scientific WorkPlace.) Ma non ho più accesso a SWP per verificarlo (solo per Windows, e non ho un emulatore sulla mia scatola).
Aeismail,

MuPAD fa parte di Matlab ora. Secondo la documentazione , l'uso di ipotesi è simile a quello di Mathematica.
Geoff Oxberry,

MuPAD può gestire solo matrici di dimensioni fisse e non accetta ipotesi arbitrarie come la positività positiva. Inoltre non può rispondere alla domanda di positività positiva di BAB 'originariamente posta.
Memming

@Memming: abbastanza giusto. Come ho detto, la mia memoria di MuPAD era sostanzialmente obsoleta, dato che ho usato il programma per l'ultima volta regolarmente intorno al 2006 (quando sono passato da PC a Mac).
Aeismail

2

Maple 15 non può farlo. Non ha proprietà "ortogonali" per le matrici (sebbene abbia simmetrico e positivo definito).


1
Aggiornato ad Maple 16 -> nessuna proprietà "ortogonale".
GertVdE,

1

In Mathematica puoi almeno controllare queste proprietà per matrici specifiche. Ad esempio, la matrice Acome hai descritto:

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}

Per matrice 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

Poi:

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

Documentazione sulle matrici Mathematica e l'algebra lineare


7
Comprendo che i predicati sopra stanno verificando quella proprietà per una data matrice, piuttosto che propagare simbolicamente queste proprietà come Matt chiede sopra.
Matt Knepley,

Ah sì. Mi dispiace per quello. Ho frainteso.
lincia il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.