¿Paquetes de software simbólicos para expresiones matriciales?

36

Sabemos que es simétrico y positivo-definido. Sabemos que es ortogonal:BAB

Pregunta: ¿es simétrico y positivo-definido? Respuesta: sí.BAB

Pregunta: ¿Podría una computadora habernos dicho esto? Respuesta: probablemente.

¿Existen sistemas de álgebra simbólica (como Mathematica) que manejan y propagan hechos conocidos sobre matrices?

Editar: Para ser claros, estoy haciendo esta pregunta sobre matrices definidas de forma abstracta. Es decir, no tengo entradas explícitas para y , solo sé que ambas son matrices y tienen atributos particulares como simétrico, positivo definido, etc.BAB

MRocklin
fuente
55
Lo que me falta es un software que trate las matrices simbólicamente (es decir, no como matrices). Me gustaría poder hablar sobre alguna matriz simétrica sin tener que preocuparme por sus entradas. C
JM
66
Hay algunos proyectos trabajando en esto. Estoy familiarizado con la implementación en SymPy. Está lleno de errores pero lentamente se está acumulando.
MRocklin
44
Esto suena como prueba de teorema automatizado. El truco consiste en incluir un conjunto suficiente de axiomas en su motor para que luego pueda deducirse de manera eficiente mediante un razonamiento automatizado (piense en PROLOG). Si tuviera que diseñar algo así, la propiedad que cites arriba es definitivamente algo que codificaría como una relación de hecho / conocido en lugar de intentarlo. Por otro lado, está el profesor Paolo Bientinesi en la Universidad RWTH Aachen. En su disertación habla sobre la derivación automática de algoritmos de álgebra lineal. Él usa Mathematica de manera simbólica. aices.rwth-aachen.de:8080/~pauldj
Lagerbaer
1
Sé las cosas de Paolo y la biblioteca FLAME. No creo que pueda hacer esto.
Matt Knepley
2
Estoy de acuerdo en que los sistemas de álgebra computacional para matrices serían geniales, pero parecen faltar. He puesto una recompensa para aumentar las posibilidades de obtener una respuesta.
Memming

Respuestas:

27

Editar: Esto ahora está en 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

Respuesta anterior que muestra otro trabajo

Entonces, después de analizar esto por un tiempo, esto es lo que he encontrado.

La respuesta actual a mi pregunta específica es "No, no hay un sistema actual que pueda responder esta pregunta". Sin embargo, hay algunas cosas que parecen acercarse.

Primero, Matt Knepley y Lagerbaer señalaron el trabajo de Diego Fabregat y Paolo Bientinesi . Este trabajo muestra tanto la importancia potencial como la viabilidad de este problema. Es una buena lectura. Lamentablemente, no estoy seguro exactamente de cómo funciona su sistema o de lo que es capaz (si alguien sabe de otro material público sobre este tema, hágamelo saber).

En segundo lugar, hay una biblioteca de álgebra tensorial escrita para Mathematica llamada xAct que maneja las simetrías y simbólicamente. Hace algunas cosas muy bien pero no se adapta al caso especial de álgebra lineal.

Tercero, estas reglas están escritas formalmente en un par de bibliotecas para Coq , un asistente de prueba de teorema automatizado (Google busca álgebra lineal / matricial de coq para encontrar algunas). Este es un sistema poderoso que desafortunadamente parece requerir la interacción humana.

Después de hablar con algunas personas probadores de teoremas , sugieren buscar en la programación lógica (es decir, Prolog, que Lagerbaer también sugirió) para este tipo de cosas. Que yo sepa, esto aún no se ha hecho, puedo jugar con él en el futuro.

Actualización: he implementado esto usando el sistema Maude . Mi código está alojado en github

MRocklin
fuente
1
Cuando descubrí que no había un buen sistema, mi primer instinto fue escribir un programa de prólogo. :)
Memming
1
Agregué un enlace en la parte inferior a un proyecto secundario mío que trata este problema.
MRocklin
¿Podría SymPyinferir la simplificación de la multiplicación e inversión de matrices?
Royi hace
4

