実スパース対称行列の不完全コレスキー分解

Fortranによるサンプルソースコード : 使用ルーチン名:f11jaf

ホーム > 製品 > nAG数値計算ライブラリ > nAG Fortranライブラリ > サンプルソースコード集 > 実スパース対称行列の不完全コレスキー分解

Keyword: スパース, 不完全コレスキー分解

概要

本サンプルは実スパース対称行列の不完全コレスキー分解を行うFortranによるサンプルプログラムです。 本サンプルは実スパース対称行列Aを読み込み、不完全コレスキー分解を計算し、行列Aと以下に示される下三角行列Cの非ゼロ要素を出力します。

実スパース非対称線形連立方程式のデータ 

※本サンプルはnAG Fortranライブラリに含まれるルーチン f11jaf() のExampleコードです。本サンプル及びルーチンの詳細情報は f11jaf のマニュアルページをご参照ください。
ご相談やお問い合わせはこちらまで

入力データ

(本ルーチンの詳細はf11jaf のマニュアルページを参照)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

このデータをダウンロード
F11JAF Example Program Data
  7                   N
 16                   NNZ
  0 0.0               LFILL, DTOL
  'N' 0.0             MIC, DSCALE
  'M'                 PSTRAT
  4.   1    1
  1.   2    1
  5.   2    2
  2.   3    3
  2.   4    2
  3.   4    4
 -1.   5    1
  1.   5    4
  4.   5    5
  1.   6    2
 -2.   6    5
  3.   6    6
  2.   7    1
 -1.   7    2
 -2.   7    3
  5.   7    7        A(I), IROW(I), ICOL(I), I=1,...,NNZ 

  • 1行目はタイトル行で読み飛ばされます。
  • 2行目に行列Aの次数(n)を指定しています。
  • 3行目に行列Aの下三角部分の非ゼロ要素の数(nnz)を指定しています。
  • 4行目の1番目のパラメータ(lfill)は値が0以上の場合、コレスキー分解で許されたフィル(fill)の最大レベルを指定しています。2番目のパラメータ(dtol)は、1番目のパラメータの値が負の値の場合、フィルイン(fill-in)を制御するためのドロップ許容値を指定しています。1番目のパラメータの値が0以上の場合は2番目のパラメータの値は参照されません。
  • 5行目には行の合計を保持するためにコレスキー分解が修正されるかどうか(mic='N':コレスキー分解が修正されない)と対角スケーリング引数(dscale=0.0)を指定しています。
  • 6行目にピボット法(pstrat='M':Markowitz法を用いて対角ピボットが実行される)を指定しています。
  • 7~22行目に行列Aの非ゼロ要素、行列Aの非ゼロ要素の行インデックス(irow)、列インデックス(icol)を指定しています。

出力結果

(本ルーチンの詳細はf11jaf のマニュアルページを参照)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50

この出力例をダウンロード
 F11JAF Example Program Results
  Original Matrix
 N     =               7
 NNZ   =              16
        1      0.4000E+01       1       1
        2      0.1000E+01       2       1
        3      0.5000E+01       2       2
        4      0.2000E+01       3       3
        5      0.2000E+01       4       2
        6      0.3000E+01       4       4
        7     -0.1000E+01       5       1
        8      0.1000E+01       5       4
        9      0.4000E+01       5       5
       10      0.1000E+01       6       2
       11     -0.2000E+01       6       5
       12      0.3000E+01       6       6
       13      0.2000E+01       7       1
       14     -0.1000E+01       7       2
       15     -0.2000E+01       7       3
       16      0.5000E+01       7       7

  Factorization
 N     =               7
 NNZ   =              16
 NPIVM =               0
       17      0.5000E+00       1       1
       18      0.3333E+00       2       2
       19      0.3333E+00       3       2
       20      0.2727E+00       3       3
       21     -0.5455E+00       4       3
       22      0.5238E+00       4       4
       23     -0.2727E+00       5       3
       24      0.2683E+00       5       5
       25      0.6667E+00       6       2
       26      0.5238E+00       6       4
       27      0.2683E+00       6       5
       28      0.3479E+00       6       6
       29     -0.1000E+01       7       1
       30      0.5366E+00       7       5
       31     -0.5345E+00       7       6
       32      0.9046E+00       7       7

       I     IPIV(I)
        1       3
        2       4
        3       5
        4       6
        5       1
        6       2
        7       7

  • 2~20行目には元の行列の情報が出力されています。
  • 4行目に行列Aの次数が出力されています。
  • 5行目に行列Aの非ゼロ要素の数が出力されています。
  • 7~22行目に行列Aの要素の値、行インデックスと列インデックスが出力されています。
  • 22~41行目にはコレスキー分解して得られた行列の情報が出力されています。
  • 23行目にコレスキー分解して得られた行列の次数が出力されています。
  • 24行目にコレスキー分解して得られた行列の非ゼロ要素の数が出力されています。
  • 25行目にコレスキー分解で修正されたピボットの数が出力されています。
  • 43~50行目にピボットインデックスが出力されています。

