IMSL_FACTOR_USER, float factor[] 。入力/出力)
A LLT 分解 含 大 さ n×n ー 割 当 配列 factor 下 角部分
L 含 角部分 LT 含 ます a が必要 け a factor 同 領域
にす こ が ます IMSL_SOLVE が指定さ こ パ ータ 入力 す
そ 他 場合 出力に ます
IMSL_FAC_COL_DIM, int fac_col_dim 。入力)
LLT 分解 含 配列 列次元
フ : fac_col_dim = n IMSL_INVERSE, float **p_inva 。出力)
A 逆行列 含 大 さ n ×n 配列へ インタ ア こ 配列 領域
imsl_f_lin_sol_nonnegdef によ 割 当 ます 一般的に float *p_inva が宣言さ &p_inva が引数 し 使用さ ます
IMSL_INVERSE_USER, float inva[] 。出力)
A 逆行列 含 大 さ n ×n ー 割 当 配列 a が必要 け a
factor 同 領域にす こ が ます A 領域 同時に A 分解 逆行列に
ませ
IMSL_INV_COL_DIM, int inva_col_dim 。入力)
A 逆行列 含 配列 列次元
フ : inva_col_dim = n IMSL_TOLERANCE, float tol 。入力)
線形依存性 決定に使用さ 許容値
フ tol = 100*imsl_f_machine(4)
第 12 章 ー imsl_f_machine 説明 参照し く さい IMSL_FACTOR_ONLY
A LLT 分解 け 計算します 引数 b 無視さ IMSL_FACTOR 又 IMSL_FACTOR_USER プ ン引数が必要 す
IMSL_SOLVE_ONLY
こ 関数 先に計算さ た分解 使用し Ax = b 解 ます 引数 a 無視さ プ ン引数 IMSL_FACTOR_USER が必要 す
IMSL_INVERSE_ONLY
A 逆行列 け 計算します 引数 b 無視さ IMSL_INVERSE 又 IMSL_INVERSE_USER プ ン引数が必要 す
説明
関数 imsl_f_lin_sol_nonnegdef 対称非負定値 正 準定値 係数行列 持 線形方程式 解 ま す こ 最初に係数行列 A コ キー分解 LLT 又 RTR 計算します
こ 分解ア Healy 。1968年) に基 列毎に逐次処理さ ます 次式が成立す 場合
i 番目 列 最初 i 1 個 列に線形依存す 宣言さ ます:
ii i
j ji
ii
r a
a
1
1 2
ここ ε tol 指定さ ー によ 設定さ ます 線形依存性が宣言さ R i 番 目 行 L 列 全要素 ロに ッ さ ます
Farebrother Berry 。1974年) よび Barrett Healy 。1978年) によ 非負定値 い行列 チ ックす
た 修正がこ 関数に組 入 あ ます 関数 imsl_f_lin_sol_nonnegdef 次 い 条件が成 立 A が非負定値 い 宣言し ー・ ッ ージ 出します:
1. i ii
j ji
ii
r a
a
1 1
2
2. rii
0
a r r a
iia
kkk i
i
j jk ji
ik
1
,
1
Healy 。1968年) ア 関数 imsl_f_lin_sol_nonnegdef 行列 A R が同
領域 共有す こ 許します Barrett Healy 。1978年) こ こ 無視し います 関数
imsl_f_lin_sol_nonnegdef こ 問題 救済す た に 条件 aii に対し
1 12 i
j
r
ij使用します
行列 A 逆行列が要求さ こ 行列が 数値的に 正定値 け 計算さ 逆行列 A 対 称 g2 逆行列に ます 行列 G が行列 A 対称 g2 逆行列 あ に G 次 Moore-Penrose 逆行列 条件1 2 満足し く ませ が 一般に 条件3 4 満たせませ G がA
Moore-Penrose 逆行列に 4 条件 次 通 す:
1. AGA = A 2. GAG = G 3. AG 対称 4. GA 対称
線形方程式 Ax = b 解 2 連続す 角線形方程式 し 線形方程式 分解さ たバージ ン
RTRx = b 解くこ によ 計算さ ます 角線形方程式 解く に R 行 要素が全 ロ
あ 場合 解ベク 対応す 要素 ロに ッ さ ます こ ア 詳細 Sallas Lionti
。1988年) 第2節 参照し く さい
例題 1
4 線形方程式 解 ます Maindonald。1984年 ージ. 886 10105) こ 問題 分解 解 計算 説明します
#include <imsl.h>
int main() {
int n = 4;
float *x;
float a[] = {36.0, 12.0, 30.0, 6.0, 12.0, 20.0, 2.0, 10.0, 30.0, 2.0, 29.0, 1.0, 6.0, 10.0, 1.0, 14.0};
float b[] = {18.0, 22.0, 7.0, 20.0};
/* Solve Ax = b for x */
x = imsl_f_lin_sol_nonnegdef(n, a, b, 0);
/* Print solution, x, of Ax = b */
imsl_f_write_matrix("Solution, x", 1, n, x, 0);
}
出力
Solution, x
1 2 3 4 0.167 0.500 0.000 1.000
例題 2
最初 例題 対称非負定値行列 最初 lin_sol_nonnegdef 呼び出し 分解 け 計算す に使用します こ 分解に必要 領域 ー が提供します 2番目 呼び出し LL T 分解 最初 例題 右辺ベク 入力 し 解x 求 ます こ 解 x 得 別 方法 説明し います
#include <imsl.h>
int main() {
int n = 4, a_col_dim = 6;
float factor[36], x[5];
float a[] = {36.0, 12.0, 30.0, 6.0, 12.0, 20.0, 2.0, 10.0, 30.0, 2.0, 29.0, 1.0, 6.0, 10.0, 1.0, 14.0};
float b[] = {18.0, 22.0, 7.0, 20.0};
/* Factor A */
imsl_f_lin_sol_nonnegdef(n, a, b,
IMSL_FACTOR_USER, factor, IMSL_FAC_COL_DIM, a_col_dim, IMSL_FACTOR_ONLY,
0);
/* NULL is returned in */
/* this case. Another */
/* way to obtain the */
/* factor is to use the */
/* IMSL_FACTOR option. */
imsl_f_write_matrix("factor", n, n, factor, IMSL_A_COL_DIM, a_col_dim, 0);
/* Get the solution using */
/* the factorized matrix. */
imsl_f_lin_sol_nonnegdef(n, a, b,
IMSL_FACTOR_USER, factor, IMSL_FAC_COL_DIM, a_col_dim, IMSL_RETURN_USER, x,
IMSL_SOLVE_ONLY, 0);
imsl_f_write_matrix("Solution, x, of Ax = b", 1, n, x, 0);
}
出力
factor
1 2 3 4
1 6 2 5 1
2 2 4 -2 2 3 5 -2 0 0
4 1 2 0 3
Solution, x, of Ax = b
1 2 3 4
0.167 0.500 0.000 1.000
例題 3
こ 例題 プ ンIMSL_INVERSE 使用し 最初 例題 対称非負行列 対称 g 逆
計算します Maindonald(1984年 ージ106) こ 問題 計算 説明し います
#include <imsl.h>
int main()
{
int n = 4;
float *p_a_inva, *p_a_inva_a, *p_inva;
float a[] =
{36.0, 12.0, 30.0, 6.0, 12.0, 20.0, 2.0, 10.0, 30.0, 2.0, 29.0, 1.0, 6.0, 10.0, 1.0, 14.0};
/* Get g2_inverse(a) */
imsl_f_lin_sol_nonnegdef(n, a, NULL, IMSL_INVERSE, &p_inva,
IMSL_INVERSE_ONLY, 0);
/* Form a*g2_inverse(a) */
p_a_inva = imsl_f_mat_mul_rect("A*B", IMSL_A_MATRIX, n, n, a,
IMSL_B_MATRIX, n, n, p_inva, 0);
/* Form a*g2_inverse(a)*a */
p_a_inva_a = imsl_f_mat_mul_rect("A*B", IMSL_A_MATRIX, n, n, p_a_inva, IMSL_B_MATRIX, n, n, a,
0);
imsl_f_write_matrix("The g2 inverse of a", n, n, p_inva, 0);
imsl_f_write_matrix("a*g2_inverse(a)\nviolates condition 3 of"
" the M-P inverse", n, n, p_a_inva, 0);
imsl_f_write_matrix("a = a*g2_inverse(a)*a\ncondition 1 of"
" the M-P inverse", n, n, p_a_inva_a, 0);
}
出力
The g2 inverse of a
1 2 3 4
1 0.0347 -0.0208 0.0000 0.0000 2 -0.0208 0.0903 0.0000 -0.0556 3 0.0000 0.0000 0.0000 0.0000 4 0.0000 -0.0556 0.0000 0.1111
a*g2_inverse(a)
violates condition 3 of the M-P inverse
1 2 3 4
1 1.0 -0.0 0.0 0.0
2 0.0 1.0 0.0 0.0
3 1.0 -0.5 0.0 0.0
4 0.0 -0.0 0.0 1.0
a = a*g2_inverse(a)*a condition 1 of the M-P inverse
1 2 3 4
1 36 12 30 6
2 12 20 2 10
3 30 2 29 1
4 6 10 1 14
警告 ー
IMSL_INCONSISTENT_EQUATIONS_2 こ 線形方程式 矛盾し います
IMSL_NOT_NONNEG_DEFINITE こ 行列 A 非負定値 あ ませ