2

행렬의 역행렬 계산이 필요한 최적화 알고리즘을 실행 중입니다. 알고리즘의 목표는 행렬 A에서 음의 값을 제거하고 새로운 행렬 B를 얻는 것입니다. 기본적으로 동일한 크기의 알려진 정사각형 행렬 B와 C로 시작합니다.Matlab에서 역행렬 계산

A = B^-1 * C

또는 매트랩

:

A = B\C; 

난 같다 행렬 A를 계산함으로써 시작할

Matlab에서 B\C이보다 정확하다고 말했기 때문에 이것을 사용합니다..

A의 음수

은 2 개로 분할되고, 그 행은 새로운 사용 a (1)의 길이는, I와 함께 새로운 B를 계산 가지고있어되도록는 규격화되어 ​​

(1/N) * A * C '= B^-1

여기서 N은 스케일링 계수 (A의 열 수)입니다. 이 새로운 B는 첫 번째 단계에서 다시 사용되며 A에서 네거티브가 사라질 때까지 이러한 반복이 계속됩니다.

내 문제는 두 번째 방정식에서 B를 계산 한 다음 정규화해야한다는 것입니다.

invB = (1/N)*A*C'; 
B = inv(invB); 

나는 inv(B^-1)를 사용하여 B를 계산하고했지만 몇 번 반복 후에 나는 B^-1이라고 메시지를 받기 시작 "단수 또는 심하게 확장 부근에 있습니다."

이 알고리즘은 실제로 더 작은 행렬 (약 70x70)에서 작동하지만 약 500x500에 도달하면 이러한 메시지를 받기 시작합니다.

inv(B^-1)을 계산하는 더 좋은 방법이 있습니까?

+0

가 도움이됩니까? – Darhuuk

+0

'B = eye (N) \ invB'를 사용할 때 나는 더 이상 그 방정식에 대한 에러를 얻지 않지만'A = B \ C'가 계산 될 때마다 에러를 내게됩니다 ... – user1259832

답변

3

단수의 행렬에 대해 경고해야합니다. 수치 선형 대수학의 결과는 높은 조건 수를 가진 행렬로 이동할 때 무너지는 경향이 있습니다. 기본이되는 아이디어는

A*b_1 = c 

(A + matrix error)*b_2 = (c + vector error) 

을 (우리가 컴퓨터를 사용할 때 우리는 대략적인 숫자를 사용하고 있기 때문에) 우리가 실제로 문제를 해결하는 경우의 함수로 B_1 및 B_2 얼마나 가까운 행렬 및 벡터 오차? A가 작은 조건 번호 b_1을 갖고 b_2가 가깝습니다. A가 큰 조건 번호 b_1을 갖고 b_2가 근접하지 않은 경우.

알고리즘에 대한 유용한 분석 정보가 있습니다. 반복을 할 때마다 B를 찾으면 Matlab을 사용하여 조건 번호를 찾습니다. 이것은

cond(B) 

입니다. 숫자가 빠르게 올라갈 것입니다. 이것은 알고리즘을 반복 할 때마다 B가 적고 적음에 대한 결과를 신뢰해야 함을 나타냅니다.

숫자 수학에서 항상 이와 같은 문제가 발생합니다. 숫자 알고리즘을 자주 사용한다면 현장에서 조건 번호의 역할에 익숙해지기 위해 시간을 할애해야하며 위에서 언급 한 것처럼 사전 조건화 기술을 사용해야합니다. 이에 대한 필자의 선호하는 텍스트는 Lloyd Trefethen의 "Numerical Linear Algebra"이지만 Numerical Algebra의 텍스트는 이러한 문제 중 일부를 다루어야합니다. 행운을 빕니다

, 앤드류는`B = 눈 (N) \ invB`로 B를 계산하는 경우

1

주된 문제는 매트릭스의 조건 번호가 높다는 것입니다 (즉, 귀하의 경우 매우 작은 rcond (B)). 이것은 알고리즘의 반복 구조 때문입니다. 반복을 할 때마다 작은 특이 값이 작아지고 작아 지므로 조건 번호가 기하 급수적으로 커집니다. 이러한 종류의 동작을 방지하려면 preconditioning을 확인해야합니다.