2016-06-06 2 views
2

최근에 유한 요소법에 대한 코드를 작성했습니다. 내 알고리즘은 대칭 행렬을 생성하므로 각 요소에 대한 데이터를 모은 후에 결과 행렬은 대칭이어야합니다.대칭 행렬이 대칭이 아닙니다.

그러나 요소 위로 루프를 실행 한 결과 전역 행렬은 대칭이 아닙니다. 기본 코드 구조는 다음과 같습니다.

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을 대칭 적으로 만드는 다른 해결책이 있습니까?

+4

대칭 행렬은 또한 대칭 행렬을 생성합니다. 귀하의 이론은 옳지 만, 귀하의 코드에 문제가 있다고 의심됩니다. 의사 코드 대신 사용중인 실제 코드 스 니펫을 표시하십시오. 내 직감은 당신이 뭔가를 올바르게 코딩하고 있지 않다는 것입니다. – rayryeng

+0

진짜 질문은 : 행렬이 비대칭 적이 지요? 나는'(A-A. ')/norm (A)'또는 무엇인가와 같은 것을 의미합니다. 이것이 아주 작은 경우에, 진행하고 손으로 대칭 화하십시오. 크기가 작지 않은 경우 버그를 찾으십시오. 또한 행렬이 진짜인지 확인하십시오. –

+4

'A (K, K)'는 생각하는 것처럼 길이 (K) 원소를주지 않습니다. 그것은 당신에게'K'와'K'의 모든 순열을줍니다. – Suever

답변

0

이것은 반올림 오류로 인한 것입니다 (코드에 명백한 버그가없는 경우). 이 문제는 일반적으로 A = (A+A')/2에 의해 해결됩니다 (이것은 비싼 연산이 아닙니다) 또는 전역 행렬이 대칭임을 솔버에게 말할 수 있습니다 (일부 솔버 (예 : MUMPS)에는 이러한 옵션이 있습니다).