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

lin_sol_posdef_coordinate ( 複素数 )

Imsl_symbolic_factor 構造体 詳細 次 通

パ ータ ータ型 説明

nzsub int ** Cholesky因子 非 ロ 非対角要素に対す

縮行指標 含 配列へ インタ

xnzsub int ** *nzsub に対す イン ック 含 長さ

n + 1 配列へ インタ Cholesky因子 列 j にあ 非 ロ 要素に対す 行指標 (*nzsub)[(*xnzsub)[j]]) 始ま 連 続領域に格納さ

maxsub int 指標 し 使わ 配列 *nzsub 要素

数 *nzsub 大 さ maxsub よ 大 いこ もあ こ に注意

xlnz int ** 長さ n + 1 配列へ インタ こ 配

列 *alnz 非 ロ 非対角要素 抽出

す に使わ 始 終わ イン ック

含 alnz に い プ ン引

数 IMSL_RETURN_NUMERIC_FACTOR 説 明 参照 因子行列 列 j に対し *alnz

始 終わ イン ック そ

(*xlnz)[j] (*xlnz)[j + 1] に格納 さ

maxlnz int Cholesky 因子 非 ロ非対角要素 数

perm int ** 置換ベク 含 長さ n 配列へ イ

ンタ

invp int ** 逆置換ベク 含 長さ n 配列へ

インタ

multifrontal_space int フロンタ 行列 タック た に必要 作

業用領域 大 さ チフロンタ 因子分 解が用い い場合 こ 値 ロに ッ さ

こ 構造体内 アロ ー さ た 解放す に 関数 imsl_free_symbolic_factor 使うこ

IMSL_SUPPLY_SYMBOLIC_FACTOR, Imsl_symbolic_factor *sym_factor (入力)

Imsl_symbolic_factor 型 構造体へ インタ こ 構造体 入力行列 ン ック分

解 含 IMSL_RETURN_SYMBOLIC_FACTOR プ ン 用いた imsl_c_lin_sol_posdef_coordinate によ 計算さ ます IMSL_SYMBOLIC_FACTOR_ONLY

入力行列 ン ック分解 計算します 引数 b 無視さ ます IMSL_RETURN_NUMERIC_FACTOR, Imsl_c_numeric_factor *num_factor (出力)

戻 入力行列 数値分解 含 Imsl_c_numeric_factor 型 構造体へ インタ

Imsl_c_numeric_factor構造体 詳細 次 通 パ ータ ータ型 説明

nzsub int ** Cholesky因子 非 ロ 非対角要素に対す 行指標 含 配列へ インタ こ 配列 長さ nz 割 当

が 配列 全 要素 使うこ い xnzsub int ** nzsub に対す 指標 含 長さ n + 1 配列へ

インタ Cholesky因子 列 j にあ 非 ロ 要素に対 す 行指標 nzsub[xnzsub[j]] 始ま 連続領域 に格納さ

xlnz int ** 長さ n + 1 配列へ インタ こ 配列 alnz

非 ロ 非対角要素 抽出す に使わ 始 終わ 指標 含 因子行列 列 j に対し

alnz 始 終わ 指標 そ xlnz[j]

xlnz[j + 1] に格納さ

alnz f_complex ** 長さ nz - n 配列 Cholesky因子 非 ロ 非対 角要素 含

perm int ** 置換ベク 含 長さ n 配列へ インタ

diag f_complex ** Cholesky因子 対角要素 含 長さ n 配列へ イ ンタ

L a 数値的 因子 します に述べた構造体 L 対角要素 diag に格納さ ます L 非 ロ 非対角要素 alnzに格納さ ます 列jに対し alnz L 非 ロ要素 抽出

す に使わ 始 終わ 指標 そ xlnz[j] xlnz[j + 1] に格納さ ます L

非 ロ 要素 列指標 nzsub にあ ます xnzsub[i] 列iに対し L 行指標 抽出す

始 nzsub 指標 含 ます 次 コー 構造体 成分 因子行列L 下 角

再構築す や 方 示します:

Imsl_c_numeric_factor numfctr;

. .

