ドキュメンテーション センター

  • 評価版
  • 製品アップデート

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

ilu

スパース不完全 LU 分解

構文

ilu(A,setup)
[L,U] = ilu(A,setup)
[L,U,P] = ilu(A,setup)

説明

関数 ilu は、単位下三角行列、上三角行列、および置換行列を生成します。

ilu(A,setup)A の不完全 LU 分解を計算します。setup は最大 5 つの設定オプションをもつ入力構造体です。フィールドの名前は、次の表に示されているとおりに指定しなければなりません。構造体には、これらの任意の数のフィールドを任意の順序で定義できます。余分なフィールドは無視されます。

フィールド名

説明

type

分解のタイプ。type の値を以下に示します。

  • 'nofill'(既定の設定)—ILU(0) としても知られる、0 レベルの要素を満たす ILU 分解を実行します。type'nofill' に設定されている場合、milu 設定オプションのみが使用されます。すべての他のフィールドは無視されます。

  • 'crout'—ILUC としても知られる ILU の Crout バージョンを実行します。type'crout' に設定されている場合、droptol および milu 設定オプションのみが使用されます。すべての他のフィールドは無視されます。

  • 'ilutp' —しきい値とピボットを使用した ILU 分解を実行します。

type を指定しない場合は、0 レベルの要素を満たす ILU 分解が実行されます。ピボットは、type'ilutp' に設定されている場合にのみ実行されます。

droptol

不完全 LU 分解の棄却許容誤差。droptol は、負でないスカラーです。既定値は 0 で、完全な LU 分解を行います。

U の非ゼロ要素は、次の式を満たします。

  abs(U(i,j)) >= droptol*norm((A:,j)),

ただし、対角要素は例外で、これは、この条件を満たすかどうかに関係なく保持されます。L の要素は、ピボットによってスケーリングされる前にローカルな棄却許容誤差に対してテストされるので、L の非ゼロ要素に対して、以下のようになります。

abs(L(i,j)) >= droptol*norm(A(:,j))/U(j,j).

milu

変更された不完全 LU 分解。milu の値を以下に示します。

  • 'row'—行和で変更された不完全 LU 分解を行います。因子の新しく形成された列のエントリは、上三角因子の対角 U から引かれ、列の合計が保持されます。つまり、A*e = L*U*e になります。ここで、e は、ベクトルです。

  • 'col'—列和で変更された不完全 LU 分解を行います。因子の新しく形成された列のエントリは、上三角因子の対角 U から引かれ、列の合計が保持されます。つまり、e'*A = e'*L*U です。

  • 'off' (既定の設定)—変更された不完全 LU 分解は行われません。

udiag

udiag1 の場合、上三角因子の対角にあるゼロは、ローカルな棄却許容誤差に置き換えられます。既定の設定は 0 です。

thresh

0 (対角ピボットを強制) および 1 (既定の設定) 間のピボットしきい値。既定では、常に、列の最大要素がピボットに選択されます。

ilu(A,setup) は、L+U-speye(size(A)) を返します。L は単位下三角行列で、U は上三角行列です。

[L,U] = ilu(A,setup)L に単位下三角行列、U に上三角行列を返します。

[L,U,P] = ilu(A,setup) は、L に単位下三角行列、U に上三角行列、P に置換行列を返します。

制限

関数 ilu は、正方スパース行列にのみ動作します。

スパース行列に対して、LU 分解を計算します。

A = gallery('neumann', 1600) + speye(1600);
setup.type = 'crout';
setup.milu = 'row';
setup.droptol = 0.1;
[L,U] = ilu(A,setup);
e = ones(size(A,2),1);
norm(A*e-L*U*e)

ans =

  1.4251e-014

これは、A および L*U が、LU が変更された Crout ILU に提供される場合、行和が同じであることを示しています。

スパース行列に対して、LU 分解を計算します。

A = gallery('neumann', 1600) + speye(1600);
setup.type = 'nofill';
nnz(A)
ans =

        7840

nnz(lu(A))
ans =

      126478

nnz(ilu(A,setup))
ans =

        7840 

これは、A7840 の非ゼロ、不完全 LU 分解に 126478 の非ゼロ、0 レベルの要素を満たす LU 分解に 7840 (A の場合と同量) の非ゼロがあることを示しています。

詳細

すべて展開する

ヒント

これらの不完全分解は、BICG (双共役傾斜法)、GMRES (一般化最小残差法) など、大きなスパース線形方程式システムを解くための前提条件として有効なことがあります。

参照

[1] Saad, Yousef, Iterative Methods for Sparse Linear Systems, PWS Publishing Company, 1996, Chapter 10 - Preconditioning Techniques.

参考

| | |

この情報は役に立ちましたか?