Quero resolver onde K é minha matriz de rigidez. No entanto, algumas restrições podem estar ausentes e, portanto, algum movimento corporal rígido ainda pode estar presente no sistema (devido ao valor próprio zero). Como estou usando o CG para resolver o sistema linear, isso não é aceitável, já que às vezes o CG não converge em problemas semi-positivos (mas às vezes posso convergir).
Na verdade, estou usando uma abordagem de deslocamento penalizado no sentido de adicionar uma penalidade no formulário para a energia elástica. Então a energia lê W ( u ) : = 1ondeα étomado como proporcional a alguma entrada diagonal da matriz de rigidez. Mas, na verdade, isso tem o efeito de amortecer algum modo de deformação que eu gostaria de ter em algum momento.
Alguma pergunta é minha:
a) eu poderia transformar o sistema original de modo a torná-lo livre de singularidade e definitivo positivo (como transformação de coordenadas ou transformação de congruência ou qualquer outra coisa)? Minha idéia é usar essa transformação para ainda usar CG no problema transformado
b) Existe alguma maneira padrão de lidar com essas singularidades?
Muito obrigado !
Atenciosamente,
Tom
Se você conhece o espaço nulo, é possível compatibilizar o lado direito e fazer com que o método Krylov impeça o pré-condicionador de causar poluição, consulte Por que fixar um ponto para remover um espaço nulo com defeito? para uma discussão mais aprofundada. No PETSc, isso é feito usando o
MatNullSpace
objeto Observe que você pode fornecer sua própria função para projetar o espaço nulo, o que seria útil para reduzir o custo de projeção quando você tiver muitas estruturas flutuantes.Se você não conhece o espaço nulo e não pode evitar um lado direito incompatível, existem métodos Krylov especializados, como o MINRES-QLP, que podem encontrar a solução de norma mínima. Essa abordagem pode ser útil se você tiver dobradiças e conexões de ponto único que apenas acoplam alguns modos. Observe que você ainda deve ter cuidado com o pré-condicionador que está causando poluição (por exemplo, devido à fatoração da LU encontrar zero pivôs, talvez em um nível aproximado de multigrid).
fonte
MatSetNullSpace()