Pretendo resolver Ax = b onde A é uma matriz quadrada ou retangular complexa, esparsa, assimétrica e altamente mal condicionada (número de condição ~ 1E + 20). Consegui resolver o sistema com o ZGELSS no LAPACK com precisão. Mas, à medida que os graus de liberdade no meu sistema aumentam, leva muito tempo para resolver o sistema em um PC com ZGELSS, pois a dispersão não é explorada. Recentemente, tentei o SuperLU (usando o armazenamento da Harwell-Boeing) para o mesmo sistema, mas os resultados foram imprecisos para o número da condição> 1E + 12 (não tenho certeza se esse é um problema numérico com a rotação).
Estou mais inclinado a usar solucionadores já desenvolvidos. Existe um solucionador robusto que possa resolver o sistema que mencionei rapidamente (ou seja, explorar a escarsidade) e de forma confiável (em vista dos números de condição)?
__float128
Respostas:
Ao usar o ZGELSS para resolver esse problema, você está usando a decomposição de valor singular truncado para regularizar esse problema extremamente mal condicionado. é importante entender que essa rotina da biblioteca não está tentando encontrar uma solução de mínimos quadrados para , mas está tentando equilibrar a localização de uma solução que minimizecontra minimizar.Ax=b ∥x∥ ∥Ax−b∥
Observe que o parâmetro RCOND passado para o ZGELSS pode ser usado para especificar quais valores singulares devem ser incluídos e excluídos do cálculo da solução. Qualquer valor singular menor que RCOND * S (1) (S (1) é o maior valor singular) será ignorado. Você não nos contou como definiu o parâmetro RCOND no ZGELSS, e não falamos nada sobre o nível de ruído dos coeficientes na matriz ou no lado direito , por isso é difícil dizer se você usou uma quantidade adequada de regularização.A b
Você parece estar satisfeito com as soluções regularizadas que está obtendo com o ZGELSS, portanto parece que a regularização efetuada pelo método SVD truncado (que encontra uma solução mínima entre as soluções de mínimos quadrados que minimizam no espaço de soluções abrangidas pelos vetores singulares associados aos valores singulares maiores que RCOND * S (1)) é satisfatório para você.∥x∥ ∥Ax−b∥
Sua pergunta pode ser reformulada como "Como posso obter eficientemente soluções de mínimos quadrados regularizados para esse problema de mínimos quadrados lineares grandes, esparsos e muito mal condicionados?"
Minha recomendação seria usar um método iterativo (como CGLS ou LSQR) para minimizar o problema de mínimos quadrados explicitamente regularizado
onde o parâmetro de regularização é ajustado para que o problema de mínimos quadrados com amortecimento seja bem condicionado e para que você fique satisfeito com as soluções regularizadas resultantes.α
fonte
Jed Brown já apontou isso nos comentários da pergunta, mas realmente não há muito o que você possa fazer com precisão dupla usual se o número de sua condição for grande: na maioria dos casos, você provavelmente não terá um único dígito de precisão em sua solução e, pior, você nem sabe dizer porque não pode avaliar com precisão o resíduo correspondente ao seu vetor de solução. Em outras palavras: não é uma questão de qual solucionador linear você deve escolher - nenhum solucionador linear pode fazer algo útil para essas matrizes.
fonte
A maneira mais simples / rápida de resolver problemas mal condicionados é aumentar a precisão dos cálculos (por força bruta). Outra maneira (ainda nem sempre possível) é reformular seu problema.
Pode ser necessário usar a precisão quádrupla (34 dígitos decimais). Mesmo que 20 dígitos sejam perdidos em um percurso (devido ao número da condição), você ainda terá 14 dígitos corretos.
Se isso for de seu interesse, agora os resolvedores esparsos de precisão quádrupla também estão disponíveis no MATLAB.
(Eu sou o autor da caixa de ferramentas mencionada).
fonte