XLPack 7.0
XLPack 数値計算ライブラリ (C API) リファレンスマニュアル
読み取り中…
検索中…
一致する文字列を見つけられません

◆ 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行列である.
解の誤差限界および推定条件数も求められる.
解説
以下の手順で計算が行われる.

  1. fact = 'N'の場合, LU分解を用いてAを次のように分解する.
    A = L * U
    ここで, Lは置換行列と対角成分が1の下2重対角行列の積, そして, Uは対角要素と第1・第2上副対角要素のみが0でない上三角行列である.
  2. Uの第i対角要素が0であればUは特異であり, info = iで戻る. そうでなければ, 行列Aの分解形を用いて条件数を推定する. 条件数の逆数がマシンイプシロンより小さければ警告としてinfo = n+1を返すが, 引き続き下記のように解Xを求め誤差限界を計算する.
  3. Aの分解形を用いて連立方程式を解きXを求める.
  4. 計算された解行列に反復改良を適用して精度向上を図り, その誤差限界および後退誤差推定値を計算する.
引数
[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