IMSL_RETURN_USER, float x[] 。出力)
最小二乗解 x 含 大 さ n ー 割 当 配列
IMSL_RETURN_USER 用い 場合 関数 戻 値 配列 x へ インタ す IMSL_BASIS, float tol, int *kbasis 。入力 入力/出力)
float tol (入力)
非負 許容値 A 列 ッ 解に含 決定す に使用さ フ : tol = sqrt (imsl_amach(4))
int *kbasis (入力/出力)
解 使用さ 列 数 含 整数
|
r k+1 , k+1 | < |tol| * |
r1,1|
場合 kbasis = k こ プ ン 詳細 説明 参照し く さいフ : kbasis = min (m, n) IMSL_RESIDUAL, float **p_res 。出力)
残差ベク b -Ax 含 大 さ m 配列へ インタ ア 戻 必要
領域 こ 関数によ 割 当 ます 一般に float *p_res が宣言さ &p_res 引数 し 使用します
IMSL_RESIDUAL_USER, float res[] 。出力)
残差ベク b -Ax 含 大 さ m ー 割 当 配列 IMSL_FACTOR, float **p_qraux, float **p_qr 。出力)
float **p_qraux (入力/出力)
最初 min (m, n) 位置 Householder変換 τk 含 大 さ n 配列へ
インタ qraux ア 戻 必要 領域 こ 関数によ 割 当 ます
一般的に float *qraux が宣言さ &qraux が引数 し 使用さ ます
float **p_qr (入力/出力)
分解 定義す Householder変換 含 大 さ m × n 配列へ インタ ア こ
配列 厳密 下 角形部分 Q 構築す 情報 含 角形部分 R 含 ます
戻 必要 領域 こ 関数によ 割 当 ます 一般的に float *qr が宣言さ
&qr が引数 し 使用さ ます
IMSL_FACTOR_USER, float qraux[], float qr[] (入力/出力) float qraux[] (入力/出力)
最初 min 。m, n) 位置 Householder変換
τ
k 含 大 さ n ー 割当 配列
float qr[] (入力/出力)
分解 定義す Householder変換 含 大 さ m × n ー 割 当 配列 こ 配列
厳密 下 角形部分 Q 構築す 情報 含 角形部分 R 含 ます a ータが必要 け qr a 同 共有す こ が ます
IMSL_SOLVE が指定さ こ パ ータ 入力 そ 他 場合 出力に ます
IMSL_FAC_COL_DIM, int qr_col_dim 。入力)
QR 分解 含 配列 列次元
フ : qr_col_dim = n
IMSL_Q, float **p_q 。出力)
分解 直交行列 含 大 さ m×m 配列へ インタ ア
戻 必要 領域 こ 関数によ 割 当 ます 一般的に float *q が宣言さ
&q が引数 し 使用さ ます
IMSL_Q_USER, float q[] 。出力)
QR 分解 直交行列 Q 含 大 さ m × m ー 割 当 配列
IMSL_Q_COL_DIM, int q_col_dim 。入力) 分解 Q 行列 含 配列 列次元
フ : q_col_dim = m
IMSL_PIVOT, int pvt[] 。入力/出力)
望ま 変数順序 使用 情報 含 大 さ n 配列 こ 引数 IMSL_FACTOR_ONLY 又 IMSL_SOLVE_ONLY 共に使用さ ます
入力 pvt[k 1] > 0 あ A k 列が最初 列に ます
pvt[k 1] = 0 あ A 列 自由列 列 ッ 交換に い 交換さ こ が
ます pvt[k 1] < 0 あ A 列 k 最終列に ます 全 列が 最初 (又 最終) 列 し 指定さ ッ 交換 実行さ ませ (置換行列 P こ 場合 単位行列 す )
出力 pvt[k 1] 列 k に交換さ た元 行列 列 標識 含 ます
フ : pvt[k 1] = 0, k = 1, , n IMSL_FACTOR_ONLY
pvt 自由列 含 ッ 交換 定義さ た置換行列 P 行列AP QR 分解 け 計算します IMSL_FACTOR_ONLY が使用さ 追加 引数 IMSL_PIVOT
IMSL_FACTOR が必要に ます こ 場合に 引数 b 無視さ こ 関数 戻
値 NULL に ます IMSL_SOLVE_ONLY
こ 関数によ 事前に計算さ た QR 分解が与え 最小二乗問題 Ax = b 解 計算します IMSL_SOLVE_ONLY が使用さ 引数 IMSL_FACTOR_USER, IMSL_PIVOT IMSL_BASIS が要求さ 引数 a 無視さ ます
説明
関数 imsl_f_lin_least_squares_gen 列 ッ 選択 線形最小二乗問題 Ax = b 解 ます こ 行列 AP QR 分解 計算します ここ P ッ 交換 定義さ 置換行列 す こ また
|r
k+1 , k+1 | < |tol| *|r1,1|
満足す 最小整数 k 計算し 出力変数 kbasis に設定します Householder 変換Q
k l
ku
ku
kTq
k = 1,, min (m 1, n) が分解 計算す た に使用さ ます こ 分解 Q min (m-1,n)
…Q
1AP = R 形式 計算さ ます Q = Q1…Q min (m-1,n) す AP = QR す 各 Householder ベク uk 最初 k1 個 ン が ロ こ qr 列 k 一部 し 格納さ ます 形行列 R qr
最初 min (m, n) 行 形部 中に格納さ ます 最小二乗問題 解 x 角線形方程式 解くこ
によ 計算さ ます:
R (1: k,1: k) y (1: k) = (QTb)(1: k) k = kbasis
こ 解 y。k + 1 : n) ロに ッ し 変数 並び え x = Py 得 ます
IMSL_FACTOR_ONLY が指定さ こ 関数 入力値 pvt 自由 列間 列 ッ 定義さ
た P AP QR 分解 計算します 分解に先立 最初 列 こ 配列 頭に 最終列 尾に移動
さ ます 最初 最後 列 こ 計算 間 そ 以 置 換え 自由列 けが移動さ ます
IMSL_SOLVE_ONLY 指定す こ 関数 前に定義さ た QR 分解 Ax = b 最小二乗解 計算
します kbasis 個 列が解に使用さ ます 従 ,全 列が自由 場合 x フ 場合
説明さ ように計算さ ます
例題 1
こ 例題 3 未知数 あ 4 線形方程式 列 ッ 交換 使用す 最小二乗解 説明しま
す こ 問題 4 ータ値 最小二乗2次多項式当 同等 す 多項式 p(t) = x1
+ t
x2+ t
2x3 し ータ 組 (ti ,b i ) t i = 2i i = 1, 2, 3, 4 す Ax = b 解へ インタが 関 数 imsl_f_lin_least_squares_gen によ 返さ ます#include <imsl.h>
float a[] = {1.0, 2.0, 4.0, 1.0, 4.0, 16.0, 1.0, 6.0, 36.0, 1.0, 8.0, 64.0};
float b[] = {4.999, 9.001, 12.999, 17.001};
int main() {
int m = 4, n = 3;
float *x;
/* Solve Ax = b for x */
x = imsl_f_lin_least_squares_gen (m, n, a, b, 0);
/* Print x */
imsl_f_write_matrix ("Solution vector", 1, n, x, 0);
}
出力
Solution vector
1 2 3 0.999 2.000 0.000
例題 2
こ 例題 最初 例題 同 係数行列 A 使用します 列 ッ 交換法 A QR 分解 計算 します 最終 自由列 pvt によ 指定さ ッ 交換 自由列間 け 行わ ます
#include <imsl.h>
float a[] = {1.0, 2.0, 4.0, 1.0, 4.0, 16.0, 1.0, 6.0, 36.0, 1.0, 8.0, 64.0};
int pvt[] = {0, 0, -1};
int main() {
int m = 4, n = 3;
float *x, *b;
float *p_qraux, *p_qr;
float *p_q;
/* Compute the QR factorization */
/* of A with partial column */
/* pivoting */
x = imsl_f_lin_least_squares_gen (m, n, a, b, IMSL_PIVOT, pvt,
IMSL_FACTOR, &p_qraux, &p_qr, IMSL_Q, &p_q,
IMSL_FACTOR_ONLY, 0);
/* Print Q */
imsl_f_write_matrix ("The matrix Q", m, m, p_q, 0);
/* Print R */
imsl_f_write_matrix ("The matrix R", m, n, p_qr, IMSL_PRINT_UPPER,
0);
/* Print pivots */
imsl_i_write_matrix ("The Pivot Sequence", 1, n, pvt, 0);
}
出力
The matrix Q
1 2 3 4 1 -0.1826 -0.8165 0.5000 -0.2236
2 -0.3651 -0.4082 -0.5000 0.6708
3 -0.5477 0.0000 -0.5000 -0.6708
4 -0.7303 0.4082 0.5000 0.2236
The matrix R
1 2 3 1 -10.95 -1.83 -73.03 2 -0.82 -16.33
3 8.00
The Pivot Sequence 1 2 3 2 1 3
例題 3
こ 例題 最初 例題 行列 A 列 ッ 交換 QR 分解 計算します こ Ax = bi 最 小二乗解 計算します i = 1, 2, 3
#include <imsl.h>
#include <stdio.h>
float a[] = {1.0, 2.0, 4.0, 1.0, 4.0, 16.0, 1.0, 6.0, 36.0, 1.0, 8.0, 64.0};
float b[] = {4.999, 9.001, 12.999, 17.001, 2.0, 3.142, 5.11, 0.0,
1.34, 8.112, 3.76, 10.99};
int pvt[] = {0, 0, 0};
int main() {
int m = 4, n = 3;
int i, k = 3;
float *p_qraux, *p_qr;
float tol = 1.e-4;
int *kbasis;
float *x, *p_res;
/* Factor A with the given pvt */
/* setting all variables to */
/* be imsl_free */
imsl_f_lin_least_squares_gen (m, n, a, b, IMSL_BASIS, tol, &kbasis,
IMSL_PIVOT, pvt,
IMSL_FACTOR, &p_qraux, &p_qr, IMSL_FACTOR_ONLY,
0);
/* Print some factorization */
/* information*/
printf("Number of Columns in the base\n%2d", kbasis);
imsl_f_write_matrix ("Upper triangular R Matrix", m, n, p_qr, IMSL_PRINT_UPPER,
0);
imsl_i_write_matrix ("The output column order ", 1, n, pvt, 0);
/* Solve Ax = b for each x */
/* given the factorization */
for ( i = 0; i < k; i++) {
x = imsl_f_lin_least_squares_gen (m, n, a, &b[i*m], IMSL_BASIS, tol, &kbasis,
IMSL_PIVOT, pvt,
IMSL_FACTOR_USER, p_qraux, p_qr, IMSL_RESIDUAL, &p_res,
IMSL_SOLVE_ONLY, 0);
/* Print right-hand side, b */
/* and solution, x */
imsl_f_write_matrix ("Right-hand side, b ", 1, m, &b[i*m], 0);
imsl_f_write_matrix ("Solution, x ", 1, n, x, 0);
/* Print residuals, b - Ax */
imsl_f_write_matrix ("Residual, b - Ax ", 1, m, p_res, 0);
} }
出力
Number of Columns in the base 3
Upper triangular R Matrix 1 2 3 1 -75.26 -10.63 -1.59 2 -2.65 -1.15 3 0.36
The output column order 1 2 3
3 2 1
Right-hand side, b 1 2 3 4 5 9 13 17
Solution, x
1 2 3 0.999 2.000 0.000
Residual, b - Ax
1 2 3 4 -0.0004 0.0012 -0.0012 0.0004
Right-hand side, b 1 2 3 4 2.000 3.142 5.110 0.000
Solution, x
1 2 3
-4.244 3.706 -0.391
Residual, b - Ax
1 2 3 4 0.395 -1.186 1.186 -0.395
Right-hand side, b 1 2 3 4 1.34 8.11 3.76 10.99
Solution, x
1 2 3 0.4735 0.9437 0.0286
Residual, b - Ax
1 2 3 4 -1.135 3.406 -3.406 1.135
重大 ー
IMSL_SINGULAR_TRI_MATRIX 入力 角行列 特異 す 最初 ロ 対角項
イン ック # す