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