sustitucion sistemas sistema regla para metodo lineales igualacion ecuaciones cramer como 3x3 2x2 c++ matrix linear-algebra eigen

c++ - sistemas - sistema de ecuaciones lineales 2x2 metodo de sustitucion



La forma más eficiente de resolver un sistema de ecuaciones lineales. (1)

Tengo una matriz simétrica (nxn) A y un vector n (nx 1). Básicamente, solo necesito resolver Ax = b para x. El problema es que A va a ser potencialmente masivo. Así que estoy buscando el algoritmo más eficiente para resolver ecuaciones lineales en C ++. Miré por encima de la biblioteca Eigen. Aparentemente tiene un método SVD, pero me han dicho que es lento. Resolver x = inverso (A) * b también parece que sería subóptimo. ¿Es uBLAS más rápido? ¿Hay métodos más eficientes? Gracias.

Edición: la matriz A es positiva definida y no dispersa.


La mejor manera de resolver un sistema de ecuaciones lineales de la forma Ax = b es hacer lo siguiente.

  • descomponer A en el formato A = M1 * M2 (donde M1 y M2 son triangulares)
  • Resuelve M1 * y = b para y usando la sustitución por retroceso
  • Resuelve M2 * x = y para x usando la sustitución hacia atrás

Para matrices cuadradas , el paso 1 usaría la descomposición de LU .

Para matrices no cuadradas , el paso 1 usaría la descomposición QR .

Si la matriz A es positiva definida y no es dispersa , utilizaría la descomposición de Cholesky para el primer paso.

Si desea utilizar eigen, primero deberá descomponerlo y luego resolverlo de forma triangular .

Si esto sigue siendo lento, afortunadamente, hay numerosas bibliotecas de álgebra lineal disponibles que pueden ayudar a mejorar el rendimiento. La rutina que debes buscar es dpotrs . Algunas bibliotecas que tienen esto implementado son las siguientes:

Si está utilizando eigen en el proyecto general, puede interactuar con la rutina LAPACK que necesita como se describe here .