2017-01-06 7 views
1

MATLAB에서 행렬식 함수를 사용할 때 간단하지만 특별한 동작을 관찰했으며 함수 도움말 설명서에서 이에 대한 설명을 찾지 못해 일부 설명을 듣고 싶습니다. 나는 다음과 같은 코드를 사용하여 임의의 단위 행렬 Q를 생성하고 있습니다MATLAB 행렬 함수의 특정 결과에 대한 설명

:

det(Q) 

내가를 기대 : 그 후

[Q, R] = qr(randn(3)); 

, 나는 det 기능 Q의 결정을 평가 결과는 -1.000 또는 1.000이됩니다. 그러나 형식이 일정하지 않은 것 같습니다. 나는 이런 식으로 뭔가를 할 때 그래서 :

detResults = zeros(100,1); 
for ii = 1:100 
    [Q, R] = qr(randn(3)); 
    detResults(ii,1) = det(Q); 
end 

detResults 벡터 1.000 언젠가 1이 포함되어 있습니다. 인쇄 형식 문제일까요? 아니면 다른 어떤 것으로 인해 발생 했습니까?

답변

3

부동 소수점 정밀도와 관련이 있습니다. 루프를 반복 할 때마다 이론적으로 행렬에 대한 1의 결정자를 얻지 만 행렬 자체의 수는 비이성적이므로 이론적으로 1의 값을 얻는 유일한 방법은 숫자가 무한 정밀도. 때로는 MATLAB이 보증을 통해 안전하게 1로 반올림 할 수 있도록 충분한 숫자가 있습니다. 또한, 당신은 전체 그림을 못 받고있어. 1.00001을 보는 이유는 인쇄 형식과 관련이 있습니다. 기본 인쇄 형식은 소수점 이하 다섯 자리까지만 표시 할 수 있지만 더 큰 그림을 감상하기 위해 소수점 이하 자리를 표시하는 것이 현명 할 수 있습니다. format long g

>> detResults 

detResults = 

    1.0000 
    1.0000 
    1.0000 
    1.0000 
    1.0000 
    1.0000 
    1.0000 
    1.0000 
    1.0000 
    1.0000 

정밀도가 향상된 형식 (단지 표시 목적으로) 사용 : 여기

는 기본 인쇄 형식을 사용하여 10 반복 대신에 100

를 사용하여있는 작은 예입니다

>> format long g; 
>> detResults 

detResults = 

        1 
    0.999999999999999 
        1 
        1 
    0.999999999999999 
        1 
        1 
    0.999999999999999 
        1 
    0.999999999999999 

내부적으로 실제로는 Q 행렬이 무엇인지에 따라 달라지며 y 랜덤 행렬을 생성합니다. 그러나 추가 계산을 위해 정밀도를 사용하는 한, 0.999...은 1에 매우 가깝습니다. 따라서 모든 의도와 목적에 대해 1로 간주해야합니다.

2

나는 유한 정밀도의 효과를 관찰하고 있다고 생각합니다. 부동 소수점 표현의 기본적으로 MATLAB은 64 비트 부동 소수점 숫자를 사용합니다. 따라서 2^64 고유 요소가있는 유한 수 집합 만이이 시스템으로 정확하게 표현 될 수 있습니다. 중간 계산 중에 발생하는 다른 모든 숫자는 가장 가까운 표현 가능한 값으로 반올림됩니다. 이러한 루핑 작업으로 인해 대부분의 애플리케이션에서 무시할 수있는 오류가 발생하지만 모든 애플리케이션에서 발생하는 것은 아닙니다.

당신은 당신의 코드에 줄을 추가하여 결과의 ​​오류를 추정 할 수 :

err = detResults - 1; 

간단한 예는 유한 정밀 유물을 관찰 할 수 있습니다 :

2-(sqrt(2))^2 

분명히, 이것은해야 정확히 0이되어야합니다. 그러나 MATLAB은 제곱근 및 제곱 단계에서 반올림 오류 때문에 0이 아닌 작은 숫자를 반환합니다.