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

◆ dgesvx()

void dgesvx ( char  fact,
char  trans,
int  n,
int  nrhs,
int  lda,
double  a[],
int  ldaf,
double  af[],
int  ipiv[],
char *  equed,
double  r[],
double  c[],
int  ldb,
double  b[],
int  ldx,
double  x[],
double *  rcond,
double  ferr[],
double  berr[],
double  work[],
int  iwork[],
int *  info 
)

(エキスパートドライバ) 連立一次方程式 AX = B の解 (一般行列)

目的
本ルーチンはLU分解を用いて連立一次方程式を解く.
A * X = B または A^T * X = B
ここで, Aはn×n行列, また, XおよびBはn×nrhs行列である.
解の誤差限界および推定条件数も求められる.
解説
以下の手順で計算が行われる.

  1. fact = 'E'の場合, 連立方程式を均衡化するためにスケーリング係数を計算する.
    trans = 'N': diag(R)*A*diag(C)*inv(diag(C))*X = diag(R)*B
    trans = 'T'または'C': (diag(R)*A*diag(C))^T *inv(diag(R))*X = diag(C)*B
    連立方程式を均衡化するかどうかは行列Aのスケーリングに依存する. しかし, 均衡化する場合, Aは diag(R)*A*diag(C) により, Bは diag(R)*B (trans = 'N'の場合) または diag(C)*B (trans = 'T'または'C'の場合) により上書きされる.
  2. fact = 'N'または'E'の場合, (fact = 'E'の場合には均衡化の後で)LU分解を用いてAを次のように分解する.
    A = P * L * U
    ここで, Pは置換行列, Lは対角成分が1の下三角行列, そして, Uは上三角行列である.
  3. Uの第i対角要素が0であればUは特異であり, info = iで戻る. そうでなければ, 行列Aの分解形を用いて条件数を推定する. 条件数の逆数がマシンイプシロンより小さければ警告としてinfo = n+1を返すが, 引き続き下記のように解Xを求め誤差限界を計算する.
  4. Aの分解形を用いて連立方程式を解きXを求める.
  5. 計算された解行列に反復改良を適用して精度向上を図り, その誤差限界および後退誤差推定値を計算する.
  6. 均衡化が行われた場合, 均衡化前の元の連立方程式の解を求めるために, 行列Xに左からdiag(C) (trans = 'N'の場合) または diag(R) (trans = 'T'または'C'の場合)を乗ずる.
引数
[in]fact行列Aの分解形を入力するかどうかを指定. 入力しない場合, 行列Aを分解前に均衡化するかどうかを指定する.
= 'F': af[][]とipiv[]にAの分解形を入力する. equed != 'N'であれば, r[]およびc[]により与えられるスケーリング係数で行列Aが均衡化済であることを示す. a[][], af[][]およびipiv[]は変更されない.
= 'N': 行列Aをaf[][]にコピーしてから分解する.
= 'E': 行列Aを必要に応じて均衡化し, 次にaf[][]にコピーしてから分解する.
[in]trans連立方程式の形を指定.
= 'N': A * X = B. (転置なし)
= 'T'または'C': A^T * X = B. (転置あり)
[in]n連立方程式の数, すなわち, 行列Aの行および列数. (n >= 0) (n = 0 の場合, 処理を行 わずに戻る)
[in]nrhs右辺の数, すなわち, 行列BおよびXの列数. (nrhs >= 0) (nrhs = 0 の場合, 処理を行わずに戻る)
[in]lda二次元配列a[][]の整合寸法. (lda >= max(1, n))
[in,out]a[][]配列 a[la][lda] (la >= n)
[in] n×n行列 A. fact = 'F' かつ equed != 'N'の場合, r[]および/またはc[]のスケーリング係数によりAが均衡化済でなければならない.
[out] fact = 'F'または'N'の場合, および, fact = 'E' かつ equedの出力 = 'N'の場合, Aは変更されない.
  fact = 'E' かつ equedの出力 != 'N'の場合, Aは次のように均衡化される.
    equed = 'R': A = diag(R)*A,
    equed = 'C': A = A*diag(C), または
    equed = 'B': A = diag(R)*A*diag(C).
[in]ldaf二次元配列af[][]の整合寸法. (ldaf >= max(1, n))
[in,out]af[][]配列 af[laf][ldaf] (laf >= n)
[in] fact = 'F'の場合, dgetrfにより計算された分解 A = P*L*U のLおよびU.
  equed != 'N'の場合, af[][]は均衡化後のAの分解であること.
[out] fact = 'N'の場合, 行列Aの分解 A = P*L*U のLおよびU.
  fact = 'E'の場合, 均衡化後の行列Aの分解 A = P*L*U のLおよびU(均衡化の形式についてはa[][]の説明を参照のこと).
