Bir matrisi tersine çevirmenin neden iyi olmadığının pratik örneği


16

Doğrusal bir sistemi çözmek için bir matrisi ters çevirmenin iyi bir fikir olmadığının farkındayım, çünkü sistemi doğrudan çözmek veya LU, Cholesky veya QR ayrışımı kullanmak kadar doğru ve verimli değildir.

Ancak, bunu pratik bir örnekle kontrol edemedim. Bu kodu denedim (MATLAB'da)

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))

ve artıklar her zaman aynı sıradadır (10 ^ -13).

Birisi inv (A) * b'nin A \ b'den çok daha az yanlış olduğu pratik bir örnek verebilir mi?

------ Soru güncelleme ------

Cevaplarınız için teşekkür ederim. Bununla birlikte, bir sistem A x = b'yi kez çözmemiz gerektiğini varsayalım , burada A her zaman aynı matristir. Bunu bir düşünnbirx=bbir

- dolu ve böylece bir - 1 ile aynı bellek depolama gerektiren A .birbir-1bir

Alınmış durum sayısı , dolayısıyla küçük bir - 1 doğrulukla hesaplanabilir.birbir-1

Bu durumda, A - 1 hesaplamak daha verimli olmaz mıydı?bir-1 LU ayrışımı kullanmak yerine ? Örneğin, bu Matlab kodunu denedim:

%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 ile ilgili durumu numarası ile bir matris için, artıklar olan her iki durumda da, ancak, sadece 9 saniye sürer A tersinin kullanılması ise, sistem çözme n kere LU parçalama kullanılarak 19 saniye sürer.Ö(10-11)


8
inv için MATLAB yardım sayfası iyi bir örnek verir. Doğrusal Sistemi Çöz başlıklı bölümün altına bakın .
Go Go

1
btw, matrisinizin durum numarası nedir? İş yerinde bilgisayarımda bir
MATLAB'ım

2
Trefethen ve Bau'ya bir göz attım (egzersiz 21.4) ve bunu tamamen hesaplama maliyeti, flop ve 2 açısından tanımladılar.2n3flop. Peki, benzer kalıntılar bulsanız bile (GoHokies'in yorumunda olduğu gibi daha kötü koşullu matrisleri kontrol etmeyi denediniz mi?), Tek başına gereksiz hesaplama maliyeti muhtemelen tavsiyeye değer. 23n3
Kirill

3
Matris boyutunuz bu karşılaştırma için çok küçük ve iyi durumda. Bu tür matrislere sahip olduğunuz ilgili problemler olmadığından değil, ancak tersine çevirmemeniz gerektiğine dair alınan görüş farklı bir ortam içindir (örneğin, cevabında Chris Rackauckas tarafından belirtilen sorun). Aslında, küçük ve - doğrulanabilir - iyi şartlandırılmış matrisler için, tersinin hesaplanması gerçekten daha iyi bir seçenek olabilir. Aşırı bir durum, 3x3 rotasyon (veya daha gerçekçi olarak afin transformasyon) matrisleridir.
Mart'ta Christian Clason

1
Ax=bAynı şeyi tekrar tekrar çözmeniz Agerekiyorsa ve tersini alacak kadar küçükse, bunun yerine LU çarpanlara ayırmayı kaydedebilir ve yeniden kullanabilirsiniz.
Chris Rackauckas

Yanıtlar:


11

Normalde tersi kullanmak için doğrusal bir sisteme saygı göstermeyi tercih etmenin bazı temel nedenleri vardır. Kısaca:

  • koşullu sayı ile ilgili sorun (@GoHokies yorumu)
  • seyrek durumda problem (@ChrisRackauckas cevap)
  • verimlilik (@Kirill comment)

Her neyse, @ChristianClason'un yorumlarda belirttiği gibi, tersin kullanımının iyi bir seçenek olduğu bazı durumlar olabilir.

Sivan Toledo, Alex Druinsky'nin not / makalesinde , inv (A) * b ne kadar doğrudur ?bu sorun hakkında biraz düşünülmelidir.

x

ters||xV-x||Ö(κ2(bir)εmbirchbenne) geriye doğru kararlı (LU, QR, ...)||xbbirckwbirrd-stbirble-x||Ö(κ(bir)εmbirchbenne)

xV

V

V , iyi bir sağ ters değildir veya

V||xV||||x||

(3) projeksiyonu bbir

Bu nedenle, tersi kullanma veya uygulama yapma fırsatı, makaleyi kontrol edebilir, eğer bir durumun geriye dönük kararlılığı elde etme koşulunu karşılayıp karşılamadığını veya buna ihtiyacınız yoksa görebilirsiniz.

Genel olarak, bence, doğrusal sistemi çözmek daha güvenlidir.


12

Δu , örneğin Isı Denkleminde

ut=Δu+f(t,u).

Sayısal olarak çözmek için, seyrek matrisleri ile sonuçlanırbir ve bir çizgi ayrıklaştırma yöntemi çözülür.

ut=biru+f(t,u)

birben-γbirSpecialMatrices.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

nÖ(3n)Ö(1) ! 'De yapabilir).

Ancak diyelim ki matrisi ters çevirmek istiyoruz.

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

Ö(n2) . Bu, tersin büyük miktarda ekstra bellek alacağı ve bellek sınırınızın yoğun ters matrisin boyutuna göre belirleneceği anlamına gelir.

\IterativeSolvers.jlbirx=bbir-1bir . Bu, çözebileceğiniz PDE'lerin boyutunu büyük ölçüde artırabilir.

Diğerlerinin de belirttiği gibi, koşul sayısı ve sayısal hata başka bir nedendir, ancak seyrek bir matrisin tersinin yoğun olması çok açık bir "bu kötü bir fikirdir".

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.