Algunos cálculos simbólicos de la matriz (p. Ej., Finalización de la matriz de bloques) se pueden hacer con el paquete NCAlgebra http://www.math.ucsd.edu/~ncalg/ (que se ejecuta en matemática).

Bergman http://servus.math.su.se/bergman/ es un paquete en Lisp con capacidades similares.

Algunos documentos relevantes:
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
fuente
3

Creo que la mayoría de los CASsistemas pueden mostrar esto para 2x2y 3x3matrices dada una construcción simbólica ortonormal , como las matrices de rotación. Al final, tendrá que descomponer el resultado para determinar si es positivo definitivo o no. La simetría es más fácil de mostrar.B

La pregunta entonces es, ¿qué pasa con una Nmatriz dimensional? Tal vez pueda llegar a un esquema inductivo donde N-1 x N-1se supone que for es verdadero y luego construir una nueva matriz de bloques con un tamaño general N x Npara demostrar que es positiva, definida y simétrica.

Entonces, la pregunta final, sobre qué software es más adecuado para la tarea (si corresponde), mi experiencia ha sido con MATLAB/MuPady Derive(todavía lo uso) y ninguno de ellos maneja muy bien los vectores y las matrices. MATLABdivide todo en componentes y Derivepuede declarar, Non-scalarspero no les aplica ninguna regla de simplificación.

Espero que esta publicación proporcione más información sobre este tipo de "agujero" y cómo llenarlo. Para mí, quiero un software que pueda ayudarme a simplificar expresiones con múltiples puntos y productos cruzados de vectores, junto con las matrices de rotación usan identidades bien conocidas como:a×(b×c)=(ab)c(ac)b

ja72
fuente
2

Ha pasado un tiempo desde la última vez que usé cualquiera de estos paquetes, pero pensé que podría hacerlo en lenguajes como Mathematica mediante el uso de aserciones. Algo así como Assert [A, Symmetric] le dice a Mathematica que A es una matriz simétrica, y así sucesivamente. No tengo acceso a ninguna de las prácticas en este momento, así que esto es algo que debería verificarse.

aeismail
fuente
1
Creo que te refieres al comando de Mathematica en Assuminglugar de Assert. Assumingaplicará estos supuestos al simplificar o integrar una expresión, pero la documentación no es clara sobre si las propiedades de la matriz se propagan. Supongo que tales propiedades no se llevan a cabo mediante cálculos simbólicos.
Geoff Oxberry
Eso podría ser cierto. Como dije, esto fue hace eones (en mis días de posgrado). Pero sí recuerdo haber podido hacer algo como esto una vez. (Quizás fue con MuPad, como se implementó en Scientific WorkPlace.) Pero ya no tengo acceso a SWP para verificar eso (solo para Windows, y no tengo un emulador en mi caja).
aeismail el
MuPAD es parte de Matlab ahora. Según la documentación , el uso de supuestos es similar al de Mathematica.
Geoff Oxberry
MuPAD solo puede tratar con matrices de tamaño fijo, y no toma supuestos arbitrarios como la definición positiva. Tampoco puede responder a la pregunta de la definición positiva de BAB 'originalmente formulada.
Memming
@Memming: lo suficientemente justo. Como dije, mi memoria de MuPAD estaba sustancialmente desactualizada, ya que la última vez que utilicé el programa regularmente fue en 2006 (cuando cambié de PC a Mac).
aeismail
2

Maple 15 no puede hacerlo. No tiene ninguna propiedad "Ortogonal" para matrices (aunque tiene Symmetric y PositiveDefinite).

GertVdE
fuente
1
Actualizado a Maple 16 -> ninguna propiedad "Ortogonal" tampoco.
GertVdE
1

En Mathematica puede al menos verificar estas propiedades para matrices específicas. Por ejemplo, la matriz Acomo la describiste:

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}

Para matriz 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

Luego:

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

Matrices de Mathematica y Documentación de Álgebra Lineal

linces
fuente
77
Tengo entendido que los predicados anteriores están verificando esa propiedad para una matriz dada, en lugar de propagar simbólicamente estas propiedades como Matt pide anteriormente.
Matt Knepley el
Ah, sí. Lo siento por eso. Entendí mal.
linces