• 検索結果がありません。

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 配列へ

インタ 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

当 配列

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  

k

u

k

u

kT

q

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 最初 k

1 個 ン が ロ こ 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 入力 角行列 特異 す 最初 ロ 対角項

イン ック # す