Ich möchte lösen, wobei meine Steifheitsmatrix ist. Es können jedoch einige Einschränkungen fehlen und daher kann immer noch eine Bewegung des starren Körpers im System vorhanden sein (aufgrund des Eigenwerts Null). Da ich CG zum Lösen des linearen Systems verwende, ist dies nicht akzeptabel, da CG manchmal nicht bei halbpositiven Problemen konvergiert (aber manchmal konvergiert ich).
Eigentlich verwende ich einen Ansatz der bestraften Verschiebung in dem Sinne, dass ich der elastischen Energie eine Strafe der Form hinzufüge . Die Energie lautet also wobei als genommen wird ein proportional zu einem diagonalen Eintrag der Steifheitsmatrix. Aber tatsächlich hat dies den Effekt, einen Verformungsmodus zu dämpfen, den ich manchmal gerne hätte.
Einige meiner Fragen sind:
a) Könnte ich das ursprüngliche System transformieren, um es frei von Singularität und positivem Definitiv zu machen (wie Koordinatentransformation oder Kongruenztransformation oder was auch immer)? Meine Idee ist es, eine solche Transformation zu verwenden, um CG für das transformierte Problem weiterhin zu verwenden
b) Gibt es einen Standardweg, um mit diesen Singularitäten umzugehen?
Vielen Dank !
Mit freundlichen Grüßen,
Tom
Wenn Sie den Nullraum kennen, können Sie die rechte Seite kompatibel machen und die Krylov-Methode verhindern, dass der Vorkonditionierer Verschmutzung verursacht. Siehe Warum ist das Feststecken eines Punkts zum Entfernen eines Nullraums schlecht? zur weiteren Diskussion. In PETSc erfolgt dies mithilfe des
MatNullSpace
Objekts. Beachten Sie, dass Sie Ihre eigene Funktion zum Projizieren des Nullraums bereitstellen können. Dies wäre hilfreich, um die Projektionskosten zu reduzieren, wenn Sie viele schwebende Strukturen haben.Wenn Sie den Nullraum nicht kennen und eine inkompatible rechte Seite nicht vermeiden können, gibt es spezielle Krylov-Methoden wie MINRES-QLP , die trotz allem die minimale Normlösung finden können. Dieser Ansatz kann nützlich sein, wenn Sie Scharniere und Einzelpunktverbindungen haben, die nur einige Modi koppeln. Beachten Sie, dass Sie immer noch vorsichtig mit dem Vorkonditionierer sein müssen, der Verschmutzung verursacht (z. B. aufgrund der LU-Faktorisierung, bei der keine Drehpunkte gefunden werden, möglicherweise auf einem groben Multigrid-Niveau).
quelle
MatSetNullSpace()