関連情報

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

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

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

概要

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

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


Results matter. Trust NAG.

Privacy Policy | Trademarks