# lufact

疎行列LU分解

## 呼び出し手順

    [hand,rk]=lufact(A,prec)

## パラメータ

A

  正方疎行列

hand

  疎行列LU分解へのハンドル

rk

  整数 (Aのランク)

prec

  大きさ2のベクトル`prec=[eps,reps]`で, 絶対および相対閾値を指定します.

## 説明

`[hand,rk]=lufact(A)`は, 疎行列`A`のLU分解を行ないます. `hand` (表示されません) が, (線形システムを解く)`lusolve`および (LU分解を取得する)`luget`で 使用されます. `hand` は以下のコマンドにより消去します: `ludel(hand)`;

行列Aは,フルランクである必要はありませんが,正方である必要があります (Aは疎行列であると仮定されるため,必要に応じてAの下に正方にするための ゼロを追加することができます).

eps :

  最終的に要素がピボットの候補とみなされる大きさ. この数は行列の中で存在すると思われる最も小さい対角項よりも 著しく小さな値に設定する必要があります. デフォルトは`%eps`です.

reps :

  この数は,ピポット相対閾値を定義します. この値は,0と1の間とする必要があります. 1の場合,ピボット選択は完全ピボット選択となり, 非常に遅く,通常の行列に近くなるまで要素が埋められる 傾向があります. 0 に近い値を設定した場合, ピボット選択は閾値なしの厳密なMarkowitz法となります. ピボットの閾値はこれらが使用された場合には 要素が増加しすぎるようなピボット候補を消去する際に使用されます. 要素の増加が丸め誤差の原因です. 要素の増加は条件の良い行列においても発生します. reps に大きな値を設定することで, 要素の増加と丸め誤差が減少しますが, 大きすぎる値を設定すると実行時間が過大となり, 代入の数が過大となります. このような場合, 多くの代入に必要な行列の操作の回数が多くなるため,実際の 精度は低下します. 良い値は 0.001 と思われ,これがデフォルト値です. このデフォルト値は,1より大きいか,0以下の値を指定することにより 選択されます. この値は,過度な要素数の増加が認められた場合には, 増加させ,行列を決定する必要があります. ピボット閾値の変更は,要素数の増加が小さい行列においては, 条件が悪い行列において期待されるような性能の改善効果を, 得ることはできません. reps は, ノードおよび修正ノードアドミタンス行列のような 近似的に対角優位の行列で使用するように選択されています. これらの行列では,通常は対角ピボット選択を使用するのが最良です. 大きな対角項がない行列の場合は, 通常は0.01または0.1のようなより大きな閾値を使用するのが最善です.

## 例

    a=rand(5,5);b=rand(5,1);A=sparse(a);
    [h,rk]=lufact(A);
    x=lusolve(h,b);a*x-b
    ludel(h)

## 参照

- sparse
- lusolve
- luget