Keyword: 双3次, スプライン, フィット
概要
本サンプルは矩形格子データへの双3次スプラインフィットを行うFortranによるサンプルプログラムです。 本サンプルは以下に示されるデータについて双3次スプラインフィットを行いノットとBスプライン係数を求めて出力します。
※本サンプルはnAG Fortranライブラリに含まれるルーチン e02dcf() のExampleコードです。本サンプル及びルーチンの詳細情報は e02dcf のマニュアルページをご参照ください。
ご相談やお問い合わせはこちらまで
入力データ
(本ルーチンの詳細はe02dcf のマニュアルページを参照)このデータをダウンロード |
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 のマニュアルページを参照)この出力例をダウンロード |
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ライブラリ」のルーチンを呼び出します。
サンプルのコンパイル及び実行方法
このソースコードをダウンロード |
! 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