マトリックスを反転することが良くない理由の実際的な例


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よりもはるかに不正確ではない実用的な例を提供できますか?

------質問の更新------

ご回答ありがとうございます。ただし、システム倍を解く必要があるとします。ここで、は常に同じ行列です。それを考慮してくださいnAバツ=bA

-満杯であるため、と同じメモリ・ストレージが必要。AA1A

条件数が小さいため、を正確に計算できます。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の行列の場合、残差はどちらの場合もですが、LU分解を使用してシステムをn回解くには19秒かかりますが、Aの逆を使用すると9秒。O1011


8
invのMATLABヘルプページに良い例があります。Solve Linear Systemというタイトルのセクションの下を見てください。
GoHokies

1
ところで、行列の条件数は何ですか?私は確認することができないので、私は仕事で私のPC上でMATLABを持っていないが、私はそれは...あなたは、正確な逆を取得するための小さな十分だと推定A
GoHokies

2
TrefethenとBau(演習21.4)を見て、純粋に計算コスト、フロップとフロップの条件について説明しました。したがって、残差が類似している場合(GoHokiesのコメントのように、条件の悪い行列をチェックしようとしましたか?)、不必要な計算コストだけでもアドバイスに値するでしょう。22n323n3
キリル

3
マトリックスサイズが小さすぎて、この比較に適しています。そのような行列がある場合、関連する問題はないということではなく、逆にすべきではないという一般的な意見は、異なる設定(例えば、Chris Rackauckasの答えで言及されたもの)を意味します。事実、小規模な-証明可能な-良好に条件付けられた行列の場合、逆行列を計算することは確かにより良い選択肢かもしれません。極端な場合は、3x3回転(または、より現実的にはアフィン変換)マトリックスです。
クリスチャンクラソン

1
Ax=b同じもので繰り返し解く必要がありA、逆を行うのに十分小さい場合は、代わりにLU分解を保存して再利用できます。
クリスラッカッカス

回答:


11

通常、逆を使用するよりも線形システムを解くことを好むいくつかの主な理由があります。簡単に:

  • 条件付き番号の問題(@GoHokiesコメント)
  • スパースケースの問題(@ChrisRackauckasの回答)
  • 効率(@Kirillコメント)

とにかく、@ ChristianClasonがコメントで述べたように、逆の使用が適切なオプションである場合があります。

Alex Druinsky、Sivan Toledoによるノート/記事で、inv(A)* bはどれくらい正確ですか?この問題については、いくつかの考慮事項があります。

論文によれば、線形システムを解く一般的な好みの主な理由は、次の2つの推定値の内側にあります(は真の解です): バツ

||バツVバツ||Oκ2Aϵmachne 後方安定(LU、QR、...)||バツbackwardstableバツ||OκAϵmachne

これで、逆の推定値は、逆の条件よりも改善される場合があります。論文の定理1を参照してください。ただし、は条件付きで正確であり、後方安定ではありません。バツV

紙は、これが起こる場合を示しています(は逆です)V

(1)が適切な正逆ではない、またはV

(2)は、ような劣った左逆数です。よりもはるかに小さい 、またはV||バツV||||バツ||

(3)小さな特異値に関連付けられた左特異ベクトル上のの射影は小さい。bA

そのため、逆を使用するかどうかはアプリケーションによって異なります。逆安定性を得るためのケースが条件を満たしているかどうか、または必要ない場合は記事を確認してください。

一般に、私の意見では、線形システムを解く方が安全です。


12

PDEのメモリ使用量に関連する非常に実用的な簡単な例を次に示します。たとえば、熱方程式でラプラス演算子離散化する場合あなたは

あなたはt=あなたは+ftあなたは

数値的に解くために、スパース行列になり、線の離散化の方法で解きますA

あなたはt=Aあなたは+ftあなたは

標準的な1Dの例はStrangマトリックスです。暗黙的なメソッドは、または何らかの形式のを反転する必要があります。空間に5つのポイントがある離散化について、この演算子がどうなるか見てみましょう。を使用して、ジュリアで簡単に生成できます。I - γ AAγASpecialMatrices.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つの配列のみを格納することで格納できることを意味します。この場合、「遅延」することができます(つまり、配列は不要であり、オンデマンドで値を生成する「疑似配列」タイプを持つことができます)。これは、ポイントの非常に大きな空間離散化の場合でも、スパース行列形式でこれをメモリに格納できることを意味します(遅延形式ではこれをで行えます!)。O3 n O1 nO3nO1

ただし、マトリックスを反転させたいとしましょう。

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離散化から生じるほとんどのスパース行列に当てはまります)、逆に必要なメモリの量はです。これは、逆行列が大量の余分なメモリを占有することを意味します。したがって、メモリの制限は、高密度の逆行列のサイズによって決まります。On2

代わりに、の直接ソルバーメソッドとその\ような反復ソルバーは、計算せずにをIterativeSolvers.jl解くため、を格納だけのメモリ要件があります。これにより、解くことができるPDEのサイズを大幅に拡張できます。A 1 AAバツ=bA1A

他の人が述べたように、条件数と数値誤差は別の理由ですが、スパース行列の逆が密であるという事実は、非常に明確な「これは悪い考えです」を与えます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.