Estoy usando MATLAB para resolver un problema que implica resolver en cada paso de tiempo, donde cambia con el tiempo. En este momento, estoy logrando esto usando MATLAB :bmldivide
x = A\b
Tengo la flexibilidad de hacer tantas calculaciones previas como sea necesario, por lo que me pregunto si existe un método más rápido y / o más preciso que mldivide
. ¿Qué se hace típicamente aquí? ¡Gracias a todos!
Respuestas:
Lo más obvio que puede hacer es precalcular
[L,U] = lu(A)
~ O (n ^ 3)Entonces solo calculas
x = U \ (L \ b)
~ O (2 n ^ 2)Esto reduciría enormemente el costo y lo haría más rápido. La precisión sería la misma.
fuente
L\b
. Porque he visto esta línea exacta siendo utilizada en código de alto rendimiento por aquellos que considero expertos.[L,U,p] = lu(A,'vector'); x = U\(L\b(p));
ver el ejemplo 3 en loslu
documentos .Hicimos algunos laboratorios de computación extensivos en nuestros cursos de computación científica sobre este tema. Para los cálculos "pequeños" que hicimos allí, el operador de barra invertida de Matlab siempre fue más rápido que cualquier otra cosa, incluso después de haber optimizado nuestro código tanto como sea posible y haber reordenado todas las matrices de antemano (por ejemplo, con Reverse Cuthill McKee ordenando matrices dispersas) .
Puede consultar una de nuestras instrucciones de laboratorio . La respuesta a su pregunta se trata (en breve) en la página 4.
Un buen libro sobre el tema está escrito, por ejemplo, por Cheney .
fuente
inv(A)
V*b
Algunas notas
Para un análisis de estabilidad y error, vea los comentarios a esta respuesta diferente , especialmente la de VictorLiu.
La sincronización se realizó con Matlab R2011b en una computadora de 12 núcleos con un promedio de carga UNIX bastante constante de 5; El mejor
tic, toc
momento de tres sondas.fuente
inv(A)
A\B
Eche un vistazo a esta pregunta , las respuestas muestran que
mldivide
es bastante inteligente y también ofrece sugerencias sobre cómo ver qué utiliza Matlab para resolverA\b
. Esto puede darle una pista sobre las opciones de optimización.fuente
El uso de la barra diagonal inversa es más o menos equivalente a
inv(A)*B
, si lo está codificando libremente, este último podría ser más intuitivo. Son casi iguales (solo diferentes en cómo se lleva a cabo el cálculo), aunque debe consultar la documentación de Matlab para obtener aclaraciones.Para responder a su pregunta, la barra invertida generalmente está bien, pero depende de las propiedades de la matriz de masa.
fuente
inv(A)
ya que solo eso es más caro queA\b
?