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