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 formatoA = M1 * M2
(dondeM1
yM2
son triangulares) - Resuelve
M1 * y = b
paray
usando la sustitución por retroceso - Resuelve
M2 * x = y
parax
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:
- La mochila de Netlib: Documentation y Download (gratis)
- MKL de Intel: Documentation y Download (gratis para uso no comercial).
- ACML de AMD: Download (gratis)
- PLASMA: Download (gratuita, multi core optimizada)
- MAGMA: Download (gratuita, implementada en CUDA, OpenCL)
- CULA: Download (freemium, implementado en CUDA).
Si está utilizando eigen en el proyecto general, puede interactuar con la rutina LAPACK que necesita como se describe here .