Résolution d'équations simultanées de matrices
Je suis dans une situation précaire où j'ai deux équations:
eq1 = α1 + αt12.t1 + αr11.r1 == 0;
eq2 = γ1 + γt12.t1 + γr11.r1 == 0;
Lorsque chaque variable est une matrice 3x3, les termes gamma et alpha sont des matrices prédéfinies et je dois résoudre pour t1 et r1.
Je sais que je peux prédéfinir r1 et t1 en tant que tableaux
r1 = Array[R, {6, 6}];
t1 = Array[T, {6, 6}];
et utilisez Solve puis ArrayReshape pour obtenir les matrices
Sol = Solve[{eq1, eq2}, Flatten[{r1, t1}]];
r11 = ArrayReshape[r1 /. Sol1, {6, 6}];
t12 = ArrayReshape[t1 /. Sol1, {6, 6}];
Cela me donne la solution correcte mais ne semble pas être la plus efficace en calcul car le temps de résolution augmente considérablement si les dimensions des matrices augmentent ou le nombre d'équations.
Existe-t-il un moyen d'obtenir un ensemble d'opérations matricielles prédéfinies à résoudre pour r1 et t1?
Réponses
Ce n’est pas si simple. Le problème ici est que les matrices ne sont pas commutatives. Vous pouvez définir une algèbre non commutative et écrire un solveur pour cette algèbre. Mais essayons quelque chose de plus simple. Si je suis autorisé à spéculer un peu, nous pouvons essayer de généraliser la méthode «générale» de résolution d'équations linéaires. Dans ce but, supposons que nos variables sont désormais des matrices et que les équations de ces variables sont linéaires.
On a formellement encore: mx = y où m est maintenant une matrice de matrices, x est un vecteur de matrices comme y. Formellement, nous devons rechercher l'inverse gauche de m. Nous pouvons formellement le faire en utilisant MMA. A titre d'exemple, avec 4 matrices carrées e qui créent une "super" matrice m:
m = Array[Subscript[e, #1, #2] &, {2, 2}];
Inverse[m]
Mais notez que nous avons des produits au dénominateur, ce qui peut être faux car le MMA ne fait pas attention à la non commutativité. Il faut donc faire attention à l'ordre, pour ce faire, j'utilise deux noms différents pour les éléments de m: a pour les éléments de la matrice que l'on veut inverser et e pour la matrice d'origine, c'est la même matrice mais on veut pour rendre la commande visible. Les instants inversés que la matrice doit donner la matrice unitaire des matrices:
ma = Array[Subscript[a1, #1, #2] &, {2, 2}];
im = Inverse[ma];
MatrixForm[im.m]
Cela devrait maintenant être la matrice unitaire des matrices. Par conséquent, nous avons les équations suivantes:
N'oubliez pas que 0 est une matrice nulle et 1 est une matrice unitaire et a sont les mêmes éléments que e. D'après les 2 premières équations que nous voyons, e12 (ce qui est la même chose que a12) doit commuter avec e22 et e21 doit commuer avec e11. Sinon, l'inverse n'est pas défini. De plus, l'équation 4. est la question 3. commuée. Cela implique que e11 fait la navette avec e22 et e12 fait la navette avec e21. Et cela indique en outre que le "coef", le déterminant de m, peut être calculé sans problème d'ordre.
Le résultat de ceci est: à condition que les matrices e12 et e22, e21 et e11, e11 et e22, e12 et e21 commutent alors nous pouvons calculer x à partir du dessus en:
où "⊗" signifie que l'expression de gauche (une matrice simple) multiplie chacune des matrices e11, e12, e21, e22 à partir de la gauche.
Pour faire simple, j'utilise des caractères latins au lieu de caractères grecs: a1, at, ar et g1, gt, gr. Notez que ces variables sont désormais des matrices carrées de n'importe quelle dimension. Ensuite, nous pouvons calculer t1 et r1 par la méthode "manuelle" traditionnelle comme (je suppose que les matrices sont inversibles):
Clear[a1, at, ar, g1, gt, gr, t1, r1];
eq1 == a1 + at.t1 + ar. r1 == 0 ;
iar.a1 + Inverse[ar].at.t1 + r1 == 0;
r1 = -Inverse[ar].a1 - Inverse[ar].at.t1;
eq2 == g1 + gt.t1 - gr.Inverse[ar].a1 - gr.Inverse[ar].at.t1 == 0;
(gt - gr.Inverse[ar].at).t1 == -g1 + gr.Inverse[ar].a1;
t1 == Inverse[gt - gr.Inverse[ar].at].(-g1 + gr.Inverse[ar].a1);
r1 == -Inverse[ar].a1 - Inverse[ar].at.t1;