共役勾配/ランチョス(Lanczos)法を用いた : 実スパース対称線形連立方程式の解

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

ホーム > 製品 > nAG数値計算ライブラリ > nAG Fortranライブラリ > サンプルソースコード集 > 共役勾配/ランチョス(Lanczos)法を用いた実スパース対称線形連立方程式の解

Keyword: 共役勾配, ランチョス, Lanczos, スパース, 対称, 線形連立方程式

概要

本サンプルは共役勾配/ランチョス(Lanczos)法を用いて実スパース対称線形連立方程式を解くFortranによるサンプルプログラムです。 本サンプルは共役勾配を用いて以下に示される対称線形連立方程式を解いて解を出力します。

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

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

入力データ

(本ルーチンの詳細はf11jcf のマニュアルページを参照)
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

このデータをダウンロード
F11JCF Example Program Data
  7                   N
  16                  NNZ
 'CG'                 METHOD
  1 0.0               LFILL, DTOL
  'N' 0.0             MIC, DSCALE
  'M'                 PSTRAT
  1.0D-6 100          TOL, MAXITN
  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
 15.  18.  -8.  21. 
 11.  10.  29.        B(I), I=1,...,N
  0.   0.   0.   0.
  0.   0.   0.        X(I), I=1,...,N 

  • 1行目はタイトル行で読み飛ばされます。
  • 2行目に行列Aの次数(n=7)を指定しています。
  • 3行目に行列Aの下三角部分の非ゼロ要素の数(nnz=16)を指定しています。
  • 4行目に反復手法(method='CG':共役勾配法(Conjugate Gradient method))を指定しています。
  • 5行目の1番目のパラメータ(lfill)は値が0以上の場合、分解で許されたフィル(fill)の最大レベルを指定しています。2番目のパラメータ(dtol)は、1番目のパラメータの値が負の値の場合、フィルイン(fill-in)を制御するためのドロップ許容値を指定しています。1番目のパラメータの値が0以上の場合は2番目のパラメータの値は参照されません。
  • 6行目には行の合計を保持するためにコレスキー分解が修正されるかどうか(mic='N':修正されない)と対角スケーリング引数(dscale=0.0)を指定しています。
  • 7行目にピボット法(pstrat='M':Markowitz法を用いて対角ピボットが実行される)を指定しています。
  • 8行目に許容値(tol=1.0D-6)と最大反復数(maxitn=100)を指定しています。
  • 9~24行目に行列Aの非ゼロ要素(a)、行列Aの非ゼロ要素の行インデックス(irow)、列インデックス(icol)を指定しています。
  • 25~26行目に右辺ベクトルBを指定しています。
  • 27~28行目に解ベクトルxの初期近似値を指定しています。

出力結果

(本ルーチンの詳細はf11jcf のマニュアルページを参照)
1
2
3
4
5
6
7
8
9
10

この出力例をダウンロード
 F11JCF Example Program Results
 Converged in         1 iterations
 Final residual norm =       7.105E-15
       1.0000E+00
       2.0000E+00
       3.0000E+00
       4.0000E+00
       5.0000E+00
       6.0000E+00
       7.0000E+00

  • 2行目には1回の反復で収束したことが示されています。
  • 3行目に最終的な残差ノルムが出力されています。
  • 4~10行目に解ベクトルxの改良された近似値が出力されています。

ソースコード

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

※本サンプルソースコードは科学技術・統計計算ライブラリである「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

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

!      F11JCF Example Program Text

!      Mark 23 Release. nAG Copyright 2011.

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

!      Read algorithmic parameters

       READ (nin,*) n
       READ (nin,*) nnz
       la = 3*nnz
       liwork = 2*la + 7*n + 1
       lwork = 6*n + 120
       ALLOCATE (a(la),b(n),work(lwork),x(n),icol(la),ipiv(n),irow(la), &
          istr(n+1),iwork(liwork))
       READ (nin,*) method
       READ (nin,*) lfill, dtol
       READ (nin,*) mic, dscale
       READ (nin,*) pstrat
       READ (nin,*) tol, maxitn

!      Read the matrix A

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

!      Read right-hand side vector b and initial approximate solution x

       READ (nin,*) b(1:n)
       READ (nin,*) x(1:n)

!      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)

!      Solve Ax = b using F11JCF

       ifail = 0
       CALL f11jcf(method,n,nnz,a,la,irow,icol,ipiv,istr,b,tol,maxitn,x,rnorm, &
          itn,work,lwork,ifail)

       WRITE (nout,99999) 'Converged in', itn, ' iterations'
       WRITE (nout,99998) 'Final residual norm =', rnorm

!      Output x

       WRITE (nout,99997) x(1:n)

99999  FORMAT (1X,A,I10,A)
99998  FORMAT (1X,A,1P,E16.3)
99997  FORMAT (1X,1P,E16.4)
    END PROGRAM f11jcfe


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