J'utilise MATLAB pour résoudre un problème qui implique de résoudre à chaque pas de temps, où change avec le temps. En ce moment, j'accomplis ceci en utilisant MATLAB :bmldivide
x = A\b
J'ai la flexibilité de faire autant de précalculs que nécessaire, donc je me demande s'il existe une méthode plus rapide et / ou plus précise que mldivide
. Que fait-on généralement ici? Merci a tous!
Réponses:
La chose la plus évidente que vous pouvez faire est de précalculer
[L,U] = lu(A)
~ O (n ^ 3)Ensuite, vous calculez
x = U \ (L \ b)
~ O (2 n ^ 2)Cela réduirait considérablement le coût et le rendrait plus rapide. La précision serait la même.
la source
L\b
. Parce que j'ai vu cette ligne exacte utilisée dans le code haute performance par ceux que je considère comme des experts.[L,U,p] = lu(A,'vector'); x = U\(L\b(p));
voir l'exemple 3 dans lalu
documentation .Nous avons fait de nombreux laboratoires informatiques dans nos cours de calcul scientifique sur ce sujet. Pour les "petits" calculs que nous y avons faits, l'opérateur de barre oblique inverse de Matlab était toujours plus rapide que toute autre chose, même après avoir optimisé notre code autant que possible et réorganisé toutes les matrices au préalable (par exemple avec Reverse Cuthill McKee commandant des matrices clairsemées) .
Vous pouvez consulter l'une de nos instructions de laboratoire . La réponse à votre question est couverte (sous peu) à la page 4.
Un bon livre sur le sujet est écrit par exemple par Cheney .
la source
inv(A)
V*b
Quelques notes
Pour la stabilité et l'analyse des erreurs, veuillez consulter les commentaires de cette réponse différente , en particulier celle de VictorLiu.
La synchronisation a été effectuée avec Matlab R2011b sur un ordinateur à 12 cœurs avec une moyenne de charge UNIX assez constante de 5; meilleur
tic, toc
temps de trois sondes.la source
inv(A)
A\B
Jetez un œil à cette question , les réponses montrent qu'elle
mldivide
est assez intelligente et donne également des suggestions sur la façon de voir ce que Matlab utilise pour résoudreA\b
. Cela peut vous donner un indice concernant les options d'optimisation.la source
L'utilisation de la barre oblique inverse est plus ou moins équivalente à
inv(A)*B
, si vous la codez librement, cette dernière pourrait être plus intuitive. Ils sont à peu près les mêmes (juste différents dans la façon dont le calcul est effectué), bien que vous devriez vérifier la documentation de Matlab pour des éclaircissements.Pour répondre à votre question, la barre oblique inverse est généralement correcte, mais elle dépend des propriétés de la matrice de masse.
la source
inv(A)
puisque cela seul est plus cher queA\b
?