Resolvendo repetidamente


12

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 :Ax=bbmldivide

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!


1
Você tem conhecimento específico sobre a estrutura de ? Por exemplo, é simétrico? Positivo definitivo? Tridiagonal? Ortogonal? A
Dominique

A matriz é uma matriz quadrada densa. A
Dúvida

3
Se você não tem outro conhecimento sobre , a fatoração L U, conforme descrito na resposta abaixo, é sua melhor aposta. ALU
Dominique

Respostas:


14

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.


1
Observe que, a partir da documentação , L não é necessariamente triangular inferior. Essa resposta provavelmente seria mais rápida do que uma solução direta, no entanto, eu seria cuidadoso em garantir que o comando L \ b seja inteligente o suficiente para saber resolver L na ordem correta (provavelmente é, mas não diz com certeza na documentação).
Godric Seer

Sim, você está certo, L é o produto de uma matriz triangular inferior e de uma matriz de permutação. Mas serei amaldiçoado se não reconhecer que tudo o que tem a fazer é fazer uma substituição para trás L\b. Porque vi essa linha exata sendo usada no código de alto desempenho por aqueles que considero especialistas.
precisa

8
O(n2)

1
A

3
@BrianBorcher Até onde eu sei, a melhor maneira de acompanhar a permutação é [L,U,p] = lu(A,'vector'); x = U\(L\b(p));Ver o exemplo 3 nos lu documentos .
18713 Stefano M

5

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 .


4

An×n Axi=bii=1mm

V = inv(A);
...
x = V*b;

O(n3)inv(A)O(n2)V*bm

>> n = 5000;
>> A = randn(n,n);
>> x = randn(n,1);
>> b = A*x;
>> rcond(A)
ans =
   1.3837e-06
>> tic, xm = A\b; toc
Elapsed time is 1.907102 seconds.
>> tic, [L,U] = lu(A); toc
Elapsed time is 1.818247 seconds.
>> tic, xl = U\(L\b); toc
Elapsed time is 0.399051 seconds.
>> tic, [L,U,p] = lu(A,'vector'); toc
Elapsed time is 1.581756 seconds.
>> tic, xp = U\(L\b(p)); toc
Elapsed time is 0.060203 seconds.
>> tic, V=inv(A); toc
Elapsed time is 7.614582 seconds.
>> tic, xv = V*b; toc     
Elapsed time is 0.011499 seconds.
>> [norm(xm-x), norm(xp-x), norm(xl-x), norm(xv-x)] ./ norm(x)
ans =
   1.0e-11 *
    0.1912    0.1912    0.1912    0.6183

A1LUm>125

Algumas notas

Para análise de estabilidade e erro, consulte os comentários a essa resposta diferente , especialmente a de VictorLiu.

mn

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, tochorário de três sondas.


De fato, há muito mais paralelismo disponível em uma multiplicação de vetores matriciais do que em um solucionador triangular, portanto isso deve ser ainda mais aparente se os cálculos forem feitos em paralelo (multicore / GPU / etc ...) de qualquer forma.
Aron Ahmadia

@AronAhmadia Concordo: estimativas de ponto de equilíbrio baseadas apenas na contagem de operações fazem sentido apenas para uma implementação serial.
18713 Stefano M

1
Observe que as coisas serão muito diferentes se a matriz A for esparsa - o inverso será tipicamente bastante denso, enquanto os fatores de LU são normalmente razoavelmente esparsos, fazendo com que as coisas voltem na direção da LU sendo mais rápida.
22413 Brian Borchers

1
A

1
inv(A)Ax=bbBA\B

2

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 resolver A\b. Isso pode lhe dar uma dica sobre as opções de otimização.


0

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.


1
Matematicamente inv (A) * b é o mesmo que \ no entanto, numericamente, na verdade, formar o inverso é menos eficiente e menos preciso. Se você está trabalhando para aprender a álgebra linear, isso pode ser aceitável, mas eu argumentaria que você precisa de um bom motivo para formar o inverso.
Godric Seer

Mas por que você calcularia inv(A)uma vez que só isso é mais caro do que A\b?
Dominique

7
@ Godric: Há um artigo recente que discute o "mito" de que inv (A) * b é menos preciso: no ArXiv . Não estou dizendo que geralmente há razões para calcular o inverso real, mas apenas dizendo.
Victor Liu

3
@ Dominique: As soluções triangulares são muito menos paralelizáveis ​​que a multiplicação de vetores matriciais, e métodos iterativos pré-condicionados sofisticados geralmente usam métodos diretos em subdomínios. Muitas vezes, é útil formar explicitamente as inversas de algumas matrizes triangulares densas de tamanho modesto, a fim de melhorar o paralelismo.
Jack Poulson

@ VictorLiu: Obrigado pelo artigo. Estou corrigido na minha declaração de precisão (pelo menos para implementações inteligentes de inv (A)).
Godric Seer
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.