矩形格子データへの双3次スプラインフィット

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

ホーム > 製品 > nAG数値計算ライブラリ > nAG Fortranライブラリ > サンプルソースコード集 > 矩形格子データへの双3次スプラインフィット

Keyword: 双3次, スプライン, フィット

概要

本サンプルは矩形格子データへの双3次スプラインフィットを行うFortranによるサンプルプログラムです。 本サンプルは以下に示されるデータについて双3次スプラインフィットを行いノットとBスプライン係数を求めて出力します。

双3次スプラインフィットのデータ 

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

入力データ

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

このデータをダウンロード
E02DCF Example Program Data
 11    9      MX, MY, number of grid points on the X and Y axes
 0.0000E+00  5.0000E-01  1.0000E+00  1.5000E+00  2.0000E+00
 2.5000E+00  3.0000E+00  3.5000E+00  4.0000E+00  4.5000E+00
 5.0000E+00   End of MX grid points
 0.0000E+00  5.0000E-01  1.0000E+00  1.5000E+00  2.0000E+00
 2.5000E+00  3.0000E+00  3.5000E+00  4.0000E+00   End of MY grid points
 1.0000E+00  8.8758E-01  5.4030E-01  7.0737E-02 -4.1515E-01
-8.0114E-01 -9.7999E-01 -9.3446E-01 -6.5664E-01  1.5000E+00
 1.3564E+00  8.2045E-01  1.0611E-01 -6.2422E-01 -1.2317E+00
-1.4850E+00 -1.3047E+00 -9.8547E-01  2.0600E+00  1.7552E+00
 1.0806E+00  1.5147E-01 -8.3229E-01 -1.6023E+00 -1.9700E+00
-1.8729E+00 -1.4073E+00  2.5700E+00  2.1240E+00  1.3508E+00
 1.7684E-01 -1.0404E+00 -2.0029E+00 -2.4750E+00 -2.3511E+00
-1.6741E+00  3.0000E+00  2.6427E+00  1.6309E+00  2.1221E-01
-1.2484E+00 -2.2034E+00 -2.9700E+00 -2.8094E+00 -1.9809E+00
 3.5000E+00  3.1715E+00  1.8611E+00  2.4458E-01 -1.4565E+00
-2.8640E+00 -3.2650E+00 -3.2776E+00 -2.2878E+00  4.0400E+00
 3.5103E+00  2.0612E+00  2.8595E-01 -1.6946E+00 -3.2046E+00
-3.9600E+00 -3.7958E+00 -2.6146E+00  4.5000E+00  3.9391E+00
 2.4314E+00  3.1632E-01 -1.8627E+00 -3.6351E+00 -4.4550E+00
-4.2141E+00 -2.9314E+00  5.0400E+00  4.3879E+00  2.7515E+00
 3.5369E-01 -2.0707E+00 -4.0057E+00 -4.9700E+00 -4.6823E+00
-3.2382E+00  5.5050E+00  4.8367E+00  2.9717E+00  3.8505E-01
-2.2888E+00 -4.4033E+00 -5.4450E+00 -5.1405E+00 -3.5950E+00
 6.0000E+00  5.2755E+00  3.2418E+00  4.2442E-01 -2.4769E+00
-4.8169E+00 -5.9300E+00 -5.6387E+00 -3.9319E+00   End of data values
 0.1         S, smoothing factor
 6    0.0   5.0
 5    0.0   4.0 

  • 1行目はタイトル行で読み飛ばされます。
  • 2行目にx軸の格子点の数(mx)、y軸の格子点の数(my)を指定しています。
  • 3~5行目にはx座標を指定しています。
  • 6~7行目にはy座標を指定しています。
  • 8~27行目にはデータ値(f)を指定しています。
  • 28行目に平滑化因子(s)を指定しています。
  • 29行目に矩形格子のx軸に沿った点の数(npx)、最小値(xlo)、最大値(xhi)を指定しています。
  • 30行目に矩形格子のy軸に沿った点の数(npy)、最小値(ylo)、最大値(yhi)を指定しています。

出力結果

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

