3次スプライン曲線フィット

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

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

概要

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

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

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

入力データ

(本ルーチンの詳細はe02bef のマニュアルページを参照)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

このデータをダウンロード
E02BEF Example Program Data
  15                              M, the number of data points
  0.0000E+00  -1.1000E+00   1.00  X, Y, W, abscissa, ordinate and weight
  5.0000E-01  -3.7200E-01   2.00
  1.0000E+00   4.3100E-01   1.50
  1.5000E+00   1.6900E+00   1.00
  2.0000E+00   2.1100E+00   3.00
  2.5000E+00   3.1000E+00   1.00
  3.0000E+00   4.2300E+00   0.50
  4.0000E+00   4.3500E+00   1.00
  4.5000E+00   4.8100E+00   2.00
  5.0000E+00   4.6100E+00   2.50
  5.5000E+00   4.7900E+00   1.00
  6.0000E+00   5.2300E+00   3.00
  7.0000E+00   6.3500E+00   1.00
  7.5000E+00   7.1900E+00   2.00
  8.0000E+00   7.9700E+00   1.00  End of data points
  1.0                             S, smoothing factor
  0.5                             S, smoothing factor
  0.1                             S, smoothing factor 

  • 1行目はタイトル行で読み飛ばされます。
  • 2行目にデータ点の数(m)を指定しています。
  • 3~17行目には独立変数x、従属変数y、重み(w)を指定しています。
  • 18~20行目に平滑化因子(s)を指定しています。

出力結果

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

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

 Calling with smoothing factor S =   1.000E+00

                                            B-Spline
              J       Knot LAMDA(J+2)   Coefficient C(J)
              1                             -1.3201
              2            0.0000            1.3542
              3            4.0000            5.5510
              4            8.0000            4.7031
              5                              8.2277

 Weighted sum of squared residuals FP =   1.000E+00


 Calling with smoothing factor S =   5.000E-01

                                            B-Spline
              J       Knot LAMDA(J+2)   Coefficient C(J)
              1                             -1.1072
              2            0.0000           -0.6571
              3            1.0000            0.4350
              4            2.0000            2.8061
              5            4.0000            4.6824
              6            5.0000            4.6416
              7            6.0000            5.1976
              8            8.0000            6.9008
              9                              7.9979

 Weighted sum of squared residuals FP =   5.001E-01


 Calling with smoothing factor S =   1.000E-01

                                            B-Spline
              J       Knot LAMDA(J+2)   Coefficient C(J)
              1                             -1.0901
              2            0.0000           -0.6401
              3            1.0000            0.0334
              4            1.5000            1.6390
              5            2.0000            2.1243
              6            3.0000            4.5591
              7            4.0000            4.2174
              8            4.5000            4.9105
              9            5.0000            4.5475
             10            5.5000            4.6960
             11            6.0000            5.7370
             12            8.0000            6.8179
             13                              7.9953

 Weighted sum of squared residuals FP =   9.999E-02


  • 3行目に呼び出される際の平滑化因子が出力されています。
  • 7~11行目にノットの位置とBスプライン係数が出力されています。
  • 13行目に重みづけされた残差平方和が出力されています。
  • 16行目に呼び出される際の平滑化因子が出力されています。
  • 20~28行目にノットの位置とBスプライン係数が出力されています。
  • 30行目に重みづけされた残差平方和が出力されています。
  • 33行目に呼び出される際の平滑化因子が出力されています。
  • 37~49行目にノットの位置とBスプライン係数が出力されています。
  • 51行目に重みづけされた残差平方和が出力されています。

ソースコード

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

※本サンプルソースコードは科学技術・統計計算ライブラリである「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

このソースコードをダウンロード
    PROGRAM e02befe

!      E02BEF Example Program Text

!      Mark 23 Release. nAG Copyright 2011.

!      .. Use Statements ..
       USE nag_library, ONLY : e02bbf, e02bef, nag_wp
!      .. Implicit None Statement ..
       IMPLICIT NONE
!      .. Parameters ..
       INTEGER, PARAMETER              :: nin = 5, nout = 6
!      .. Local Scalars ..
       REAL (KIND=nag_wp)              :: fp, s, txr
       INTEGER                         :: ifail, ioerr, j, lwrk, m, n, nest, r
       CHARACTER (1)                   :: start
!      .. Local Arrays ..
       REAL (KIND=nag_wp), ALLOCATABLE :: c(:), lamda(:), sp(:), w(:), wrk(:), &
                                          x(:), y(:)
       INTEGER, ALLOCATABLE            :: iwrk(:)
!      .. Executable Statements ..
       WRITE (nout,*) 'E02BEF Example Program Results'

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

!      Input the number of data points, followed by the data points (X),
!      the function values (Y) and the weights (W).

       READ (nin,*) m
       nest = m + 4
       lwrk = 4*m + 16*nest + 41
       ALLOCATE (x(m),y(m),w(m),iwrk(nest),lamda(nest),wrk(lwrk),c(nest), &
          sp(2*m-1))

       DO r = 1, m
          READ (nin,*) x(r), y(r), w(r)
       END DO

       start = 'C'

!      Read in successive values of S until end of data file.

DATA:  DO
          READ (nin,*,IOSTAT=ioerr) s

          IF (ioerr<0) THEN
             EXIT DATA
          END IF

!         Determine the spline approximation.

          ifail = 0
          CALL e02bef(start,m,x,y,w,s,nest,n,lamda,c,fp,wrk,lwrk,iwrk,ifail)

!         Evaluate the spline at each X point and midway between
!         X points, saving the results in SP.

          DO r = 1, m

             ifail = 0
             CALL e02bbf(n,lamda,c,x(r),sp((r-1)*2+1),ifail)

          END DO

          DO r = 1, m - 1
             txr = (x(r)+x(r+1))/2.0E0_nag_wp

             ifail = 0
             CALL e02bbf(n,lamda,c,txr,sp(r*2),ifail)

          END DO

!         Output the results.

          WRITE (nout,*)
          WRITE (nout,99999) 'Calling with smoothing factor S =', s
          WRITE (nout,*)
          WRITE (nout,*) '                                           B-Spline'
          WRITE (nout,*) &
             '             J       Knot LAMDA(J+2)   Coefficient C(J)'
          WRITE (nout,99998) 1, c(1)

          DO j = 2, n - 5
             WRITE (nout,99997) j, lamda(j+2), c(j)
          END DO

          WRITE (nout,99998) n - 4, c(n-4)
          WRITE (nout,*)
          WRITE (nout,99999) 'Weighted sum of squared residuals FP =', fp

          IF (fp==0.0E0_nag_wp) THEN
             WRITE (nout,*) '(The spline is an interpolating spline)'
          ELSE IF (n==8) THEN
             WRITE (nout,*) &
                '(The spline is the weighted least-squares cubic polynomial)'
          END IF

          WRITE (nout,*)
          start = 'W'
       END DO DATA

99999  FORMAT (1X,A,1P,E12.3)
99998  FORMAT (11X,I4,20X,F16.4)
99997  FORMAT (11X,I4,2F18.4)
    END PROGRAM e02befe


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