0

콜레스터 인수 분해를 통해 다른 라이브러리를 사용하는 정사각형 매트릭스의 역함수를 계산 중입니다. 그러나 내 결과는 내가 기대했던 것과 다르다. 나는 수학의 전문가는 아니지만, 더 가까운 결과를 기대하고 있습니다.매트릭스 반전 콜레 스키 인수 분해> 결과가 정확하지 않음

저는 MLK, magma 및 CULA 라이브러리를 사용하여 CPU 및 GPU에서 행렬의 역행렬을 계산합니다. 계산을 한 후에 결과가 항상 한 요소에서 다른 것으로 나타났습니다.

inv(A)[0] = 4.213983 
inv(A)[1] = -0.008092 
inv(A)[2] = 0.000458 
inv(A)[3] = 4.192946 

그러나, 올바른 결과가

4.2139841 -0.0080924 
    -0.0080924 4.1929404 

당신이 볼 수 있듯이, inv(A)[3]해야한다 :

A[0] = 0.237306 
A[1] = 0.000458 
A[2] = 0.000458 
A[3] = 0.238497 

내가 얻는 결과는 : 나는 A= [0.237306,0.000458;0.000458,0.238497]의 역을 계산하고 싶은 말은 나머지는 괜찮지 만 다르다. Cholesky Inversion이 어떻게 작동해야합니까? 이것은 정확하고 근사한 결과입니까, 아니면 제가 여기서 잘못된 것을하고 있습니까?

+0

사용 라이브러리에 대한 정보를 제공하거나 http://math.stackexchange.com/을 시도 하나 – ipavlic

+7

당신이 값이 모두 사용할 수 있어야하고 있는지 있습니까? 일반적으로 대칭 행렬 라이브러리는 행렬의 한 쪽 출력으로 만 사용하며 대칭으로 다른 쪽을 완료하는 데 의존합니다. 결과로 이어지는 코드의 개요를 게시하십시오. –

답변

3

나는 무엇이 일어나고 있는지 이해합니다. 이 라이브러리는 Alexandre C가 지적한 것처럼 위 또는 아래 행렬의 역행렬을 계산합니다. 그래서 인자에 따라 라이브러리 (Upper 또는 Lower)에 전달하면 행렬의 위쪽 또는 아래쪽의 역수를 계산합니다. 완전한 역행렬을 계산할 수 있다고 생각했지만이 방법은 불가능합니다.

1

아마도 부동 소수점 수에 대한 IEEE 사양 및 그 부동 소수점 연산과 관련된 부정확성 때문일 수 있습니다.

32 비트 또는 64 비트 부동 소수점을 지정했는지 여부는 말하지 않습니다. 정밀도를 높이십시오.

또 다른 중요한 점은 반올림 오류가 발생하기 쉽기 때문에 일반적으로 행렬의 역행렬을 계산하지 않는다는 것입니다. 더 나은 선택은 LU 분해 및 역방향 대체입니다.

어디에서 "올바른"대답을 얻었습니까? 결과의 정확성을 어떻게 판단합니까?

나는 수치 방법에 가장 적합한 도구가 아닙니다 알고,하지만 난 당신의 매트릭스 가지고가는 경우 :

0.237306 0.000458 0.000458 0.238497

을하고 MINVERSE를 통해 실행,이 얻을 답 :

4.213984 -0.00809 -0.00899 4.19294

I는 I는 다시 매트릭스를 식별 얻을 있는지 일본어 및 역을 곱하여 그 유효성을 검사 할 수있다. 여기에 내가 MMULT에서 가지고있는 작업은 다음과 같습니다

2.1684e-19 -2.168e-19 수치 방법의 사람이 행렬을 부를 것이다 무엇

.

그래서 내가 얻은 대답은 정확합니다. 똑같은 방식으로 자신을 확인하고 What Every Computer Scientist Should Know About Floating Point Arithmetic을 읽어야합니다.

관련 문제