for (i = 0; i < n; i++){

L[i][i] = (*numfctr.diag)[i];

if((*numfctr.xlnz)[i] > (nz-n)+1) break;

start = (*numfctr.xlnz)[i]-1;

stop = (*numfctr.xlnz)[i+1]-1;

k = (*numfctr.xnzsub)[i]-1;

for (j = start; j < stop; j++){

L[(*numfctr.nzsub)[k]-1][i] = (*numfctr.alnz)[j];

k++;

} }

こ 構造体内 アロ ー さ た 解放す に 関数 imsl_c_free_numeric_factor 使うこ

IMSL_SUPPLY_NUMERIC_FACTOR, Imsl_c_numeric_factor *num_factor 。入力)

Imsl_c_numeric_factor型 構造体 指す インタ こ 構造体

IMSL_RETURN_NUMERIC_FACTOR プ ン

imsl_c_lin_sol_posdef_coordinate によ 計算さ た入力行列 数値的分解 含 います こ 構造体 プ ン引数 IMSL_RETURN_NUMERIC_FACTOR に説明さ います

こ 構造体内 アロ ー さ た 解放す に 関数 imsl_c_free_numeric_factor 使うこ

IMSL_NUMERIC_FACTOR_ONLY,

入力行列 数値的分解 計算し 返します 引数 b 無視さ ます IMSL_SOLVE_ONLY,

A 数値的 又 ン ック分解が与え Ax = b 解 ます こ プ ン IMSL_SUPPLY_NUMERIC_FACTOR 又 IMSL_SUPPLY_SYMBOLIC_FACTOR 使用 必 要 します

IMSL_MULTIFRONTAL_FACTORIZATION,

チフロンタ 法 使用し 数値的分解 実行します フ 疎 縮格納方式に

基 い 標準 分解 計算します

IMSL_RETURN_USER, f_complex x[] 。出力)

x 含 長さ n ー 割 当 配列

IMSL_SMALLEST_DIAGONAL_ELEMENT, float *small_element 。出力)

数値的分解 発生す 最小 対角要素 含 へ インタ こ プ ン 数値的分解が imsl_c_lin_sol_posdef_coordinate 呼び出し 計算さ 場合

有効 す

IMSL_LARGEST_DIAGONAL_ELEMENT, float *large_element 。出力)

数値的分解 発生す 最大 対角要素 含 へ インタ こ プ ン 数値的分解が imsl_c_lin_sol_posdef_coordinate 呼び出し 計算さ 場合

有効 す

IMSL_NUM_NONZEROS_IN_FACTOR, int *num_nonzeros 。出力) 分解因子 非 ロ 合計数 含 へ インタ

IMSL_CSC_FORMAT, int *col_ptr, int *row_ind, float *values 。入力)

縮した疎 列形式。CSC) 係数行列 受け入 ます こ 格納方式 説明 イン ロ ダク ン 参照し く さい

説明

関数 imsl_c_lin_sol_posdef_coordinate 疎 ー 正定値係数行列A 持 線形方程式 解 ます こ 関数 フ 使用法 最初に係数行列 置換 ン ック分解が計算さ そ 数値的分解が計算さ ます 線形方程式 解 こ 数値的分解因子 使用し 求 こ が

ます

ン ック分解 ップ 最小次数 並び え 決定 コ キー因子L 疎 ータ構造体 設 定 ます こ ップ 疎 係数行列 パターン す わ 非 ロ要素 位置 け 必要

し 要素そ も 扱いませ 従 Imsl_c_sparse_elem 構造体 val欄 無視さ ます あ

アプ ー ンが 同 疎 パターン 持 要素 値が異 複数 疎 対称正定値係数行列 扱 う場合 IMSL_RETURN_SYMBOLIC_FACTOR IMSL_SUPPLY_SYMBOLIC_FACTOR 使用す こ によ ン ック分解 一度 け計算す よい す

ン ック分解因子によ コ キー因子L 疎 ータ構造体が与え 数値的分解 次式 が成 立 ように Lに ン 値 生成します:

PAP T = LL T ここ P 最小次数 並び えによ 決定さ 置換行列 す

数値的分解 2 方法 い 実行す こ が ます フ 疎 縮格納方式に基 い 標準 分解 行 います こ 方法 George Liu (1981年) に記述さ います プ ン

