Resolvendo um sistema linear com argumentos de matriz


10

Todos conhecemos os muitos métodos computacionais para resolver o sistema linear padrão

Ax=b.
No entanto, estou curioso para saber se existem métodos computacionais "padrão" para resolver um sistema linear mais geral (dimensão finita) da forma

LA=B,
onde, digamos,A é umamatrizm1×n1 ,B é umamatrizm2×n2 eL é um operador linear que levam1×n1 matrizes param2×n2 matrizes, o quenão envolve a vetorização das matrizes, ou seja, a conversão de tudo para o formato padrãoAx=b .

A razão pela qual pergunto é que preciso resolver a seguinte equação para u :

(RR+λI)u=f
ondeR é a 2d transformada de radônio,R é adjacente eu ef são 2d matrizes (imagens). É possível vetorizar essa equação, mas é uma dor, especialmente se formos para o 3D.

De um modo mais geral, e as matrizes nD ? Por exemplo, resolver LA=B onde A e B são matrizes 3D (também precisarei fazer isso com a transformação Radon em algum momento).

Agradecemos antecipadamente e sinta-se à vontade para me enviar para outro StackExchange, se achar necessário.


11
Você pode criar um pré-condicionador multinível eficaz e depois usar gradiente conjugado. Eu tenho um problema semelhante, onde isso é bastante eficaz e muito paralelizável. Se você quiser métodos diretos, considerar reduções forma schur como neste trabalho sobre a equação de Lyapunov: cs.cornell.edu/cv/ResearchPDF/Hessenberg.Schur.Method.pdf
Nick Alger

Excelente, obrigado pela ref! Acabei de fazer o CG funcionar efetivamente, então estou feliz.
usar o seguinte código

Respostas:


9

Rny,xRe(yHx)

Uma coisa que você deve ter cuidado ao implementar o CG (ou abordagens iterativas semelhantes) com operadores lineares gerais é implementar corretamente o acessório do seu operador linear. Ou seja, as pessoas geralmente acertam , mas cometem um erro ao implementar .z = F ( y )y=F(x)z=F(y)

Eu recomendo implementar um teste simples que aproveite a seguinte identidade: para qualquer e conformidade , Portanto, o que você faz é gerar valores aleatórios de e , executá-los através de suas operações avançadas e adjuntas, respectivamente, e calcular os dois produtos internos acima. Verifique se eles correspondem à precisão razoável e repita algumas vezes.y y , F ( x ) = F * ( y ) , x . x yxy

y,F(x)=F(y),x.
xy

EDIT: o que você faz se o seu operador linear é simétrico? Bem, você também precisa verificar essa simetria. Portanto, use o mesmo teste, apenas observando que --- aplica a mesma operação a e . Obviamente, o OP possui um operador assimétrico e um simétrico para lidar com ... x yF=Fxy


Obrigado @ChristianClason! Sei por experiência própria como os erros frustrantes nos cálculos adjuntos podem ser. :) Em nosso pacote TFOCS, implementamos uma linop_test.mrotina por esse motivo. Esse pacote também suporta matrizes, matrizes e produtos cartesianos em espaços vetoriais.
Michael Grant

3

Como se vê, porque meu sistema é simétrico e definido positivamente (como meu operador linear é escrito como ), o gradiente conjugado pode ser adaptado para resolver iterativamente esse tipo de equação. A única modificação ocorre ao calcular produtos internos - ou seja, um cálculo típico de produto interno no CG se parece com ou . Na versão modificada, usamos o produto interno Frobenius, que pode ser calculado somando as entradas do produto Hadamard (pointwise). Ou seja,r T k r k p T k A p kRR+λIrkTrkpkTApk

A,B=i,jAijBij

Eu suspeito que isso funcionará perfeitamente quando eu atualizar para matrizes 3D, embora ainda não tenha visto o produto interno Frobenius definido em matrizes 3D (trabalharei com a premissa de que posso somar novamente o produto pontual).

Eu ainda estaria interessado em métodos mais gerais, se alguém souber de algum!

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.