[in,out]ipiv[]配列 ipiv[lipiv] (lipiv >= n)
[in] fact = 'F'の場合, dgetrfにより計算された分解 A = P*L*U のピボットインデックス. 行列の第i行が第ipiv[i-1]行と交換されたことを表す.
[out] fact = 'N'の場合, 行列Aの分解 A = P*L*U のピボットインデックス.
  fact = 'E'の場合, 均衡化後の行列Aの分解 A = P*L*U のピボットインデックス.
[in,out]equed均衡化の形式の指定.
= 'N': 均衡化なし.
= 'R': 行の均衡化. すなわち, diag(R)をAに左から掛ける.
= 'C': 列の均衡化. すなわち, diag(C)をAに右から掛ける.
= 'B': 行と列の均衡化. すなわち, A = diag(R)*A*diag(C) とする.
[in] fact = 'F'の場合, af[]に入力された行列の均衡化の形式を表す.
[out] fact != 'F'の場合, 適用された均衡化の形式を表す ('N', 'R', 'C'または'B').
  fact = 'N'であればequedは常に'N'となる.
[in,out]r[]配列 r[lr] (lr >= n)
Aの行の均衡化係数diag(R). equed = 'R'または'B'の場合, diag(R)をAに左から掛ける.
equed = 'N'または'C'の場合, r[]はアクセスされない.
[in] fact = 'F'の場合, af[][]に入力された行列の行の均衡化係数. (各要素 > 0)
[out] fact != 'F'の場合, 適用されたAの行の均衡化係数.
[in,out]c[]配列 c[lc] (lc >= n)
Aの列の均衡化係数diag(C). equed = 'C'または'B'の場合, diag(C)をAに右から掛ける.
equed = 'N'または'R'の場合, c[]はアクセスされない.
[in] fact = 'F'の場合, af[][]に入力された行列の列の均衡化係数. (各要素 > 0)
[out] fact != 'F'の場合, 適用されたAの列の均衡化係数.
[in]ldb二次元配列b[][]の整合寸法. (ldb >= max(1, n))
[in,out]b[][]配列 b[lb][ldb] (lb >= nrhs)
[in] n×nrhs右辺行列 B.
[out] equed = 'N'の場合, b[][]は変更されない.
  trans = 'N' かつ equed = 'R'または'B'の場合, b[][]はdiag(R)*Bで上書きされる.
  trans = 'T'または'C' かつ equed = 'C'または'B'の場合, b[][]はdiag(C)*Bで上書きされる.
[in]ldx二次元配列x[][]の整合寸法. (ldx >= max(1, n))
[out]x[][]配列 x[lx][ldx] (lx >= nrhs)
info = 0 または info = n+1 の場合, 元の連立方程式のn×nrhs解行列 X.
equed != 'N'の場合, AおよびBは変更される. また, 均衡化された連立方程式の解は,
  trans = 'N' かつ equed = 'C'または'B'であれば inv(diag(C))*X である.
  trans = 'T'または'C' かつ equed = 'R'または'B'であれば inv(diag(R))*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 >= 4*n)
作業領域.
終了時, work[0]にピボット成長係数の逆数 norm(A)/norm(U) が入る. ノルムは"要素最大絶対値"が使われる. work[0]が1よりもずっと小さい場合, (均衡化した)行列AのLU分解の安定性がよくない可能性がある. 解 x, 条件数の推定値 rcond, および, 前進誤差限界ferr も信用できない可能性があることを意味する. 0 < info <= n で分解が失敗した場合, work[0]は Aの先頭info列分のピボット成長係数の逆数である.
[out]iwork[]配列 iwork[liwork] (liwork >= n)
作業領域.
[out]info= 0: 正常終了
= -1: 入力パラメータ fact の誤り (fact != 'F', 'N'および'E')
= -2: 入力パラメータ trans の誤り (trans != 'N', 'T'および'C')
= -3: 入力パラメータ n の誤り (n < 0)
= -4: 入力パラメータ nrhs の誤り (nrhs < 0)
= -5: 入力パラメータ lda の誤り (lda < max(1, n))
= -7: 入力パラメータ ldaf の誤り (ldaf < max(1, n))
= -10: 入力パラメータ equed の誤り (fact = 'F' かつ equed != 'N', 'R', 'C'および 'B')
= -11: 入力パラメータ r の誤り (r[i] <= 0 (fact = 'F' かつ equed = 'R'または'B' のときに))
= -12: 入力パラメータ c の誤り (c[i] <= 0 (fact = 'F' かつ equed = 'C'または'B' のときに))
= -13: 入力パラメータ ldb の誤り (ldb < max(1, n))
= -15: 入力パラメータ ldx の誤り (ldx < max(1, n))
= i (0 < i <= n): Uのi番目の対角要素が0である. 分解は完了したが, Uが特異であり, 解と誤差限界は計算できなかった. rcond = 0 を返す.
= n+1: Uは非特異であるが, rcondがマシンイプシロンより小さく, これは実用精度において行列が特異であることを意味する. しかしながら, rcondの値が示すよりも計算値の精度が良いことがあるため, 解と誤差限界は計算される.
出典
LAPACK