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