Des progiciels symboliques pour les expressions Matrix?

36

Nous savons que est symétrique et positif-défini. Nous savons que est orthogonal:AB

Question: symétrique et positif-défini? Réponse: ouiBAB

Question: Un ordinateur aurait-il pu nous le dire? Réponse: probablement.

Existe-t-il des systèmes algébriques symboliques (comme Mathematica) qui gèrent et propagent des faits connus sur les matrices?

Edit: Pour être clair, je pose cette question sur les matrices définies de manière abstraite. C'est-à-dire que je n'ai pas d'entrées explicites pour et , je sais juste qu'elles sont toutes les deux matrices et ont des attributs particuliers comme symétrique, positif défini, etc.AB

MRocklin
la source
5
Ce qui me manque, c'est un logiciel qui traite les matrices de manière symbolique (c'est-à-dire, pas comme des tableaux). J'aimerais pouvoir parler d'une matrice symétrique sans avoir à s'inquiéter de ses entrées. C
JM
6
Quelques projets y travaillent. Je connais l’implémentation dans SymPy. C'est un buggy mais en train de se construire lentement.
MRocklin
4
Cela ressemble à une démonstration automatique du théorème. L'astuce consiste alors à inclure un nombre suffisant d'axiomes dans votre moteur pour pouvoir le déduire efficacement par un raisonnement automatisé (think PROLOG). Si je devais concevoir une telle chose, la propriété que vous citez ci-dessus est certainement quelque chose que je coderais comme une relation factuelle / connue plutôt que d'essayer. Par ailleurs, le professeur Paolo Bientinesi de l’Université RWTH d’Aachen. Dans sa thèse, il parle de la dérivation automatique des algorithmes d'algèbre linéaire. Il utilise Mathematica de manière symbolique. aices.rwth-aachen.de:8080/~pauldj
Lagerbaer
1
Je connais le matériel de Paolo et la bibliothèque FLAME. Je ne pense pas que ça puisse faire ça.
Matt Knepley
2
Je conviens que les systèmes de calcul algébrique pour les matrices seraient formidables, mais semblent manquer. J'ai mis une prime pour augmenter les chances d'obtenir une réponse.
Memming

Réponses:

27

Edit: Ceci est maintenant dans 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

Réponse plus ancienne qui montre un autre travail

Donc, après avoir examiné cela pendant un moment, voici ce que j'ai trouvé.

La réponse actuelle à ma question spécifique est "Non, aucun système actuel ne peut répondre à cette question". Il y a cependant quelques petites choses qui semblent se rapprocher.

Matt Knepley et Lagerbaer ont tout d’abord évoqué les travaux de Diego Fabregat et Paolo Bientinesi . Ce travail montre à la fois l’importance potentielle et la faisabilité de ce problème. C'est une bonne lecture. Malheureusement, je ne sais pas exactement comment son système fonctionne ni de quoi il est capable (si quelqu'un connaît d'autres documents publics sur ce sujet, faites-le-moi savoir).

Deuxièmement, il existe une bibliothèque d'algèbre de tenseurs écrite pour Mathematica appelée xAct, qui traite les symétries et symboliquement. Il fait certaines choses très bien mais n'est pas adapté au cas particulier de l'algèbre linéaire.

Troisièmement, ces règles sont formellement écrites dans quelques bibliothèques pour Coq , un assistant de démonstration de théorèmes automatisé (recherche Google pour l’algèbre matricielle linéaire / matricielle pour en trouver quelques-unes). C'est un système puissant qui semble malheureusement nécessiter une interaction humaine.

Après avoir discuté avec des gens qui ont prouvé leur théorie, ils suggèrent de se pencher sur la programmation logique (c'est-à-dire Prolog, que Lagerbaer a également suggéré) pour ce genre de chose. À ma connaissance, cela n’a pas encore été fait - il est possible que je joue avec dans le futur.

Mise à jour: j'ai implémenté cela en utilisant le système Maude . Mon code est hébergé sur github

MRocklin
la source
1
Quand j'ai découvert qu'il n'y avait pas de bon système, mon premier réflexe a été d'écrire un programme de prologue. :)
Memming
1
J'ai ajouté un lien en bas à un de mes projets annexes traitant de ce problème.
MRocklin
Peut-on en SymPydéduire une simplification de la multiplication et de l'inversion de la matrice?
Royi il y a
4

