Keyword: 最小二乗, 3次, スプライン, フィット
概要
本サンプルは最小二乗3次スプライン曲線フィットを行うFortranによるサンプルプログラムです。 本サンプルは以下に示されるデータについて最小二乗3次スプライン曲線フィットを行い、スプラインの値を求めて出力します。
※本サンプルはnAG Fortranライブラリに含まれるルーチン e02baf() のExampleコードです。本サンプル及びルーチンの詳細情報は e02baf のマニュアルページをご参照ください。
ご相談やお問い合わせはこちらまで
入力データ
(本ルーチンの詳細はe02baf のマニュアルページを参照)1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
このデータをダウンロード |
E02BAF Example Program Data 14 5 2 1.50 2.60 4.00 8.00 0.20 0.00 0.20 0.47 2.00 0.20 0.74 4.00 0.30 1.09 6.00 0.70 1.60 8.00 0.90 1.90 8.62 1.00 2.60 9.10 1.00 3.10 8.90 1.00 4.00 8.15 0.80 5.15 7.00 0.50 6.17 6.00 0.70 8.00 4.54 1.00 10.00 3.39 1.00 12.00 2.56 1.00
- 1行目はタイトル行で読み飛ばされます。
- 2行目にデータ点の数(m)を指定しています。
- 3行目にスプラインの区間の数(ncap)、重みづけをするかどうかのフラグ(iwght)を指定しています。"1"は重みづけをしないことを意味し、"1"以外は重みづけをすることを意味します。
- 4~7行目にノット(lamda)を指定しています。
- 8~21行目に独立変数xの値、従属変数yの値、重み(w)を指定しています。
出力結果
(本ルーチンの詳細はe02baf のマニュアルページを参照)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
この出力例をダウンロード |
E02BAF Example Program Results J LAMDA(J+2) B-spline coeff C(J) 1 -0.0465 2 0.2000 3.6150 3 1.5000 8.5724 4 2.6000 9.4261 5 4.0000 7.2716 6 8.0000 4.1207 7 12.0000 3.0822 8 2.5597 Residual sum of squares = 0.18E-02 Cubic spline approximation and residuals R Abscissa Weight Ordinate Spline Residual 1 0.2000 0.2000 0.0000 -0.0465 -0.47E-01 0.3350 1.0622 2 0.4700 0.2000 2.0000 2.1057 0.11E+00 0.6050 3.0817 3 0.7400 0.3000 4.0000 3.9880 -0.12E-01 0.9150 5.0558 4 1.0900 0.7000 6.0000 5.9983 -0.17E-02 1.3450 7.1376 5 1.6000 0.9000 8.0000 7.9872 -0.13E-01 1.7500 8.3544 6 1.9000 1.0000 8.6200 8.6348 0.15E-01 2.2500 9.0076 7 2.6000 1.0000 9.1000 9.0896 -0.10E-01 2.8500 9.0353 8 3.1000 1.0000 8.9000 8.9125 0.12E-01 3.5500 8.5660 9 4.0000 0.8000 8.1500 8.1321 -0.18E-01 4.5750 7.5592 10 5.1500 0.5000 7.0000 6.9925 -0.75E-02 5.6600 6.5010 11 6.1700 0.7000 6.0000 6.0255 0.26E-01 7.0850 5.2292 12 8.0000 1.0000 4.5400 4.5315 -0.85E-02 9.0000 3.9045 13 10.0000 1.0000 3.3900 3.3928 0.28E-02 11.0000 2.9574 14 12.0000 1.0000 2.5600 2.5597 -0.35E-03
- 3行目にノットの数が出力されています。
- 5~12行目にノットの位置とBスプライン係数が出力されています。
- 14行目に残差平方和が出力されています。
- 18~46行目にインデックス、独立変数xの値、重み、従属変数yの値、3次スプラインフィットの値、、残差が出力されています。
ソースコード
(本ルーチンの詳細はe02baf のマニュアルページを参照)
※本サンプルソースコードは科学技術・統計計算ライブラリである「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
このソースコードをダウンロード |
PROGRAM e02bafe ! E02BAF Example Program Text ! Mark 23 Release. nAG Copyright 2011. ! .. Use Statements .. USE nag_library, ONLY : e02baf, e02bbf, nag_wp ! .. Implicit None Statement .. IMPLICIT NONE ! .. Parameters .. INTEGER, PARAMETER :: nin = 5, nout = 6 ! .. Local Scalars .. REAL (KIND=nag_wp) :: fit, ss, xarg INTEGER :: ifail, iwght, j, m, ncap, ncap7, r ! .. Local Arrays .. REAL (KIND=nag_wp), ALLOCATABLE :: c(:), lamda(:), w(:), work1(:), & work2(:), x(:), y(:) ! .. Executable Statements .. WRITE (nout,*) 'E02BAF Example Program Results' ! Skip heading in data file READ (nin,*) READ (nin,*) m READ (nin,*) ncap, iwght ncap7 = ncap + 7 ALLOCATE (x(m),y(m),w(m),lamda(ncap7),c(ncap7),work1(m),work2(4*ncap7)) READ (nin,*) lamda(5:(ncap+3)) DO r = 1, m IF (iwght==1) THEN READ (nin,*) x(r), y(r) w(r) = 1.0E0_nag_wp ELSE READ (nin,*) x(r), y(r), w(r) END IF END DO ifail = 0 CALL e02baf(m,ncap7,x,y,w,lamda,work1,work2,c,ss,ifail) WRITE (nout,*) WRITE (nout,*) ' J LAMDA(J+2) B-spline coeff C(J)' WRITE (nout,*) j = 1 WRITE (nout,99998) j, c(1) DO j = 2, ncap + 2 WRITE (nout,99999) j, lamda(j+2), c(j) END DO WRITE (nout,99998) ncap + 3, c(ncap+3) WRITE (nout,*) WRITE (nout,99997) 'Residual sum of squares = ', ss WRITE (nout,*) WRITE (nout,*) 'Cubic spline approximation and residuals' WRITE (nout,*) WRITE (nout,*) & ' R Abscissa Weight Ordinate Spline Residual' WRITE (nout,*) DO r = 1, m ifail = 0 CALL e02bbf(ncap7,lamda,c,x(r),fit,ifail) WRITE (nout,99995) r, x(r), w(r), y(r), fit, fit - y(r) IF (r<m) THEN xarg = 0.5E0_nag_wp*(x(r)+x(r+1)) ifail = 0 CALL e02bbf(ncap7,lamda,c,xarg,fit,ifail) WRITE (nout,99996) xarg, fit END IF END DO 99999 FORMAT (1X,I3,F15.4,F20.4) 99998 FORMAT (1X,I3,F35.4) 99997 FORMAT (1X,A,E12.2) 99996 FORMAT (1X,F14.4,F33.4) 99995 FORMAT (1X,I3,4F11.4,E10.2) END PROGRAM e02bafe