Я хочу решить где моя матрица жесткости Однако некоторые ограничения могут отсутствовать, поэтому некоторое движение твердого тела может все еще присутствовать в системе (из-за собственного нулевого значения). Поскольку я использую CG для решения линейной системы, это неприемлемо, так как иногда CG не сходится в полуположительных задачах (но иногда я могу сходиться).
На самом деле, я использую наказание смещения в том смысле, что я добавляю штраф в форме к упругой энергии. Таким образом, энергия читает
Некоторые мои вопросы:
а) Могу ли я преобразовать исходную систему, чтобы она была свободной от сингулярности и положительно определенной (такой как преобразование координат или преобразование конгруэнтности или что-то еще)? Моя идея состоит в том, чтобы использовать такое преобразование, чтобы все еще использовать CG в преобразованной проблеме
б) Есть ли стандартный способ справиться с этими особенностями?
Большое спасибо !
С уважением,
Том
Если вы знаете нулевое пространство, вы можете сделать совместимым правую часть и сделать так, чтобы метод Крылова не позволял предварительному кондиционеру вызывать загрязнение, см. Почему неправильное закрепление точки для удаления нулевого пространства? для дальнейшего обсуждения. В PETSc это делается с помощью
MatNullSpace
объекта. Обратите внимание, что вы можете предоставить свою собственную функцию для проецирования пустого пространства, что было бы полезно для снижения стоимости проецирования, когда у вас много плавающих структур.Если вы не знаете пустое пространство и не можете избежать несовместимой правой части, существуют специальные методы Крылова, такие как MINRES-QLP, которые могут найти решение с минимальной нормой, несмотря на это. Этот подход может быть полезен, если у вас есть петли и одноточечные соединения, которые соединяют только некоторые режимы. Обратите внимание, что вы все равно должны быть осторожны с тем, что предварительный кондиционер вызывает загрязнение (например, из-за факторизации LU, обнаруживающей нулевые точки, возможно, на грубом уровне многосетки).
источник
MatSetNullSpace()
.