Certains calculs de matrice symbolique (par exemple, l'achèvement de la matrice de blocs) peuvent être effectués avec le package NCAlgebra http://www.math.ucsd.edu/~ncalg/ (qui fonctionne sous mathematica).

Bergman http://servus.math.su.se/bergman/ est un paquet dans Lisp avec des capacités similaires.

Quelques articles pertinents:
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
la source
3

Je pense que la plupart des CASsystèmes peuvent montrer cela pour 2x2et les 3x3matrices étant donné une construction symbolique orthonormale , telle que les matrices de rotation. En fin de compte, vous devrez décomposer le résultat pour déterminer s'il est positif défini ou non. La symétrie est plus facile à montrer.B

La question devient alors, qu'en est-il d'une Nmatrice dimensionnelle? Vous pouvez peut-être imaginer un schéma inductif dans lequel for N-1 x N-1est supposé être vrai, puis construire une nouvelle matrice de blocs avec une taille globale N x Npour prouver que cela est positif et symétrique.

Donc, la dernière question, de savoir quel logiciel convient le mieux à la tâche (le cas échéant), mon expérience a été avec MATLAB/MuPadet Derive(continue de l’utiliser) et aucun d’eux ne gère très bien les vecteurs et les matrices. MATLABdécompose tout en composants et Derivepeut déclarer Non-scalarsmais il ne leur applique aucune règle de simplification.

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

ja72
la source
2

Cela fait longtemps que je n'ai utilisé aucun de ces packages, mais je pensais que vous pouviez le faire dans des langages tels que Mathematica en utilisant des assertions. Quelque chose comme Assert [A, Symétrique] indique à Mathematica que A est une matrice symétrique, etc. Je n'ai accès à aucun des deux pour le moment, c'est donc quelque chose qui devrait être vérifié.

aeismail
la source
1
Je pense que vous voulez parler de la commande Mathematica Assumingau lieu de Assert. Assumingappliquera ces hypothèses lors de la simplification ou de l'intégration d'une expression, mais la documentation ne précise pas si les propriétés de la matrice sont propagées. Je suppose que de telles propriétés ne sont pas portées par des calculs symboliques.
Geoff Oxberry
Cela pourrait être vrai. Comme je l'ai dit, c'était il y a bien longtemps (à l'époque de mes études supérieures). Mais je me souviens de pouvoir faire quelque chose comme ça une fois. (Peut-être que c'était avec MuPad, tel qu'il a été implémenté dans Scientific WorkPlace.) Mais je n'ai plus accès à SWP pour vérifier cela (uniquement sous Windows et je n'ai pas d'émulateur sur ma boîte).
aeismail
MuPAD fait maintenant partie de Matlab. Selon la documentation , l'utilisation des hypothèses est similaire à celle de Mathematica.
Geoff Oxberry
MuPAD ne peut traiter que des matrices de taille fixe, et ne prend pas d'hypothèses arbitraires telles que la définition positive. En outre, il ne peut pas répondre à la question de la définition positive de BAB 'initialement posée.
Memming
@Memming: Assez bien. Comme je l'ai dit, ma mémoire sur MuPAD était en grande partie obsolète, car j'avais utilisé ce programme régulièrement vers 2006 (lorsque je suis passé d'un PC à un Mac).
aeismail
2

Maple 15 ne peut pas le faire. Il n'a pas de propriété "Orthogonal" pour les matrices (bien qu'il ait Symmetric et PositiveDefinite).

GertVdE
la source
1
Mis à jour en Maple 16 -> pas de propriété "Orthogonal" non plus.
GertVdE
1

Dans Mathematica, vous pouvez au moins vérifier ces propriétés pour des matrices spécifiques. Par exemple, la matrice Atelle que vous l'avez décrite:

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}

Pour la 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

Ensuite:

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

Documentation sur les matrices Mathematica et l'algèbre linéaire

Lynchs
la source
7
Je crois comprendre que les prédicats ci-dessus vérifient cette propriété pour une matrice donnée, plutôt que de les propager symboliquement comme Matt le demande plus haut.
Matt Knepley
Ah oui. Désolé pour ça. J'ai mal compris.
Lynchs