|
|
◆ Dpttrf()
| Sub Dpttrf |
( |
N As |
Long, |
|
|
D() As |
Double, |
|
|
E() As |
Double, |
|
|
Info As |
Long |
|
) |
| |
係数行列のLDLT分解 (正定値対称3重対角行列)
- 目的
- 本ルーチンは正定値対称3重対角行列AのL*D*L^T分解を計算する. この分解はまた A = U^T*D*U の形式とみなすこともできる.
- 引数
-
| [in] | N | 行列Aの行および列数. (N >= 0) (N = 0 の場合, 処理を行わずに戻る) |
| [in,out] | D() | 配列 D(LD - 1) (LD >= N)
[in] 正定値対称3重対角行列AのN個の対角要素.
[out] 分解 A = L*D*L^T の対角行列DのN個の対角要素. |
| [in,out] | E() | 配列 E(LE - 1) (LE >= N - 1)
[in] 正定値対称3重対角行列AのN-1個の副対角要素.
[out] 分解 A = L*D*L^T の下2重対角行列LのN-1個の下副対角要素. これは, 分解 A = U^T*D*U の上2重対角行列Uの上副対角要素とみなすこともできる(LおよびUの対角要素は1). |
| [out] | Info | = 0: 正常終了.
= -1: パラメータ N の誤り. (N < 0)
= -2: パラメータ D() の誤り.
= -3: パラメータ E() の誤り.
= i > 0: i×i首座小行列が正定値でない. i < Nの場合, 分解を完了できなかった. i = N の場合, 分解は完了したが D(N-1) <= 0 である. |
- 出典
- LAPACK
- 使用例
- 連立一次方程式 Ax = B を解き, 同時にAの条件数の逆数の推定値(RCond)を求める. ただし, Aは正定値対称3重対角行列で
( 2.58 -0.99 0 ) ( -1.1850 )
A = ( -0.99 0.69 -0.03 ), B = ( 0.1410 )
( 0 -0.03 0.18 ) ( 0.1614 )
とする. Sub Ex_Dpttrf()
Const N As Long = 3
Dim D(N - 1) As Double, E(N - 2) As Double, B(N - 1) As Double
Dim ANorm As Double, RCond As Double, Info As Long
D(0) = 2.58: D(1) = 0.69: D(2) = 0.18
E(0) = -0.99: E(1) = -0.03
B(0) = -1.185: B(1) = 0.141: B(2) = 0.1614
ANorm = Dlanst("1", N, D(), E())
Call Dpttrf(N, D(), E(), Info)
If Info = 0 Then Call Dpttrs(N, D(), E(), B(), Info)
If Info = 0 Then Call Dptcon(N, D(), E(), ANorm, RCond, Info)
Debug.Print "X =", B(0), B(1), B(2)
Debug.Print "RCond =", RCond
Debug.Print "Info =", Info
End Sub
Function Dlanst(Norm As String, N As Long, D() As Double, E() As Double, Optional Info As Long) As Double 行列の1ノルム, フロベニウスノルム, 無限ノルム, または, 要素の最大絶対値 (対称3重対角行列)
Sub Dptcon(N As Long, D() As Double, E() As Double, ANorm As Double, RCond As Double, Info As Long) 行列の条件数 (正定値対称3重対角行列)
Sub Dpttrs(N As Long, D() As Double, E() As Double, B() As Double, Info As Long, Optional Nrhs As Long=1) 分解済の連立一次方程式 AX = B の解 (正定値対称3重対角行列)
Sub Dpttrf(N As Long, D() As Double, E() As Double, Info As Long) 係数行列のLDLT分解 (正定値対称3重対角行列)
- 実行結果
X = -0.82 -0.94 0.74
RCond = 0.0437508336668
Info = 0
|