Je veux résoudre où est ma matrice de rigidité. Cependant, certaines contraintes peuvent manquer et donc un mouvement de corps rigide peut être encore présent dans le système (en raison de la valeur propre zéro). Puisque j'utilise CG pour résoudre le système linéaire, cela n'est pas acceptable car parfois CG ne converge pas sur des problèmes semi-positifs (mais je peux parfois converger).
En fait, j'utilise une approche de déplacement pénalisé dans le sens où j'ajoute une pénalité de la forme à l'énergie élastique. Donc l'énergie lit où \ alpha pris comme une entrée proportionnelle à une diagonale de la matrice de rigidité. Mais en fait, cela a pour effet d'amortir certains modes de déformation que j'aimerais parfois avoir.
Certains ma question est:
a) pourrais-je transformer le système d'origine de façon à le rendre exempt de singularité et de définition positive (comme la transformation de coordonnées ou la transformation de congruence ou autre)? Mon idée est d'utiliser une telle transformation pour continuer à utiliser CG sur le problème transformé
b) Existe-t-il un moyen standard de gérer ces singularités?
Merci beaucoup !
Sincères amitiés,
À M
Si vous connaissez l'espace nul, vous pouvez rendre le côté droit compatible et faire en sorte que la méthode Krylov empêche le préconditionneur de causer de la pollution, voir Pourquoi épingler un point pour supprimer un espace nul est-il mauvais? pour une discussion plus approfondie. Dans PETSc, cela se fait en utilisant l'
MatNullSpace
objet. Notez que vous pouvez fournir votre propre fonction pour projeter l'espace nul, ce qui serait utile pour réduire le coût de projection lorsque vous avez de nombreuses structures flottantes.Si vous ne connaissez pas l'espace nul et ne pouvez pas éviter un côté droit incompatible, il existe des méthodes Krylov spécialisées comme MINRES-QLP qui peuvent malgré tout trouver la solution de norme minimale. Cette approche peut être utile si vous disposez de charnières et de connexions monopoint qui ne couplent que certains modes. Notez que vous devez toujours faire attention au préconditionneur causant la pollution (par exemple, en raison de la factorisation LU qui trouve des pivots zéro, peut-être à un niveau grossier de multigrille).
la source
MatSetNullSpace()