Недавно я написал код для метода конечных элементов. Поскольку мой алгоритм генерирует симметричную матрицу, после сбора данных для каждого элемента результирующая матрица должна быть симметричной.
Однако после того, как я запустил цикл над элементом, результирующая глобальная матрица не является симметричной. Базовая структура кода выглядит так:
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
симметричным естественным образом без какой-либо постобработки?
(A-A.')/norm(A)
или что-то в этом роде. Если это очень мало, продолжайте и просто симметризируйте его вручную. Если она не очень маленькая, найдите свою ошибку. Кроме того, убедитесь, что ваши матрицы реальны. - person Andras Deak   schedule 06.06.2016A(K,K)
не дает вамlength(K)
элементов, как вы думаете. Это дает вам все перестановкиK
иK
. Вместо этого вы хотитеA(sub2ind(size(A), K,K))
- person Suever   schedule 06.06.2016A = (A+A')/2
? Это очень распространенная и вполне приемлемая вещь. - person Sam Roberts   schedule 06.06.2016