チフロンタ 法 使用す こ が ます チフロンタ 法 よ 多く 必要 します が 場合によ に よ 高速に ます チフロンタ 法 Liu (1987年) ーチンに基 い い

ます こ 方法 詳細 説明 Liu 1990年 よび Duff Reid 1983年 1984年 Ashcraft 1987

年 Ashcraftそ 他 1987年 Liu 1986年 1989年 参照し く さい

アプ ー ンが 同 係数行列 右辺が異 いく 線形方程式 解く必要があ 場合 プ ン IMSL_RETURN_NUMERIC_FACTOR IMSL_SUPPLY_NUMERIC_FACTOR 使 コ キー

分解因子 前処理 す こ が ます そ IMSL_SOLVE_ONLY プ ン 使い 全 方程

式 効率良く解くこ が ます

数値分解が与え そ 解 x 次によ 得 ます L y1

= Pb

LT y2

= y

1

x = PT y2

置換情報 P 数値因子構造体に保持さ ます

例題1

簡単 例 し 次 ー 正定値行列 考えます:

2 1 0

1 4 1 2

0 1 2 10

i

A i i

i

   

 

    

  

 

Ax = (

2 + 2i, 5 +15i, 36 + 28i)

T ように xT

= (1 + i, 2 + 2i, 3 + 3i)

します A 下 角

非 ロ 数 nz = 5 す

#include <imsl.h>

int main() {

Imsl_c_sparse_elem a[] = {0, 0, {2.0, 0.0}, 1, 1, {4.0, 0.0}, 2, 2, {10.0, 0.0}, 1, 0, {-1.0, -1.0}, 2, 1, {1.0, -2.0}};

f_complex b[] = {{-2.0, 2.0}, {5.0, 15.0}, {36.0, 28.0}};

int n = 3;

int nz = 5;

f_complex *x;

x = imsl_c_lin_sol_posdef_coordinate (n, nz, a, b, 0);

imsl_c_write_matrix ("Solution, x, of Ax = b", n, 1, x, 0);

imsl_free (x);

}

出力

Solution, x, of Ax = b 1 ( 1, 1) 2 ( 2, 2) 3 ( 3, 3)

例題

A = E(2500, 50) します 方程式 Ax = b1 解い 数値分解 返します そ こ 数値分解

使用し 方程式 Ax = b2 解 ます 実行時間 比がプ ン さ ます

#include <imsl.h>

#include <stdio.h>

int main() {

Imsl_c_sparse_elem *a;

Imsl_c_numeric_factor numeric_factor;

f_complex b_1[2500], b_2[2500], *x_1, *x_2;

int n, ic, nz, i, index;

double time_1, time_2;

float *rand_vec;

ic = 50;

n = ic*ic;

index = 0;

/* Generate two right hand sides */

rand_vec = imsl_f_random_uniform (4*n*sizeof(*rand_vec), 0);

for (i=0; i<n; i++) {

b_1[i].re = rand_vec[index++];

b_1[i].im = rand_vec[index++];

b_2[i].re = rand_vec[index++];

b_2[i].im = rand_vec[index++];

}

/* Build coefficient matrix a */

a = imsl_c_generate_test_coordinate (n, ic, &nz, IMSL_SYMMETRIC_STORAGE,

0);

/* Now solve Ax_1 = b_1 and return the numeric factorization */

time_1 = imsl_ctime ();

x_1 = imsl_c_lin_sol_posdef_coordinate (n, nz, a, b_1, IMSL_RETURN_NUMERIC_FACTOR, &numeric_factor,

0);

time_1 = imsl_ctime () - time_1;

/* Now solve Ax_2 = b_2 given the numeric factorization */

time_2 = imsl_ctime ();

x_2 = imsl_c_lin_sol_posdef_coordinate (n, nz, a, b_2, IMSL_SUPPLY_NUMERIC_FACTOR, &numeric_factor,

IMSL_SOLVE_ONLY, 0);

time_2 = imsl_ctime () - time_2;

printf("time_2/time_1 = %lf\n", time_2/time_1);

}

出力

time_2/time_1 = 0.096386