행렬을 반전시키는 것이 좋지 않은 이유의 실제 예


16

선형 시스템을 해결하기 위해 행렬을 뒤집는 것은 시스템을 직접 해결하거나 LU, Cholesky 또는 QR 분해를 사용하는 것만 큼 정확하고 효율적이지 않기 때문에 좋은 생각이 아니라는 것을 알고 있습니다.

그러나 실제 사례로는 이것을 확인할 수 없었습니다. 이 코드를 시도했습니다 (MATLAB)

M   = 500;    
A   = rand(M,M);
A   = real(expm(1i*(A+A.')));
b   = rand(M,1);

x1  = A\b;
x2  = inv(A)*b;

disp(norm(b-A*x1))
disp(norm(b-A*x2))

잔차는 항상 같은 순서입니다 (10 ^ -13).

누군가 inv (A) * b가 A \ b보다 훨씬 덜 정확한 실제 예를 제공 할 수 있습니까?

------ 질문 업데이트 ------

답변 주셔서 감사합니다. 그러나 시스템 A x = b를 번 풀어야한다고 가정합니다 . 여기서 A 는 항상 같은 행렬입니다. 그것을 고려하십시오nAx=bA

- 전체이고, 따라서 A는 - 1 보다 동일한 메모리 저장 요구 .AA1A

조건 수가 적 으므로 A - 1 을 정확하게 계산할 수 있습니다.AA1

이 경우 LU 분해를 사용하는 것보다 을 계산 하는 것이 더 효율적이지 않습니까? 예를 들어,이 Matlab 코드를 시도했습니다.A1

%Set A and b:
M           = 1000; 
A           = rand(M,M);
A           = real(expm(1i*(A+A.')));
b           = rand(M,1);

%Times we solve the system:
n           = 3000;

%Performing LU decomposition:
disp('Performing LU decomposition')
tic
[L,U,P]     = lu(A);
toc
fprintf('\n')

%Solving the system n times with LU decomposition:
optsL.LT    = true;   %Options for linsolve
optsU.UT    = true;
disp('Solving the system n times using LU decomposition')
tic
for ii=1:n
    x1      = linsolve(U, linsolve(L,P*b,optsL) , optsU);
end
toc
fprintf('\n')

%Computing inverse of A:
disp('Computing inverse of A')
tic
Ainv        = inv(A);
toc
fprintf('\n')

%Solving the system n times with Ainv:
disp('Solving the system n times with A inv')
tic
for ii=1:n
    x2  = Ainv*b;
end
toc
fprintf('\n')

disp('Residuals')
disp(norm(b-A*x1))
disp(norm(b-A*x2))

disp('Condition number of A')
disp(cond(A))

450에 대한 조건 수와 행렬, 잔차는 모두의 경우가 있지만, 그것만 9초 소요의 역수를 사용하는 반면, 시스템을 해결 N 배는 LU 분해를 사용하여 19 초가 걸린다.O(1011)


8
inv에 대한 MATLAB 도움말 페이지 가 좋은 예입니다. Solve Linear System 섹션을보십시오 .
GoHokies

1
btw, 행렬 의 조건 번호는 무엇입니까? 나는 직장에서 내 PC에 MATLAB이 없어 확인할 수는 없지만 정확한 역수를 얻을 수있을 정도로 작다고 가정합니다.A
GoHokies

2
나는 Trefethen과 Bau (운동 21.4)를 살펴 보았고, 순전히 계산 비용, flops 대 22n3플롭. 따라서 잔차가 비슷하다고 생각하더라도 (GoHokies의 의견에서와 같이 조건이 좋지 않은 행렬을 확인하려고 했습니까?) 불필요한 계산 비용만으로도 조언을 얻을 가치가 있습니다. 23n
Kirill

3
매트릭스 크기가 너무 작아이 비교에 적합하지 않습니다. 그러한 행렬이있는 곳에는 문제가 없지만, 뒤집어서는 안된다는받은 의견은 다른 설정 (예 : Chris Rackauckas가 그의 답변에서 언급 한 것)을위한 것입니다. 실제로, 작고 (확인 가능하게) 잘 조절 된 행렬의 경우 역 계산이 실제로 더 나은 옵션 일 수 있습니다. 극단적 인 경우는 3x3 회전 (또는보다 현실적으로 아핀 변환) 행렬입니다.
Christian Clason

1
Ax=b동일한 방법 으로 반복해서 풀어야 A하고 역수를 취하기에 충분히 작은 경우 LU 인수 분해를 저장하고 재사용 할 수 있습니다.
Chris Rackauckas

답변:


11

일반적으로 역을 사용하기 위해 선형 시스템을 해결하는 것을 선호하는 몇 가지 주요 이유가 있습니다. 간단히:

  • 조건부 번호 문제 (@GoHokies 의견)
  • 드문 경우에 문제 (@ChrisRackauckas 답변)
  • 효율성 (@Kirill Comment)

어쨌든 @ChristianClason이 의견에서 언급했듯이 역의 사용이 좋은 옵션 인 경우가 있습니다.

Sivan Toledo, Alex Druinsky의 노트 / 기사에서 inv (A) * b는 얼마나 정확합니까? 이 문제에 대한 몇 가지 고려 사항이 있습니다.

논문에 따르면 선형 시스템을 해결하기 위해 일반적으로 선호하는 주된 이유는이 두 추정치 안에 있습니다.x

inverse||xVx||O(κ2(A)ϵmachine) backward stable (LU, QR,...)||xbackwardstablex||O(κ(A)ϵmachine)

xV

V

(1) V

V||xV||||x||

(3) 의 투영 작은 특이 값과 관련된 값은 작습니다.

따라서 역 사용 여부는 응용 프로그램에 따라 다를 수 있으므로 기사가 역전 안정성을 얻기위한 조건을 충족하는지 또는 필요하지 않은지 여부를 확인할 수 있습니다.

일반적으로 선형 시스템을 해결하는 것이 더 안전합니다.


12

다음은 PDE의 메모리 사용과 관련하여 매우 실용적인 빠른 예입니다. 라플라스 연산자를 구별 할 때Δ예를 들어 열 방정식에서

=Δ+에프(,).

수치 적으로 풀기 위해 희소 행렬로 끝납니다. , 그리고 선 이산화 방법은 해결

=+에프(,)

표준 1D 예제는 Strang 매트릭스입니다. 암시 적 메소드는 반전해야합니다.또는 어떤 형태의 나는γ. 5 포인트의 공간 분할을 위해이 연산자에 어떤 일이 발생하는지 봅시다. Julia에서 다음을 사용하여 쉽게 생성 할 수 있습니다 SpecialMatrices.jl.

julia> using SpecialMatrices
julia> Strang(5)
5×5 SpecialMatrices.Strang{Float64}:
 2.0  -1.0   0.0   0.0   0.0
-1.0   2.0  -1.0   0.0   0.0
 0.0  -1.0   2.0  -1.0   0.0
 0.0   0.0  -1.0   2.0  -1.0
 0.0   0.0   0.0  -1.0   2.0

이 특수 행렬은 3 각형입니다 (다른 많은 이산은 띠로되어 있기 때문에 여전히 희소합니다). 즉, 3 개의 배열 만 저장하여 저장하거나이 경우 "게으름"일 수 있습니다 (즉, 배열이 필요하지 않으며 필요에 따라 값을 생성하는 "의사 배열"유형을 가질 수 있음). 이것은 매우 큰 공간 이산화에도 포인트, 희소 행렬 형식은 이것을 저장할 수 있습니다 영형() 메모리 (그리고 게으른 형식은 영형(1)!).

그러나 행렬을 반전시키고 싶다고 가정 해 봅시다.

julia> inv(collect(Strang(5)))
5×5 Array{Float64,2}:
 0.833333  0.666667  0.5  0.333333  0.166667
 0.666667  1.33333   1.0  0.666667  0.333333
 0.5       1.0       1.5  1.0       0.5
 0.333333  0.666667  1.0  1.33333   0.666667
 0.166667  0.333333  0.5  0.666667  0.833333

이 희소 행렬의 역은 밀도가 높습니다. 따라서 역의 분석 솔루션을 모르는 경우 (PDE 이산으로 인해 발생하는 대부분의 희소 행렬의 경우) 역에 필요한 메모리 양은 다음과 같습니다.영형(2). 즉, 역은 엄청난 양의 추가 메모리를 차지하므로 메모리 제한은 밀도가 높은 역행렬의 크기에 따라 결정됩니다.

대신 직접 솔버 방법 \과 반복 솔버 IterativeSolvers.jl엑스= 컴퓨팅없이 1따라서 저장 해야하는 메모리 요구 사항 만 있습니다. . 이를 통해 해결할 수있는 PDE의 크기가 크게 확장 될 수 있습니다.

다른 사람들이 언급했듯이 조건 번호와 수치 오류는 또 다른 이유이지만 희소 행렬의 역수가 밀도가 높다는 사실은 "이것은 나쁜 생각입니다"라는 매우 분명합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.