|
|
◆ dgtsvx()
| void dgtsvx |
( |
char |
fact, |
|
|
char |
trans, |
|
|
int |
n, |
|
|
int |
nrhs, |
|
|
double |
dl[], |
|
|
double |
d[], |
|
|
double |
du[], |
|
|
double |
dlf[], |
|
|
double |
df[], |
|
|
double |
duf[], |
|
|
double |
du2[], |
|
|
int |
ipiv[], |
|
|
int |
ldb, |
|
|
double |
b[], |
|
|
int |
ldx, |
|
|
double |
x[], |
|
|
double * |
rcond, |
|
|
double |
ferr[], |
|
|
double |
berr[], |
|
|
double |
work[], |
|
|
int |
iwork[], |
|
|
int * |
info |
|
) |
| |
(エキスパートドライバ) 連立一次方程式 AX = B の解 (一般3重対角行列)
- 目的
- 本ルーチンはLU分解を用いて次の連立一次方程式を解く.
A * X = B または A^T * X = B
ここで, Aはn×n 3重対角行列, また, XおよびBはn×nrhs行列である.
解の誤差限界および推定条件数も求められる.
- 解説
- 以下の手順で計算が行われる.
- fact = 'N'の場合, LU分解を用いてAを次のように分解する. ここで, Lは置換行列と対角成分が1の下2重対角行列の積, そして, Uは対角要素と第1・第2上副対角要素のみが0でない上三角行列である.
- Uの第i対角要素が0であればUは特異であり, info = iで戻る. そうでなければ, 行列Aの分解形を用いて条件数を推定する. 条件数の逆数がマシンイプシロンより小さければ警告としてinfo = n+1を返すが, 引き続き下記のように解Xを求め誤差限界を計算する.
- Aの分解形を用いて連立方程式を解きXを求める.
- 計算された解行列に反復改良を適用して精度向上を図り, その誤差限界および後退誤差推定値を計算する.
- 引数
-
| [in] | fact | 係数行列Aの分解形を入力するかどうかを指定.
= 'F': dlf[], df[], duf[], du2[] および ipiv[] にAの分解形を与える. dlf[], df[], duf[], du2[] および ipiv[] は変更されない.
= 'N': dl[], d[] および du[] を dlf[], df[] および duf[] にコピーしてから分解する. |
| [in] | trans | 連立方程式の形を指定.
= 'N': A * X = B. (転置なし)
= 'T'または'C': A^T * X = B. (転置あり) |
| [in] | n | 行列Aの行および列数. (n >= 0) (n = 0 の場合, 処理を行わずに戻る) |
| [in] | nrhs | 右辺の数, すなわち, 行列Bの列数. (nrhs >= 0) (nrhs = 0 の場合, 処理を行わずに戻る) |
| [in] | dl() | 配列 dl[ldl] (ldl >= n - 1)
Aのn-1個の下副対角要素. |
| [in] | d[] | 配列 d[ld] (ld >= n)
Aのn個の対角要素. |
| [in] | du[] | 配列 du[ldu] (ldu >= n - 1)
Aのn-1個の上副対角要素. |
| [in,out] | dlf[] | 配列 dlf[ldlf] (ldlf >= n - 1)
[in] fact = 'F'の場合, dgttrfにより計算されたAのLU分解結果の行列Lを定義するn-1個の乗数を入力する.
[out] fact = 'N'の場合, AのLU分解結果の行列Lを定義するn-1個の乗数を返す. |
| [in] | df[] | 配列 df[ldf] (ldf >= n)
[in] fact = 'F'の場合, AのLU分解結果の上三角行列Uの対角要素を入力する.
[out] fact = 'N'の場合, AのLU分解結果の上三角行列Uの対角要素を返す. |
| [in] | duf[] | 配列 duf[lduf] (lduf >= n - 1)
[in] fact = 'F'の場合, Uのn-1個の上副対角要素を入力する.
[out] fact = 'N'の場合, Uのn-1個の上副対角要素を返す. |
| [in] | du2[] | 配列 du2[ldu2] (ldu2 >= n - 2)
[in] fact = 'F'の場合, Uのn-2個の第2上副対角要素を入力する.
[out] fact = 'N'の場合, Uのn-2個の第2上副対角要素を返す. |
| [in,out] | ipiv[] | 配列 ipiv[lipiv] (lipiv >= n)
[in] fact = 'F'の場合, dgttrfにより計算されたAのLU分解によるピボットインデックスを入力する.
[out] fact = 'N'の場合, AのLU分解によるピボットインデックスを返す. 行列の第i行は第ipiv[i-1]行と交換されたことを表す. ipiv[i-1]は常にiまたはi+1である. ipiv[i-1] = i は行の交換が不要であったことを示す. |
| [in] | ldb | 二次元配列b[][]の整合寸法. (ldb >= max(1, n)) |
| [in] | b[][] | 配列 b[lb][ldb] (lb >= nrhs)
n×nrhs右辺行列 B. |
| [in] | ldx | 二次元配列x[][]の整合寸法. (ldx >= max(1, n)) |
| [out] | x[][] | 配列 x[lx][ldx] (lx >= nrhs)
info = 0 または info = n+1 の場合, n×nrhs解行列 X. |
| [out] | rcond | 行列Aの(1/条件数)の推定値. rcondがマシンイプシロンより小さければ(特に rcond = 0 であれば), 実用精度において行列は特異である. これは info > 0 を返すことにより通知される. |
| [out] | ferr[] | 配列 ferr[lferr] (lferr >= nrhs)
各解ベクトルX(j)(解行列Xの第j列)の前進誤差限界. X(j)に対応する真の解をXtrueとするとき, ferr[j-1]は, (X(j) - Xtrue)の要素の最大絶対値をX(j)の要素の最大絶対値で割った値の上限の推定値である. この推定値はrcondの推定値と同程度の信頼性があり, ほぼ常に真の誤差よりも大きめに推定される. |
| [out] | berr[] | 配列 berr[lberr] (lberr >= nrhs)
各解ベクトルX(j)の要素に関する後退相対誤差. (すなわち, X(j)を真の解にするためのAまたはBの任意の要素の相対変化の最小値) |
| [out] | work[] | 配列 work[lwork] (lwork >= 3*n)
作業領域. |
| [out] | iwork[] | 配列 iwork[liwork] (liwork >= n)
作業領域. |
| [out] | info | = 0: 正常終了
= -1: 入力パラメータ fact の誤り (fact != 'F'および'N')
= -2: 入力パラメータ trans の誤り (trans != 'N', 'T'および'C')
= -3: 入力パラメータ n の誤り (n < 0)
= -4: 入力パラメータ nrhs の誤り (nrhs < 0)
= -13: 入力パラメータ ldb の誤り (ldb < max(1, n))
= -15: 入力パラメータ ldx の誤り (ldx < max(1, n))
= i (0 < i <= n): Uのi番目の対角要素が0である. i = nでない限り分解は完了していないが, Uが特異であり, 解と誤差限界は計算できなかった. rcond = 0 を返す.
= n+1: Uは非特異であるが, rcondがマシンイプシロンより小さく, これは実用精度において行列が特異であることを意味する. しかしながら, rcondの値が示すよりも計算値の精度が良いことがあるため, 解と誤差限界は計算される. |
- 出典
- LAPACK
|