A LL T 分解 含 大 さ n × n 配列へ インタ ア 戻 必要 領域が imsl_f_lin_sol_posdef によ 割 当 ます こ 配列 下 角部分 L 角部分 LT 含 ます 一般的に float *p_factor が宣言さ &p_factor が引数 し 使用さ ます
IMSL_FACTOR_USER, float factor[] 。入力/出力)
A LL T 分解 含 大 さ n × n ー 割 当 配列 こ 配列 下 角部分
L 含 角部分 LT 含 ます A が必要 け a factor 同
領域 共有 ます IMSL_SOLVE が指定さ こ パ ータ 入力 す
そ 他 場合 出力に ます
IMSL_FAC_COL_DIM, int fac_col_dim 。入力)
A LL T 分解 含 配列 列次元
フ : fac_col_dim = n IMSL_INVERSE, float **p_inva 。出力)
A 逆行列 含 大 さ n × n 配列へ インタ ア 戻 必要 領域
imsl_f_lin_sol_posdef によ 割 当 ます 一般に float *p_inva が宣言 さ &p_inva が引数 し 使用さ ます
IMSL_INVERSE_USER, float inva[] 。出力)
A 逆行列 含 大 さ n × n ー 割 当 配列
IMSL_INV_COL_DIM, int inva_col_dim 。入力)
A 逆行列 含 配列 列次元
フ : inva_col_dim = n IMSL_CONDITION, float *cond 。出力)
行列 A L1 条件数 推定値 含 インタ こ プ ン
IMSL_SOLVE_ONLY 共に使用す こ ませ
IMSL_FACTOR_ONLY
A コ キー分解 LL T 計算します IMSL_FACTOR_ONLY が使用さ 場合 IMSL_FACTOR 又 IMSL_FACTOR_USER い が必要に ます 引数 b こ 時 無視さ imsl_f_lin_sol_posdef 戻 値 NULL に ます
IMSL_SOLVE_ONLY
前に imsl_f_lin_sol_posdef によ 計算さ た LL T が与え Ax = b 解
ます フ Ax = b 解 imsl_f_lin_sol_posdef によ 指定さ
います IMSL_SOLVE_ONLY が使用さ 引数 IMSL_FACTOR_USER が必要に 引数 a 無視さ ます
IMSL_INVERSE_ONLY
A 逆行列 計算します IMSL_INVERSE_ONLY 使用す IMSL_INVERSE 又 IMSL_INVERSE_USER が必要に ます 引数 b 無視さ
imsl_f_lin_sol_posdef 戻 値 NULL に ます
説明
関数 imsl_f_lin_sol_posdef 対称正定値係数行列 A 持 線形方程式 解 ます こ 関数 最 初に A コ キー分解 LLT 計算します 線形方程式 解 そ 単純 方程式 y = L-1 b x
= L
-T y 解くこ によ 得 ます 線形方程式 解 あ い 逆行列 求 A L1 条件数Dongarraそ 他。1979年) 同 ア 使用し 計算さ ます 推定さ た条件数が 1/εよ
も大 い場合 ここ ε ン精度 警告 ッ ージが出ます こ A 非常に小さい変化が解 x 大 い変化 生 こ 意味します
関数 imsl_f_lin_sol_posdef 分解 下 角行列 L が ロ 対角要素 持 場合 ー ま
す
例題 1
ここ 対称正定値係数行列 持 次 3元連立方程式 解 ます x1
- 3x
2+ 2x
3= 27
-3x
1+ 10x
2- 5x
3= -78 2x
1- 5x
2+ 6x
3= 64
#include <imsl.h>
int main() {
int n = 3;
float *x;
float a[] = {1.0, -3.0, 2.0, -3.0, 10.0, -5.0, 2.0, -5.0, 6.0};
float b[] = {27.0, -78.0, 64.0};
/* Solve Ax = b for x */
x = imsl_f_lin_sol_posdef (n, a, b, 0);
/* Print x */
imsl_f_write_matrix ("Solution, x, of Ax = b", 1, n, x, 0);
}
出力
Solution, x, of Ax = b
1 2 3
1 –4 7
例題 2
こ 例題 最初 例題 同 3元線形方程式 解 ますが 今回 A LL T 分解 求 ます そ 解x 主プログ に割 当 た配列に返さ ます
#include <imsl.h>
int main() {
int n = 3;
float x[3], *p_factor;
float a[] = {1.0, -3.0, 2.0, -3.0, 10.0, -5.0, 2.0, -5.0, 6.0};
float b[] = {27.0, -78.0, 64.0};
/* Solve Ax = b for x */
imsl_f_lin_sol_posdef (n, a, b, IMSL_RETURN_USER, x, IMSL_FACTOR, &p_factor, 0);
/* Print x */
imsl_f_write_matrix ("Solution, x, of Ax = b", 1, n, x, 0);
/* Print Cholesky factor of A */
imsl_f_write_matrix ("Cholesky factor L, and trans(L), of A", n, n, p_factor, 0);
}
出力
Solution, x, of Ax = b
1 2 3
1 -4 7
Cholesky factor L, and trans(L), of A
1 2 3
1 1 -3 2
2 -3 1 1
3 2 1 1
例題 3
こ 例題 最初 同 方程式 解 ますが A コ キー因子が与え ます
#include <imsl.h>
int main() {
int n = 3;
float *x, *a;
float factor[ ] = {1.0, -3.0, 2.0, -3.0, 1.0, 1.0, 2.0, 1.0, 1.0};
float b[ ] = {27.0, -78.0, 64.0};
/* Solve Ax = b for x */
x = imsl_f_lin_sol_posdef (n, a, b, IMSL_FACTOR_USER, factor, IMSL_SOLVE_ONLY,
0);
/* Print x */
imsl_f_write_matrix ("Solution, x, of Ax = b", 1, n, x, 0);
}
出力
Solution, x, of Ax = b
1 2 3
1 –4 7
警告 ー
IMSL_ILL_CONDITIONED 入力行列 非常に悪条件 す L1 条件数 逆数 推定値
"rcond" = # す 解 恐 く正確 あ ませ
重大 ー
IMSL_NONPOSITIVE_MATRIX 入力行列 先 # × # 小行列 正定値 あ ませ IMSL_SINGULAR_MATRIX 入力行列 特異 す
IMSL_SINGULAR_TRI_MATRIX 入力 角行列 特異 す 最 初 ロ 対角要素 指標 # す