Necesito resolver un conjunto de ecuaciones simultáneas de la forma A x = B para x. He usado la función numpy.linalg.solve, ingresando A y B, pero aparece el error 'LinAlgError: las últimas 2 dimensiones de la matriz deben ser cuadradas'. ¿Cómo puedo solucionar esto?
Aquí está mi código:
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)Los valores de la matriz/vector se calculan anteriormente en el código y esto funciona bien, pero los valores son:
un =
(-0.56666301, -0.52472909) (0.44034147, 0.46768087) (0.69641397, 0.71129036)B =
(-0.38038602567630364, -24.092279373295057, 0.0)x debe tener la forma (x1,x2,0)
En caso de que aún no haya encontrado una respuesta, o en caso de que alguien en el futuro tenga esta pregunta.
Para resolver Ax=b :
numpy.linalg.solve utiliza LAPACK gesv. Como se menciona en la documentación de LAPACK , gesv requiere que A sea cuadrada:
LA_GESV calcula la solución de un sistema lineal complejo o real de ecuaciones A X = B, donde A es una matriz cuadrada y X y B son matrices rectangulares o vectores. La eliminación gaussiana con intercambios de filas se usa para factorizar A como A = P L*U , donde P es una matriz de permutación, L es la unidad triangular inferior y U es la triangular superior. Luego se usa la forma factorizada de A para resolver el sistema anterior.
Si una matriz no es cuadrada, significa que tiene más variables que sus ecuaciones o al revés. En estas situaciones, puede tener los casos de ninguna solución o un número infinito de soluciones. Lo que determina el espacio de solución es el rango de la matriz en comparación con el número de columnas. Por lo tanto, primero debe verificar el rango de la matriz.
Dicho esto, puedes usar otro método para resolver tu sistema de ecuaciones lineales. Sugiero echar un vistazo a los métodos de factorización como LU o QR o incluso SVD. En LAPACK puedes usar getrs , en Python puedes hacer diferentes cosas:
scipy.linalg.solve_triangularnumpy.linalg.lstsqTambién eche un vistazo aquí donde se formula y resuelve un ejemplo simple.
Una matriz cuadrada es una matriz con el mismo número de filas y columnas. La matriz que está haciendo es de 3 por 2. Agregue una columna de ceros para solucionar este problema.