この出力例をダウンロード
 E02DCF Example Program Results

 Calling with smoothing factor S =   1.0000E-01: NX =   10, NY =   13.

                I   Knot LAMDA(I)      J     Knot MU(J)

                4      0.0000          4      0.0000
                5      1.5000          5      1.0000
                6      2.5000          6      2.0000
                7      5.0000          7      2.5000
                                       8      3.0000
                                       9      3.5000
                                      10      4.0000

 The B-spline coefficients:

    0.9918   1.5381   2.3913   3.9845   5.2138   5.9965
    1.0546   1.5270   2.2441   4.2217   5.0860   6.0821
    0.6098   0.9557   1.5587   2.3458   3.3860   3.7716
   -0.2915  -0.4199  -0.7399  -1.1763  -1.5527  -1.7775
   -0.8476  -1.3296  -1.8521  -3.3468  -4.3628  -5.0085
   -1.0168  -1.5952  -2.4022  -3.9390  -5.4680  -6.1656
   -0.9529  -1.3381  -2.2844  -3.9559  -5.0032  -5.8709
   -0.7711  -1.0914  -1.8488  -3.2549  -3.9444  -4.7297
   -0.6476  -1.0373  -1.5936  -2.5887  -3.3485  -3.9330

 Sum of squared residuals FP =   1.0004E-01

 Values of computed spline:

           X    0.00    1.00    2.00    3.00    4.00    5.00
      Y
     4.00      -0.65   -1.36   -1.99   -2.61   -3.25   -3.93
     3.00      -0.98   -1.97   -2.91   -3.91   -4.97   -5.92
     2.00      -0.42   -0.83   -1.24   -1.66   -2.08   -2.48
     1.00       0.54    1.09    1.61    2.14    2.71    3.24
     0.00       0.99    2.04    3.03    4.01    5.02    6.00

  • 3行目に呼び出される際の平滑化因子、NX(変数xに関するスプラインのノットの数)、NY(変数yに関するスプラインのノットの数)が出力されています。
  • 5~13行目にx方向のノットの位置(LAMDA)とy方向のノットの位置(MU)が出力されています。
  • 17~25行目にBスプライン係数が出力されています。
  • 27行目に残差平方和が出力されています。
  • 31~37行目に計算されたスプラインの値が出力されています。

ソースコード

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

※本サンプルソースコードは科学技術・統計計算ライブラリである「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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174

このソースコードをダウンロード
!   E02DCF Example Program Text
!   Mark 23 Release. nAG Copyright 2011.
    MODULE e02dcfe_mod

!      E02DCF Example Program Module:
!             Parameters and User-defined Routines

!      .. Use Statements ..
       USE nag_library, ONLY : nag_wp
!      .. Implicit None Statement ..
       IMPLICIT NONE
!      .. Parameters ..
       INTEGER, PARAMETER                  :: nin = 5, nout = 6
    CONTAINS
       SUBROUTINE cprint(c,ny,nx,nout)

!         .. Implicit None Statement ..
          IMPLICIT NONE
!         .. Scalar Arguments ..
          INTEGER, INTENT (IN)                :: nout, nx, ny
!         .. Array Arguments ..
          REAL (KIND=nag_wp), INTENT (IN)     :: c(ny-4,nx-4)
!         .. Local Scalars ..
          INTEGER                             :: i
!         .. Executable Statements ..
          WRITE (nout,*)
          WRITE (nout,*) 'The B-spline coefficients:'
          WRITE (nout,*)

          DO i = 1, ny - 4
             WRITE (nout,99999) c(i,1:(nx-4))
          END DO

          RETURN

99999     FORMAT (1X,8F9.4)
       END SUBROUTINE cprint
    END MODULE e02dcfe_mod
    PROGRAM e02dcfe

!      E02DCF Example Main Program

!      .. Use Statements ..
       USE nag_library, ONLY : e02dcf, e02dff, nag_wp
       USE e02dcfe_mod, ONLY : cprint, nin, nout
!      .. Implicit None Statement ..
       IMPLICIT NONE
!      .. Local Scalars ..
       REAL (KIND=nag_wp)                  :: delta, fp, s, xhi, xlo, yhi, ylo
       INTEGER                             :: i, ifail, j, liwrk, lwrk, mx,    &
                                              my, npx, npy, nx, nxest, ny, nyest
       CHARACTER (1)                       :: start
!      .. Local Arrays ..
       REAL (KIND=nag_wp), ALLOCATABLE     :: c(:), f(:), fg(:), lamda(:),     &
                                              mu(:), px(:), py(:), wrk(:),     &
                                              x(:), y(:)
       INTEGER, ALLOCATABLE                :: iwrk(:)
!      .. Intrinsic Functions ..
       INTRINSIC                              max, min, real
