balance
고유값 정확도 향상을 위한 대각 스케일링(Diagonal Scaling)
구문
[T,B] = balance(A)
[S,P,B] = balance(A)
B = balance(A)
B = balance(A,'noperm')
설명
[T,B] = balance(A)
는 B = T\A*T
와 B
가 가능한 가장 가까운 근사치의 행 노름(Row Norm)과 열 노름(Column Norm)을 갖는 유사 변환(Similarity Transformation) T
를 반환합니다. T
는 반올림 오차가 발생하지 않도록 방지하는 요소가 2의 정수 거듭제곱인 대각 행렬의 치환입니다. A
가 대칭 행렬이면 B == A
이고 T
는 단위 행렬입니다.
[S,P,B] = balance(A)
는 스케일링 벡터 S
와 치환 벡터 P
를 별도로 반환합니다. 변환 T
와 균형 행렬(Balanced Matrix) B
는 T(:,P) = diag(S)
와 B(P,P) = diag(1./S)*A*diag(S)
로 A
, S
, P
에서 구할 수 있습니다.
B = balance(A)
는 균형 행렬(Balanced Matrix) B
만 반환합니다.
B = balance(A,'noperm')
은 행과 열을 치환하지 않고 A
를 스케일링합니다.
예제
이 예제에서는 기본 원리를 보여줍니다. 행렬 A
에는 오른쪽 위에 큰 요소가 있고 왼쪽 아래에 작은 요소가 있습니다. 따라서 대칭과는 거리가 멉니다.
A = [1 100 10000; .01 1 100; .0001 .01 1] A = 1.0e+04 * 0.0001 0.0100 1.0000 0.0000 0.0001 0.0100 0.0000 0.0000 0.0001
이 행렬을 밸런싱하면 2의 거듭제곱인 요소들로 이루어진 대각 행렬 T
와 A
보다 대칭에 가까운 균형 행렬(Balanced Matrix) B
가 만들어집니다.
[T,B] = balance(A) T = 1.0e+03 * 2.0480 0 0 0 0.0320 0 0 0 0.0003 B = 1.0000 1.5625 1.2207 0.6400 1.0000 0.7813 0.8192 1.2800 1.0000
고유벡터의 효과를 확인하려면 먼저 이 예제에서 V
의 열이 되는 A
의 고유벡터를 계산합니다.
[V,E] = eig(A); V V = 0.9999 -0.9999 -0.9999 0.0100 0.0059 + 0.0085i 0.0059 - 0.0085i 0.0001 0.0000 - 0.0001i 0.0000 + 0.0001i
참고로, 3개 벡터 모두 첫 번째 성분이 가장 크다는 것을 알 수 있습니다. 이는 V
의 조건이 나쁨을 의미합니다. 즉, cond(V)
가 8.7766e+003
입니다. 다음으로 B
의 고유벡터를 살펴봅니다.
[V,E] = eig(B); V V = 0.6933 -0.6993 -0.6993 0.4437 0.2619 + 0.3825i 0.2619 - 0.3825i 0.5679 0.2376 - 0.4896i 0.2376 + 0.4896i
이제 고유벡터가 올바르게 동작하고 cond(V)
는 1.4421
가 됩니다. 조건이 나쁜 행렬이 스케일링 행렬에 모아져 cond(T)
는 8192
가 됩니다.
이 예제는 크기가 작고 완전한 준특이 행렬(badly scaled)이 아니기 때문에 A
와 B
의 계산된 고유값이 반올림 오차 내에서 일치합니다. 따라서 밸런싱이 계산된 결과에 크게 영향을 미치지 않습니다.
제한 사항
밸런싱은 특정 행렬의 속성을 없앨 수 있으므로 신중하게 사용해야 합니다. 행렬에 반올림 오차로 인해 생성된 작은 요소가 있는 경우 밸런싱을 적용하면 해당 요소가 원본 행렬의 다른 요소만큼 커질 수 있습니다.
팁
비대칭 행렬은 조건이 나쁜 고유값을 가질 수 있습니다. 행렬에서 반올림 오차와 같은 작은 섭동이 고유값에서 큰 섭동을 야기할 수 있습니다. 고유벡터 행렬의 조건수는 다음과 같습니다.
cond(V) = norm(V)*norm(inv(V))
여기서 다음은
[V,T] = eig(A)
행렬 섭동의 크기를 고유값 섭동의 크기와 연결시킵니다. 참고로,
A
의 조건수 자체는 고유값 문제와 무관합니다.밸런싱은 조건이 나쁜 고유벡터 행렬 모두를 대각 스케일링으로 모으기 위한 동작입니다. 일반적으로 밸런싱으로는 비대칭 행렬을 대칭 행렬로 변환할 수 없고 각 행의 노름(Norm)이 대응하는 열의 노름과 일치하도록 시도합니다.
참고
MATLAB® 고유값 함수
eig(A)
는 그 고유값을 계산하기 전에A
를 자동으로 밸런싱합니다. 밸런싱을 비활성화하려면eig(A,'nobalance')
를 사용합니다.