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

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

LLPL P 用い L-1 再構成す に必要 情報が含ま います

因子 Pi L i 部分 ッ 交換によ 決定さ ます Pii p_pvt[i-1] 交換さ た単位 行列 す Lii 対角 下に挿入さ た 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

-1

U 再構成す :

L-1 = L2P2L1P1

Pi 行 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が 交換さ

Lii 対角 下に 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 入力行列 特異 す