!      .. Executable Statements ..
       WRITE (nout,*) 'E02DCF Example Program Results'

!      Skip heading in data file
       READ (nin,*)

!      Input the number of X, Y co-ordinates MX, MY.

       READ (nin,*) mx, my
       nxest = mx + 4
       nyest = my + 4
       lwrk = 4*(mx+my) + 11*(nxest+nyest) + nxest*my + max(my,nxest) + 54
       liwrk = 3 + mx + my + nxest + nyest
       ALLOCATE (x(mx),y(my),f(mx*my),lamda(nxest),mu(nyest),wrk(lwrk), &
          iwrk(liwrk),c((nxest-4)*(nyest-4)))

       READ (nin,*) x(1:mx)
       READ (nin,*) y(1:my)

!      Input the MX*MY function values F at the grid points.

       READ (nin,*) f(1:mx*my)

       start = 'C'

       READ (nin,*) s

!      Determine the spline approximation.

       ifail = 0
       CALL e02dcf(start,mx,x,my,y,f,s,nxest,nyest,nx,lamda,ny,mu,c,fp,wrk, &
          lwrk,iwrk,liwrk,ifail)

       DEALLOCATE (wrk,iwrk)

       WRITE (nout,*)
       WRITE (nout,99999) 'Calling with smoothing factor S =', s, ': NX =', &
          nx, ', NY =', ny, '.'
       WRITE (nout,*)
       WRITE (nout,*) '               I   Knot LAMDA(I)      J     Knot MU(J)'
       WRITE (nout,*)

       DO j = 4, max(nx,ny) - 3

          IF (j<=nx-3 .AND. j<=ny-3) THEN
             WRITE (nout,99997) j, lamda(j), j, mu(j)
          ELSE IF (j<=nx-3) THEN
             WRITE (nout,99997) j, lamda(j)
          ELSE IF (j<=ny-3) THEN
             WRITE (nout,99996) j, mu(j)
          END IF

       END DO

       CALL cprint(c,ny,nx,nout)

       WRITE (nout,*)
       WRITE (nout,99998) 'Sum of squared residuals FP =', fp

       IF (fp==0.0E+0_nag_wp) THEN
          WRITE (nout,*) '(The spline is an interpolating spline)'
       ELSE IF (nx==8 .AND. ny==8) THEN
          WRITE (nout,*) &
             '(The spline is the least-squares bi-cubic polynomial)'
       END IF

!      Evaluate the spline on a rectangular grid at NPX*NPY points
!      over the domain (XLO to XHI) x (YLO to YHI).

       READ (nin,*) npx, xlo, xhi
       READ (nin,*) npy, ylo, yhi

       lwrk = min(4*npx+nx,4*npy+ny)

       IF (4*npx+nx>4*npy+ny) THEN
          liwrk = npy + ny - 4
       ELSE
          liwrk = npx + nx - 4
       END IF

       ALLOCATE (px(npx),py(npy),fg(npx*npy),wrk(lwrk),iwrk(liwrk))

       delta = (xhi-xlo)/real(npx-1,kind=nag_wp)

       DO i = 1, npx
          px(i) = min(xlo+real(i-1,kind=nag_wp)*delta,xhi)
       END DO

       delta = (yhi-ylo)/real(npy-1,kind=nag_wp)

       DO i = 1, npy
          py(i) = min(ylo+real(i-1,kind=nag_wp)*delta,yhi)
       END DO

       ifail = 0
       CALL e02dff(npx,npy,nx,ny,px,py,lamda,mu,c,fg,wrk,lwrk,iwrk,liwrk, &
          ifail)

       WRITE (nout,*)
       WRITE (nout,*) 'Values of computed spline:'
       WRITE (nout,*)
       WRITE (nout,99995) '          X', (px(i),i=1,npx)
       WRITE (nout,*) '     Y'

       DO i = npy, 1, -1
          WRITE (nout,99994) py(i), (fg(npy*(j-1)+i),j=1,npx)
       END DO

99999  FORMAT (1X,A,1P,E13.4,A,I5,A,I5,A)
99998  FORMAT (1X,A,1P,E13.4)
99997  FORMAT (1X,I16,F12.4,I11,F12.4)
99996  FORMAT (1X,I39,F12.4)
99995  FORMAT (1X,A,7F8.2)
99994  FORMAT (1X,F8.2,3X,7F8.2)
    END PROGRAM e02dcfe


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