web-dev-qa-db-fra.com

LinAlgError: les 2 dernières dimensions du tableau doivent être carrées

J'ai besoin de résoudre un ensemble d'équations simultanées de la forme A x = B pour x. J'ai utilisé la fonction numpy.linalg.solve, en saisissant A et B, mais j'obtiens l'erreur "LinAlgError: les 2 dernières dimensions du tableau doivent être carrées". Comment puis-je réparer ça?

Voici mon code:

A = matrix([[v1x, v2x], [v1y, v2y], [v1z, v2z]])
print A

B = [(p2x-p1x-nmag[0]), (p2y-p1y-nmag[1]), (p2z-p1z-nmag[2])]
print B

x = numpy.linalg.solve(A, B)

Les valeurs de la matrice/vecteur sont calculées plus tôt dans le code et cela fonctionne bien, mais les valeurs sont:

A =

(-0.56666301, -0.52472909)
(0.44034147, 0.46768087)
(0.69641397,  0.71129036)

B =

(-0.38038602567630364, -24.092279373295057, 0.0)

x devrait avoir la forme (x1, x2,0)

7
K Jackson

Si vous n'avez toujours pas trouvé de réponse, ou si quelqu'un à l'avenir a cette question.

Pour résoudre Ax = b:

numpy.linalg.solve utilise LAPACK gesv. Comme mentionné dans la documentation de LAPACK , gesv nécessite [~ # ~] un [~ # ~] pour être carré:

LA_GESV calcule la solution d'un système linéaire réel ou complexe d'équations A X = B, où A est une matrice carrée et X et B sont des matrices ou vecteurs rectangulaires. L'élimination gaussienne avec échange de lignes est utilisée pour factoriser A comme A = P L * U, où P est une matrice de permutation, L est l'unité triangulaire inférieure et U est triangulaire supérieure. La forme factorisée de A est ensuite utilisée pour résoudre le système ci-dessus.

Si [~ # ~] une matrice [~ # ~] n'est pas carrée, cela signifie que vous avez soit plus de variables que vos équations, soit l'inverse environ. Dans ces situations, vous pouvez avoir des cas d'absence de solution ou un nombre infini de solutions. Ce qui détermine l'espace de solution est le rang de la matrice par rapport au nombre de colonnes. Par conséquent, vous devez d'abord vérifier le rang de la matrice.

Cela étant dit, vous pouvez utiliser une autre méthode pour résoudre votre système d'équations linéaires. Je suggère d'avoir un regard sur les méthodes de factorisation comme LU ou QR ou même SVD. Dans LAPACK, vous pouvez utiliser getrs, dans Python vous pouvez différentes choses:

  • faites d'abord la factorisation comme QR puis alimentez les matrices résultantes à une méthode comme scipy.linalg.solve_triangular
  • résoudre les moindres carrés en utilisant numpy.linalg.lstsq

Jetez également un œil ici où un exemple simple est formulé et résolu.

13
Keivan

Une matrice carrée est une matrice avec le même nombre de lignes et de colonnes. La matrice que vous faites est un 3 par 2. Ajoutez une colonne de zéros pour résoudre ce problème.

2
ashish trehan