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

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 コ キー分解 LLTRTR 計算します

こ 分解ア 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

ii

a

kk

k 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 1

2 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年 ージ. 886 10105) こ 問題 分解 解 計算 説明します

#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 非負定値 あ ませ