Симметричная матрица не симметрична
Я недавно написал код для метода конечных элементов. Поскольку мой алгоритм генерирует симметричную матрицу, после сбора данных для каждого элемента результирующая матрица должна быть симметричной.
Однако после запуска цикла над элементом результирующая глобальная матрица не является симметричной. Базовая структура кода выглядит следующим образом:
A=zeros(dof,dof)
for (each element)
loc_A = v'*(diagonal matrix)*v
% (v is 1xN row vector)
% loc_A is symmetric matrix
A(K,K) = A(K,K)+loc_A
% (K is Nx1 column vector)
end
Поскольку я добавляю симметричные матрицы, результирующая матрица также должна быть симметричной.
Тем не менее, результирующая матрица не является симметричной (я проверил это с issymmetric(A)
). Я думаю, что это из-за ошибки округления. Если я добавлю A=(A+A')/2, результирующая матрица будет симметричной (конечно...). Однако я не хочу делать такие вещи. Есть ли другое средство, которое делает A
симметрично естественно без какой-либо постобработки?
1 ответ
Это связано с ошибкой округления (если в вашем коде нет явной ошибки). Эта проблема обычно решается A = (A+A')/2
(это не дорогая операция), или вы можете сказать решателю, что ваша глобальная матрица симметрична (некоторые решатели (например, MUMPS) имеют такую опцию.)