|
|
◆ zgbsvx()
| void zgbsvx |
( |
char |
fact, |
|
|
char |
trans, |
|
|
int |
n, |
|
|
int |
kl, |
|
|
int |
ku, |
|
|
int |
nrhs, |
|
|
int |
ldab, |
|
|
doublecomplex |
ab[], |
|
|
int |
ldafb, |
|
|
doublecomplex |
afb[], |
|
|
int |
ipiv[], |
|
|
char * |
equed, |
|
|
double |
r[], |
|
|
double |
c[], |
|
|
int |
ldb, |
|
|
doublecomplex |
b[], |
|
|
int |
ldx, |
|
|
doublecomplex |
x[], |
|
|
double * |
rcond, |
|
|
double |
ferr[], |
|
|
double |
berr[], |
|
|
doublecomplex |
work[], |
|
|
double |
rwork[], |
|
|
int * |
info |
|
) |
| |
(エキスパートドライバ) 連立一次方程式 AX = B の解 (複素帯行列)
- 目的
- 本ルーチンはLU分解を用いて次の複素連立一次方程式を解く.
A * X = B, A^T * X = B または A^H * X = B
ここで, Aは下帯幅kl, 上帯幅kuのn×n帯行列, また, XおよびBはn×nrhs行列である.
解の誤差限界および推定条件数も求められる.
- 解説
- 本ルーチンでは以下の手順で計算が行われる.
- fact = 'E'の場合, 連立方程式を均衡化するために実数のスケーリング係数を計算する.
trans = 'N': diag(R)*A*diag(C)*inv(diag(C))*X = diag(R)*B
trans = 'T': (diag(R)*A*diag(C))^T *inv(diag(R))*X = diag(C)*B
trans = 'C': (diag(R)*A*diag(C))^H *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を次のように分解する. ここで, Lは置換行列と下帯幅klで対角要素が1の下三角行列の積, そして, Uは上帯幅kl+kuの上三角行列である.
- 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': afb[][]とipiv[]にAの分解形を入力する. equed != 'N'であれば, r[]およびc[]により与えられるスケーリング係数で行列Aが均衡化済であることを示す. ab[][], afb[][]およびipiv[]は変更されない.
= 'N': 行列Aをafb[][]にコピーしてから分解する.
= 'E': 行列Aを必要に応じて均衡化し, 次にafb[][]にコピーしてから分解する. |
| [in] | trans | 連立方程式の形を指定
= 'N': A * X = B. (転置なし)
= 'T': A^T * X = B. (転置あり)
= 'C': A^H * X = B. (共役転置あり) |
| [in] | n | 連立方程式の数, すなわち, 行列Aの行および列数. (n >= 0) (n = 0 の場合, 処理を行わずに戻る) |
| [in] | kl | Aの下帯幅. (kl >= 0) |
| [in] | ku | Aの上帯幅. (ku >= 0) |
| [in] | nrhs | 右辺の数, すなわち, 行列BおよびXの列数. (nrhs >= 0) (nrhs = 0 の場合, 処理を行わずに戻る) |
| [in] | ldab | 二次元配列ab[][]の整合寸法. (ldab >= kl + ku + 1) |
| [in,out] | ab[][] | 配列 ab[lab][ldab] (lab >= n)
[in] 帯行列形式の行列A (行1 〜 kl+ku+1).
fact = 'F' かつ equed != 'N'の場合, r[]および/またはc[]のスケーリング係数によりAが均衡化済でなければならない.
[out] fact = 'F'または'N', あるいは fact = 'E' かつ equedの出力 = 'N' であれば変更されない.
fact = 'E' かつ equedの出力 != 'N' の場合, 次のように均衡化される.
equed = 'R': A := diag(R)*A,
equed = 'C': A := A*diag(C), または
equed = 'B': A := diag(R)*A*diag(C). |
| [in] | ldafb | 二次元配列afb[][]の整合寸法. (ldafb >= 2kl + ku + 1) |
| [in,out] | afb[][] | 配列 afb[lafb][ldafb] (lafb >= n)
[in] fact = 'F'の場合, zgbtrfにより計算された帯行列AのLU分解結果. Uは上帯幅kl+kuの上三角行列として第1〜kl+ku+1行に格納される. また, 分解中に使われた乗数が第kl+ku+2〜2kl+ku+1行に格納される. equed != 'N'の場合, afb[][]は均衡化済の行列Aの分解形であること.
[out] fact = 'N'の場合, AのLU分解結果を返す.
fact = 'E'の場合, 均衡化済の行列AのLU分解結果を返す(均衡化の形式についてはab[][]の説明を参照せよ). |
| [in,out] | ipiv[] | 配列 ipiv[lipiv] (lipiv >= n)
[in] fact = 'F'の場合, zgbtrfにより計算された分解 A = L*U のピボットインデックス. 行列の第i行が第ipiv[i-1]行と交換されたことを表す.
[out] fact = 'N'の場合, 行列Aの分解 A = L*U のピボットインデックス.
fact = 'E'の場合, 均衡化後の行列Aの分解 A = L*U のピボットインデックス. |
| [in,out] | equed | 均衡化の形式の指定
= 'N': 均衡化なし.
= 'R': 行の均衡化. すなわち, diag(R)をAに左から掛ける.
= 'C': 列の均衡化. すなわち, diag(C)をAに右から掛ける.
= 'B': 行と列の均衡化. すなわち, A := diag(R)*A*diag(C) とする.
[in] fact = 'F'の場合, afb[]に入力された行列の均衡化の形式を表す.
[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'の場合, afb[][]に入力された行列の行の均衡化係数. (各要素 > 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'の場合, afb[][]に入力された行列の列の均衡化係数. (各要素 > 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 >= 2*n)
作業領域. |
| [out] | rwork[] | 配列 rwork[lrwork] (lrwork >= n)
作業領域.
終了時, rwork[0]にピボット成長係数の逆数 norm(A)/norm(U) が入る. ノルムは"要素最大絶対値"が使われる. rwork[0]が1よりもずっと小さい場合, (均衡化した)行列AのLU分解の安定性がよくない可能性がある. 解 x, 条件数の推定値 rcond, および, 前進誤差限界 ferr も信用できない可能性があることを意味する. 0 < info <= n で分解が失敗した場合, rwork[0]は Aの先頭info列分のピボット成長係数の逆数である. |
| [out] | info | = 0: 正常終了
= -1: 入力パラメータ fact の誤り (fact != 'F', 'N'および'E')
= -2: 入力パラメータ trans の誤り (trans != 'N', 'T'および'C')
= -3: 入力パラメータ n の誤り (n < 0)
= -4: 入力パラメータ kl の誤り (kl < 0)
= -5: 入力パラメータ ku の誤り (ku < 0)
= -6: 入力パラメータ nrhs の誤り (nrhs < 0)
= -7: 入力パラメータ ldab の誤り (ldab < kl+ku+1)
= -9: 入力パラメータ ldafb の誤り (ldafb < 2kl+ku+1)
= -12: 入力パラメータ equed の誤り (fact = 'F' かつ equed != 'N', 'R', 'C'および'B')
= -13: 入力パラメータ r の誤り (r[i] <= 0 (fact = 'F' かつ equed = 'R'または'B' のときに))
= -14: 入力パラメータ c の誤り (c[i] <= 0 (fact = 'F' かつ equed = 'C'または'B' のときに))
= -15: 入力パラメータ ldb の誤り (ldb < max(1, n))
= -17: 入力パラメータ ldx の誤り (ldx < max(1, n))
= i (0 < i <= n): Uのi番目の対角要素が0である. 分解は完了したが, Uが特異であり, 解と誤差限界は計算できない. rcond = 0 を返す.
= n+1: Uは非特異であるが, rcondがマシンイプシロンより小さく, これは実用精度において行列が特異であることを意味する. しかしながら, rcondの値が示すよりも計算値の精度が良いことがよくあるため, 解と誤差限界は計算される. |
- 出典
- LAPACK
|