|
◆ dgelsy()
void dgelsy |
( |
int |
m, |
|
|
int |
n, |
|
|
int |
nrhs, |
|
|
int |
lda, |
|
|
double |
a[], |
|
|
int |
ldb, |
|
|
double |
b[], |
|
|
int |
jpvt[], |
|
|
double |
rcond, |
|
|
int * |
rank, |
|
|
double |
work[], |
|
|
int |
lwork, |
|
|
int * |
info |
|
) |
| |
優決定または劣決定系連立一次方程式 Ax = b の解 (完全直交分解)
- 目的
- dgelsyは線形最小二乗問題の最小ノルム解をAの完全直交分解を使って求める. Aはm×n行列で, ランク落ちしていてもよい.
いくつかの右辺ベクトル b および解ベクトル x を1回の呼び出しで扱うことができる. これらのベクトルは, m×nrhs右辺行列Bおよびn×nrhs解行列Xの列として格納される.
まず最初に列のピボット選択付きQR分解を求める. A * P = Q * [ R11 R12 ]
[ 0 R22 ]
R11は最大の主小行列を示し, その推定条件数は1/rcondより小さい. R11の次数(rank)はAの有効ランク数である.
そして, R22は無視してよいと考えられ, R12は右からの直交変換により消え, 次の完全直交分解になる. A * P = Q * [ T11 0 ] * Z
[ 0 0 ]
これより, 最小ノルム解は次のように求められる. X = P * Z^T [ T11^(-1)*Q1^T*B ]
[ 0 ]
ここで, Q1はQのはじめのrank列よりなる.
- 引数
-
[in] | m | 行列 A の行数. (m >= 0) (m = 0 の場合, rank = 0 として戻る) |
[in] | n | 行列 A の列数. (n >= 0) (n = 0 の場合, rank = 0 として戻る) |
[in] | nrhs | 右辺の数, すなわち, 行列BおよびXの列数. (nrhs >= 0) (nrhs = 0 の場合, rank = 0 として戻る) |
[in] | lda | 二次元配列a[][]の整合寸法. (lda >= max(1, m)) |
[in,out] | a[][] | 配列 a[la][lda] (la >= n)
[in] m×n行列 A.
[out] a[][]は完全直交分解により上書きされる. |
[in] | ldb | 二次元配列b[][]の整合寸法. (ldb >= max(1, m, n)) |
[in,out] | b[][] | 配列 b[lb][ldb] (lb >= nrhs)
[in] m×nrhs右辺行列 B.
[out] n×nrhs解行列 X. |
[in,out] | jpvt[] | 配列 jpvt[ljpvt] (ljpvt >= n)
[in] jpvt[i-1] != 0のとき, Aのi列をA*Pの前の方に持ってくる. 0のとき, i列はフリーな列である.
[out] jpvt[i-1] = kであれば, A*Pのi列はAのk列だったことを示す. |
[in] | rcond | rcondはAの有効ランク数を決めるために使われる. 有効ランク数は, Aのピボット選択付きQR分解の最大の主小行列R11の次数である. R11の推定条件数 < 1/rcond である. |
[out] | rank | Aの有効ランク数, すなわち, 部分行列R11の次数. これはAの完全直交分解における部分行列T11の次数に等しい. |
[out] | work[] | 配列 work[lwork]
作業領域
info = 0の場合, work[0] にlworkの最適値を返す. |
[in] | lwork | 配列 work[]のサイズ.
ブロックアルゴリズムを使用しない場合, lwork >= max(1, mn+3*n+1, 2*mn+nrhs). ただし, mn = min(m, n).
ブロックアルゴリズムを使用する場合, lwork >= max(1, mn+2*n+nb*(n+1), 2*mn+nb*nrhs). ただし, nbはブロックサイズの上限値.
lwork = -1 の場合, 作業領域サイズの問い合わせとみなし, 最適サイズを求める計算だけを行い, work[0]にその値を返す. |
[out] | info | = 0: 正常終了
= -1: 入力パラメータ m の誤り (m < 0)
= -2: 入力パラメータ n の誤り (n < 0)
= -3: 入力パラメータ nrhs の誤り (nrhs < 0)
= -4: 入力パラメータ lda の誤り (lda < max(1, m))
= -6: 入力パラメータ ldb の誤り (ldb < max(1, m, n))
= -12: 入力パラメータ lwork の誤り (lworkが小さすぎる) |
- 出典
- LAPACK
|