Main Content

이 번역 페이지는 최신 내용을 담고 있지 않습니다. 최신 내용을 영문으로 보려면 여기를 클릭하십시오.

행렬이 양의 정부호 대칭 행렬인지 확인하기

여기에서는 chol 함수와 eig 함수를 사용하여 행렬이 양의 정부호 대칭 행렬(모든 고유값이 양수인 대칭 행렬)인지 확인하는 방법을 설명합니다.

방법 1: 촐레스키 분해 시도하기

행렬이 양의 정부호 대칭 행렬인지 확인하는 가장 효율적인 방법은 단순하게 행렬에서 chol을 사용해 보는 것입니다. 행렬 분해가 실패하면 양의 정부호 대칭 행렬이 아닙니다. 이 방법을 사용할 경우 테스트에 성공하기 위해 행렬이 반드시 대칭 행렬이지 않아도 됩니다(대칭 행렬이 아니면 행렬 분해가 실패함).

A = [1 -1 0; -1 5 0; 0 0 7]
A = 3×3

     1    -1     0
    -1     5     0
     0     0     7

try chol(A)
    disp('Matrix is symmetric positive definite.')
catch ME
    disp('Matrix is not symmetric positive definite')
end
ans = 3×3

    1.0000   -1.0000         0
         0    2.0000         0
         0         0    2.6458

Matrix is symmetric positive definite.

이 방법의 단점은 양의 준정부호 대칭 행렬(고유값이 양수 또는 0일 수 있음) 여부까지 확인하기 위해 확장할 수 없다는 것입니다.

방법 2: 고유값 확인하기

eig를 사용하여 모든 고유값을 계산하고 해당 값을 확인하는 방법은 효율성은 낮지만 양의 준정부호 대칭 행렬인지 확인하는 데도 사용할 수 있으므로 유연성이 높습니다. 하지만 작은 행렬의 경우에는 방법 간에 양의 정부호 대칭 행렬인지 확인하는 데 걸리는 계산 시간의 차이가 크지 않습니다.

이 방법을 사용하려면 테스트를 수행하기 전에 issymmetric을 사용하여 행렬이 대칭 행렬인지 확인해야 합니다. 대칭 행렬이 아니면 고유값을 계산할 필요가 없습니다.

tf = issymmetric(A)
tf = logical
   1

d = eig(A)
d = 3×1

    0.7639
    5.2361
    7.0000

isposdef = all(d > 0)
isposdef = logical
   1

이 방법을 확장하여 all(d >= 0) 명령을 사용하면 양의 준정부호 대칭 행렬인지 확인할 수 있습니다.

수치 고려 사항

여기서 설명한 방법들이 동일한 행렬에 대해 서로 다른 결과를 내놓을 수 있습니다. 두 계산 모두 반올림 오차를 포함하기 때문에 각 알고리즘은 A와는 미소하게 다른 행렬의 정부호 여부를 확인하는 셈입니다. 고유값은 정확히는 아주 작은 양수 또는 음수이지만 기계 정밀도 내에서 수치적으로 0일 수 있기 때문에 실제로는 허용오차를 사용하는 것이 더 견고한 비교 방법입니다.

예를 들어 행렬이 eps에 가까운 고유값을 갖는 경우, 고유값이 수치적으로 0으로 간주되기 때문에 행렬이 양의 정부호 대칭 행렬로 분류되지만 비교 표현식 isposdef = all(d > 0)true를 반환합니다.

허용오차를 사용해 비교하도록 다음과 같이 명령을 수정할 수 있습니다.

tf = issymmetric(A)
d = eig(A)
isposdef = all(d > tol)
issemidef = all(d > -tol)

허용오차는 0에 가까운 반지름을 정의하며 반지름 내의 모든 고유값은 0으로 처리됩니다. 대부분의 경우 허용오차는 가장 큰 고유값의 크기를 고려하여 length(d)*eps(max(d))를 선택하는 것이 좋습니다.

참고 항목

|

관련 항목