Main Content

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

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

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

행렬이 양의 정부호 대칭 행렬인지 확인하는 가장 효율적인 방법은 행렬에서 chol을 사용해 보는 것입니다. 행렬 분해가 실패하면 양의 정부호 대칭 행렬이 아닙니다.

정사각 대칭 행렬을 만들고 try/catch 블록을 사용하여 chol(A)가 성공하는지 테스트합니다.

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))를 선택하는 것이 좋습니다.

참고 항목

|

관련 항목