행렬이 양의 정부호 대칭 행렬인지 확인하기
여기에서는 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))
를 선택하는 것이 좋습니다.