【发布时间】:2016-10-05 12:19:43
【问题描述】:
我最近为有限元法编写了代码。由于我的算法正在生成一个对称矩阵,因此在为每个元素收集数据后,生成的矩阵应该是对称的。
但是,在我对元素运行循环之后,生成的全局矩阵不是对称的。基本代码结构是这样的:
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 自然对称而无需任何后处理?
【问题讨论】:
-
你是正确的,对称矩阵的添加也会生成一个对称矩阵。您的理论是正确的,但我高度怀疑您的代码有问题。而不是伪代码,请向我们展示您正在使用的实际代码 sn-p。我的直觉是你没有正确编码。
-
真正的问题是:矩阵非对称有多少?我的意思是
(A-A.')/norm(A)之类的东西。如果这非常小,请继续并手动将其对称。如果它不是很小,请找到您的错误。另外,请确保您的矩阵是真实的。 -
A(K,K)不会像您认为的那样为您提供length(K)元素。它为您提供K和K的所有排列。你想要A(sub2ind(size(A), K,K)) -
也许这可能是问题所在:如果您正在处理复数,则转置 (') 与 (.') 不同。前者也共轭值。
-
虽然您有如上所述的索引错误,但您的对角矩阵必须是标量。除此之外,对于其他情况,您可能希望将您的条目等同于而不是平均它们。使用
(triu(A,1))' + triu(A)。因此,您有一个对称的数字错误污染了条目。