Estou usando o MATLAB para resolver um problema que envolve resolver a cada passo do tempo, em que b muda com o tempo. No momento, estou conseguindo isso usando o MATLAB :mldivide
x = A\b
Eu tenho a flexibilidade de fazer quantas pré-computações forem necessárias, por isso estou me perguntando se existe um método mais rápido e / ou mais preciso do que isso mldivide
. O que normalmente é feito aqui? Obrigado a todos!
Respostas:
A coisa mais óbvia que você pode fazer é pré-calcular
[L,U] = lu(A)
~ O (n ^ 3)Então você apenas calcula
x = U \ (L \ b)
~ O (2 n ^ 2)Isso reduziria enormemente o custo e o tornaria mais rápido. A precisão seria a mesma.
fonte
L\b
. Porque vi essa linha exata sendo usada no código de alto desempenho por aqueles que considero especialistas.[L,U,p] = lu(A,'vector'); x = U\(L\b(p));
Ver o exemplo 3 noslu
documentos .Realizamos alguns laboratórios de informática extensivos em nossos cursos de computação científica sobre esse tópico. Para os cálculos "pequenos" que fizemos lá, o operador de barra invertida do Matlab sempre foi mais rápido do que qualquer outra coisa, mesmo depois de otimizarmos nosso código o máximo possível e reorganizarmos todas as matrizes de antemão (por exemplo, com Reverse Cuthill McKee solicitando matrizes esparsas) .
Você pode conferir uma de nossas instruções de laboratório . A resposta à sua pergunta é abordada (em breve) na página 4.
Um bom livro sobre o assunto foi escrito, por exemplo, por Cheney .
fonte
inv(A)
V*b
Algumas notas
Para análise de estabilidade e erro, consulte os comentários a essa resposta diferente , especialmente a de VictorLiu.
O tempo foi realizado com o Matlab R2011b em um computador de 12 núcleos com uma média de carga UNIX razoavelmente constante de 5; melhor
tic, toc
horário de três sondas.fonte
inv(A)
A\B
Dê uma olhada nesta pergunta , as respostas mostram que
mldivide
é bastante inteligente e também oferece sugestões sobre como ver o que o Matlab usa para resolverA\b
. Isso pode lhe dar uma dica sobre as opções de otimização.fonte
O uso da barra invertida é mais ou menos equivalente a
inv(A)*B
, se você o estiver codificando livremente, o último pode ser mais intuitivo. Eles são praticamente os mesmos (apenas diferentes na maneira como a computação é realizada), embora você deva verificar a documentação do Matlab para obter esclarecimentos.Para responder sua pergunta, a barra invertida geralmente é boa, mas depende das propriedades da matriz de massa.
fonte
inv(A)
uma vez que só isso é mais caro do queA\b
?