Estoy buscando una solución explícita rápida (¿me atrevo a decir que es óptima?) El problema real lineal de 3x3, , .
La matriz es general, pero está cerca de la matriz de identidad con un número de condición cercano a 1. Debido a que son en realidad mediciones de sensores con aproximadamente 5 dígitos de precisión, no me importa perder varios dígitos debido a los valores numéricos cuestiones.
Por supuesto, no es difícil encontrar una solución explícita basada en cualquier número de métodos, pero si hay algo que se ha demostrado que es óptimo en términos de conteo de FLOPS, sería ideal (después de todo, todo el problema probablemente encajará en los registros FP!
(Sí, esta rutina se llama con frecuencia . Ya me he librado de la fruta baja y esta es la siguiente en mi lista de perfiles ...)
fuente
Respuestas:
No se puede superar una fórmula explícita. Puede escribir las fórmulas para la solución en una hoja de papel. Deje que el compilador optimice las cosas por usted. Cualquier otro método tendrá casi inevitablemente sentencias o bucles (por ejemplo, para métodos iterativos) que harán que su código sea más lento que cualquier código de línea recta.x=A−1b
if
for
fuente
Dado que la matriz está tan cerca de la identidad, las siguientes series de Neumann convergerán muy rápidamente:
Dependiendo de la precisión requerida, incluso podría ser lo suficientemente bueno para truncar después de 2 términos:
Esto podría ser un poco más rápido que una fórmula directa (como se sugiere en la respuesta de Wolfgang Bangerth), aunque con mucha menos precisión.
Puede obtener más precisión con 3 términos:
pero si escribe la fórmula de entrada por entrada para , está viendo una cantidad comparable de operaciones de coma flotante como la fórmula inversa directa de matriz 3x3 (no tiene que hacer una división, lo que ayuda un poco).( 3 I- 3 A + A2) b
fuente
Los FLOPS cuentan según las sugerencias anteriores:
LU, sin pivote:
Eliminación gaussiana con sustitución de espalda, sin pivote:
La regla de Cramer a través de la expansión del cofactor
Inverso explícito y luego multiplica:
Prueba de conceptos de MATLAB:
Regla de Cramer a través de la expansión de cofactor :
LU (sin pivote) y sustitución posterior:
Inverso explícito y luego multiplicar:
Eliminación gaussiana:
Nota: No dude en agregar sus propios métodos y recuentos a esta publicación.
fuente
Probablemente la regla de Cramer. Si puede evitar pivotar, quizás factorización LU; Es una matriz de 3x3, por lo que desenrollar los bucles manualmente sería fácil. Cualquier otra cosa probablemente implique ramificación, y dudo que un método de subespacio de Krylov converja con la frecuencia suficiente en 1 o 2 iteraciones para que valga la pena.
fuente