最小二乗3次スプライン曲線フィット

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

Keyword: 最小二乗, 3次, スプライン, フィット

概要

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

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


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