IMSL_RETURN_USER, float x[] 。出力)
解 x 含 長さ n ー 割 当 配列 IMSL_FACTOR, int **p_pvt, float **p_factor 。出力)
int **p_pvt 。出力)
分解 ッ 列 含 長さn 配列へ インタ ア 戻 必要 領域 imsl_f_lin_sol_gen によ 割 当 ます 一般にint *p_pvt が宣言さ
&p_pvt が引数 し 使用さ ます float **p_factor 。出力)
列 ッ 交換 A LU 分解 含 大 さ n × n 配列へ インタ ア
戻 必要 領域 imsl_f_lin_sol_gen によ 割 当 ます こ 配
列 下 角部分 L 構成す た に必要 情報 含 角部分 U 含 ます (例題2 参照) 一般にfloat *p_factor が宣言さ &p_factorが引数 し 使用さ
ます
IMSL_FACTOR_USER, int pvt[], float factor[] 。入力/出力) int pvt[] 。入力/出力)
分解 ッ 列 含 大 さ n ー 割 当 配列 float factor[] 。入力/出力)
A LU 分解 含 大 さ n × n ー 割 当 配列 こ 配列 厳密 下 角
部分 L 構成す た に必要 情報 また 角部分 U 含 ます (例題2
参照) A が必要 け factor a 同 領域 共有します
IMSL_SOLVE が指定さ こ パ ータ 入力 す そ 他 場合 出力に ま
す
IMSL_FAC_COL_DIM, int fac_col_dim 。入力)
A LU 分解 含 大 さ n × n 配列 列次元
フ : fac_col_dim = n
IMSL_INVERSE, float **p_inva 。出力)
行列 A 逆行列 含 大 さ n x n 配列へ インタ ア
戻 必要 領域 imsl_f_lin_sol_gen によ 割 当 ます
一般に 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 LU 分解 計算します IMSL_FACTOR_ONLY 使用す IMSL_FACTOR 又 IMSL_FACTOR_USER い が必要に ます 引数 b そ 時 無視さ imsl_f_lin_sol_gen 戻 値 NULL に ます
IMSL_SOLVE_ONLY
imsl_f_lin_sol_gen によ 前も 計算さ た LU 分解があ Ax = b 解
ます フ Ax = b 解 imsl_f_lin_sol_gen.によ 指定さ ます
IMSL_SOLVE_ONLY 使用す 場合 引数IMSL_FACTOR_USER が必要に 引数 a 無視さ ます
IMSL_INVERSE_ONLY
行列 A 逆行列 計算します IMSL_INVERSE_ONLY 使用す IMSL_INVERSE 又 IMSL_INVERSE_USER が必要に ます 引数 b そ 際無視さ
imsl_f_lin_sol_gen 戻 値 NULLに ます
説明
関数 imsl_f_lin_sol_gen 実係数行列 A 持 線形方程式 解 ます こ 最初に L-1A =U 部分 ッ 選択 A LU 分解 計算します F プ ン引数 IMSL_FACTOR 計算さ
行列 p_factor します 角行列 U F 角に格納さ ます F 厳密 下 角に
1 n1 n1 1 1
L LPL P 用い L-1 再構成す に必要 情報が含ま います
因子 Pi L i 部分 ッ 交換によ 決定さ ます Pi 行 i p_pvt[i-1] 交換さ た単位 行列 す Li 列 i 対角 下に挿入さ た F j i (j = i + 1, …, ni) 単位行列 す
こ 分解 効率 ン大学 Ann Arbor, Michigan Leonard J. Harding ープアンロー ング ジ
ャ ング 技術に基 い います 線形方程式 解 2 よ 簡単 方程式 y = L-1b x = U-1y 解くこ によ 得 ます 線形方程式 また 逆行列 解が得 A L1 条件数 推定
値が Dongarraそ 他。1979年) 同 ア 使用し 計算さ ます 推定さ た条件数が 1/ε
ここにε ン精度 よ 大 い場合 警告 ッ ージが出ます こ A 非常に小さい変化が
解 x 大 い変化 生 こ 示し います 関数 imsl_f_lin_sol_gen 分解 角部分 U
が ロ 対角要素 持 ー ます
例題 1
こ 例題 3元線形方程式 解 ます こ こ 関数 最も簡単 使用法 す 方程式 次 通 す:
x1
+ 3x
2+ 3x
3= 1
x1+ 3x
2+ 4x
3= 4
x1+ 4x
2+ 3x
3= 1
#include <imsl.h>
int main() {
int n = 3;
float *x;
float a[] = {1.0, 3.0, 3.0, 1.0, 3.0, 4.0, 1.0, 4.0, 3.0};
float b[] = {1.0, 4.0, -1.0};
/* Solve Ax = b for x */
x = imsl_f_lin_sol_gen (n, a, b, 0);
/* Print x */
imsl_f_write_matrix ("Solution, x, of Ax = b", 1, 3, x, 0);
}
出力
Solution, x, of Ax = b 1 2 3
-2 -2 3
例題 2
こ 例題 転置問題 ATx = b 解 部分 ッ 交換法 A LU 分解 返します 最初 問
題 同 ータが使用さ インプログ に割 当 た配列に解 x =A-Tb 返します L
行列 陰形式 返さ ます
#include <imsl.h>
int main() {
int n = 3, pvt[3];
float factor[9];
float x[3];
float a[] = {1.0, 3.0, 3.0, 1.0, 3.0, 4.0, 1.0, 4.0, 3.0};
float b[] = {1.0, 4.0, -1.0};
/* Solve trans(A)*x = b for x */
imsl_f_lin_sol_gen (n, a, b, IMSL_TRANSPOSE, IMSL_RETURN_USER, x,
IMSL_FACTOR_USER, pvt, factor, 0);
/* Print x */
imsl_f_write_matrix ("Solution, x, of trans(A)x = b", 1, n, x, 0);
/* Print factors and pivot sequence */
imsl_f_write_matrix ("LU factors of A", n, n, factor, 0);
imsl_i_write_matrix ("Pivot sequence", 1, n, pvt, 0);
}
出力
Solution, x, of trans(A)x = b
1 2 3
4 -4 1 LU factors of A
1 2 3
1 1 3 3
2 -1 1 0 3 -1 0 1 Pivot sequence
1 2 3 1 3 3
factor L
-1U 再構成す :
L-1 = L2P2L1P1Pi 行 i 行 pvt[i-1] が交換さ た単位行列 す
pvt = 1, 3, 3
1
1 0 0 0 1 0 0 0 1 P
行 1 行 pvt[0], あ い 行 1 が交 換さ 結果 単位行列
2
1 0 0 0 0 1 0 1 0 P
行 2 行 pvt
[
1], あ い 行 3が 交換さLi 列 i 対角 下に Fji (j = i + 1, …, n) 持 単位行列 す ここ F factor す
1 3 3 1 1 0 1 0 1
factor
1
1 0 0 1 1 0 1 0 1 L
factor 列 1 2番目 3 番目 要素が列 1 対角 下 に挿入さ
2
1 0 0 0 1 0 0 0 1 L
factor 列 2 3番目 要 素が列 2 対角 下に挿入さ
1 2 2 1 1
1 0 0 1 0 1 1 1 0 L L P L P
U factor 角 す
1 3 3 0 1 0 0 0 1 U
例題 3
こ 例題 最初 例題 3 × 3 行列 A 逆行列 計算し 同 方程式 解 ます 行列積 C
= A
-1A 計算しプ ン します 関数 imsl_f_mat_mul_rect C 計算し 近似結果 C = I 得ます#include <imsl.h>
float a[] = {1.0, 3.0, 3.0, 1.0, 3.0, 4.0, 1.0, 4.0, 3.0};
float b[] = {1.0, 4.0, -1.0};
int main() {
int n = 3;
float *x;
float *p_inva;
float *C;
/* Solve Ax = b */
x = imsl_f_lin_sol_gen (n, a, b, IMSL_INVERSE, &p_inva,
0);
/* Print solution */
imsl_f_write_matrix ("Solution, x, of Ax = b", 1, n, x, 0);
/* Print input and inverse matrices */
imsl_f_write_matrix ("Input A", n, n, a, 0);
imsl_f_write_matrix ("Inverse of A", n, n, p_inva, 0);
/* Check result and print */
C = imsl_f_mat_mul_rect("A*B", IMSL_A_MATRIX, n, n, p_inva, IMSL_B_MATRIX, n, n, a, 0);
imsl_f_write_matrix ("Product matrix, inv(A)*A",n,n,C,0);
}
出力
Solution, x, of Ax = b 1 2 3
-2 -2 3 Input A
1 2 3
1 1 3 3
2 1 3 4
3 1 4 3
Inverse of A
1 2 3
1 7 -3 -3 2 -1 0 1 3 -1 1 0
Product matrix, inv(A)*A
1 2 3
1 1 0 0
2 0 1 0
3 0 0 1
例題 4
こ 例題 2 方程式 解 ます こ 右辺 けが異 ます こ 行列 1番目 右辺
最初 例題 与え います 2番目 右辺ベク
c = [0.5, 0.3, 0.4]
T す LU分解 情報最初 計算さ 2番目 解 計算す た に使用さ ます LU分解 最初 ップ 計算さ
2番目 解 計算す 際に 行わ ませ
#include <imsl.h>
int main() {
int n = 3, pvt[3];
float factor[9];
float *x,*y;
float a[] = {1.0, 3.0, 3.0, 1.0, 3.0, 4.0, 1.0, 4.0, 3.0};
float b[] = {1.0, 4.0, -1.0};
float c[] = {0.5, 0.3, 0.4};
/* Solve A*x = b for x */
x = imsl_f_lin_sol_gen (n, a, b,
IMSL_FACTOR_USER, pvt, factor, 0);
/* Print x */
imsl_f_write_matrix ("Solution, x, of Ax = b", 1, n, x, 0);
/* Solve for A*y = c for y */
y = imsl_f_lin_sol_gen (n, a, c, IMSL_SOLVE_ONLY,
IMSL_FACTOR_USER, pvt, factor, 0);
imsl_f_write_matrix ("Solution, y, of Ay = c", 1, n, y, 0);
}
出力
Solution, x, of Ax = b
1 2 3
-2 -2 3 Solution, y, of Ay = c
1 2 3
1.4 -0.1 -0.2
警告 ー
IMSL_ILL_CONDITIONED 入力行列 非常に悪条件 す L1 条件数 逆数 推定値
"rcond"=# す 解 恐 く正確 あ ませ
重大 ー
IMSL_SINGULAR_MATRIX 入力行列 特異 す