LinAlgError: Laatste 2 dimensies van de array moeten vierkant zijn

Ik moet een reeks gelijktijdige vergelijkingen van de vorm Ax = Bvoor x oplossen. Ik heb de numpy.linalg.solve-functie gebruikt door A en B in te voeren, maar ik krijg de foutmelding ‘LinAlgError: Laatste 2 dimensies van de array moeten vierkant zijn’. Hoe los ik dit op?

Hier is mijn 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)

De waarden van de matrix/vector worden eerder in de code berekend en dit werkt prima, maar de waarden zijn:

A=

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

B=

(-0.38038602567630364, -24.092279373295057, 0.0)

x moet de vorm (x1,x2,0) hebben


Antwoord 1, autoriteit 100%

Als je nog steeds geen antwoord hebt gevonden, of als iemand in de toekomst deze vraag heeft.

Om Ax=bop te lossen:

numpy.linalg.solve gebruikt LAPACK gesv. Zoals vermeld in de documentatie van LAPACK, vereist gesv Avierkant zijn:

LA_GESV berekent de oplossing van een reëel of complex lineair stelsel vergelijkingen AX = B, waarbij A een vierkante matrix is ​​en X en B rechthoekige matrices of vectoren zijn. Gauss-eliminatie met rij-uitwisselingen wordt gebruikt om A te ontbinden als A = PL*U , waarbij P een permutatiematrix is, L de onderste driehoek van de eenheid is en U de bovenste driehoek is. De ontbonden vorm van A wordt dan gebruikt om het bovenstaande systeem op te lossen.

Als Amatrix niet vierkant is, betekent dit dat je ofwel meer variabelen hebt dan je vergelijkingen, of andersom. In deze situaties kunt u de gevallen hebben van geen oplossing of een oneindig aantal oplossingen. Wat de oplossingsruimte bepaalt, is de rangorde van de matrix in vergelijking met het aantal kolommen. Daarom moet u eerst de rangorde van de matrix controleren.

Dat gezegd hebbende, kun je een andere methode gebruiken om je stelsel lineaire vergelijkingen op te lossen. Ik stel voor om factorisatiemethoden zoals LU of QR of zelfs SVD te bekijken. In LAPACK kun je getrsgebruiken, in Python kun je verschillende dingen:

  • voer eerst de factorisatie uit zoals QR en voer vervolgens de resulterende matrices in met een methode zoals scipy.linalg.solve_triangular
  • los de kleinste kwadraten op met numpy.linalg.lstsq

Kijk ook eens hierwaar een eenvoudig voorbeeld wordt geformuleerd en opgelost.


Antwoord 2, autoriteit 10%

Een vierkante matrix is ​​een matrix met hetzelfde aantal rijen en kolommen. De matrix die je maakt is een 3 bij 2. Voeg een kolom met nullen toe om dit probleem op te lossen.

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Other episodes