ソースコード

(本ルーチンの詳細はf11jaf のマニュアルページを参照)

※本サンプルソースコードは科学技術・統計計算ライブラリである「nAG Fortranライブラリ」のルーチンを呼び出します。
サンプルのコンパイル及び実行方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81

このソースコードをダウンロード
    PROGRAM f11jafe

!      F11JAF Example Program Text

!      Mark 23 Release. nAG Copyright 2011.

!      .. Use Statements ..
       USE nag_library, ONLY : f11jaf, nag_wp
!      .. Implicit None Statement ..
       IMPLICIT NONE
!      .. Parameters ..
       INTEGER, PARAMETER              :: nin = 5, nout = 6
!      .. Local Scalars ..
       REAL (KIND=nag_wp)              :: dscale, dtol
       INTEGER                         :: i, ifail, la, lfill, liwork, n, nnz, &
                                          nnzc, npivm
       CHARACTER (1)                   :: mic, pstrat
!      .. Local Arrays ..
       REAL (KIND=nag_wp), ALLOCATABLE :: a(:)
       INTEGER, ALLOCATABLE            :: icol(:), ipiv(:), irow(:), istr(:),  &
                                          iwork(:)
!      .. Executable Statements ..
       WRITE (nout,*) 'F11JAF Example Program Results'
!      Skip heading in data file
       READ (nin,*)

!      Read algorithmic parameters

       READ (nin,*) n
       READ (nin,*) nnz
       la = 2*nnz
       liwork = 2*la + 7*n + 1
       ALLOCATE (a(la),icol(la),ipiv(n),irow(la),istr(n+1),iwork(liwork))
       READ (nin,*) lfill, dtol
       READ (nin,*) mic, dscale
       READ (nin,*) pstrat

!      Read the matrix A

       DO i = 1, nnz
          READ (nin,*) a(i), irow(i), icol(i)
       END DO

!      Calculate incomplete Cholesky factorization

!      ifail: behaviour on error exit
!             =0 for hard exit, =1 for quiet-soft, =-1 for noisy-soft
       ifail = 0
       CALL f11jaf(n,nnz,a,la,irow,icol,lfill,dtol,mic,dscale,pstrat,ipiv, &
          istr,nnzc,npivm,iwork,liwork,ifail)

!      Output original matrix

       WRITE (nout,*) ' Original Matrix'
       WRITE (nout,99997) 'N     =', n
       WRITE (nout,99997) 'NNZ   =', nnz
       DO i = 1, nnz
          WRITE (nout,99999) i, a(i), irow(i), icol(i)
       END DO
       WRITE (nout,*)

!      Output details of the factorization

       WRITE (nout,*) ' Factorization'
       WRITE (nout,99997) 'N     =', n
       WRITE (nout,99997) 'NNZ   =', nnzc
       WRITE (nout,99997) 'NPIVM =', npivm
       DO i = nnz + 1, nnz + nnzc
          WRITE (nout,99999) i, a(i), irow(i), icol(i)
       END DO
       WRITE (nout,*)

       WRITE (nout,*) '      I     IPIV(I)'
       DO i = 1, n
          WRITE (nout,99998) i, ipiv(i)
       END DO

99999  FORMAT (1X,I8,E16.4,2I8)
99998  FORMAT (1X,2I8)
99997  FORMAT (1X,A,I16)
    END PROGRAM f11jafe


関連情報
© 日本ニューメリカルアルゴリズムズグループ株式会社 2025
Privacy Policy  /  Trademarks