Keyword: 最小二乗, 双3次, スプライン, フィット
概要
本サンプルは最小二乗双3次スプライン曲面フィットを行うFortranによるサンプルプログラムです。 本サンプルは以下に示されるデータについて最小二乗双3次スプライン曲面フィットを行い、スプラインの値を求めて出力します。
※本サンプルはnAG Fortranライブラリに含まれるルーチン e02daf() のExampleコードです。本サンプル及びルーチンの詳細情報は e02daf のマニュアルページをご参照ください。
ご相談やお問い合わせはこちらまで
入力データ
(本ルーチンの詳細はe02daf のマニュアルページを参照)このデータをダウンロード |
E02DAF Example Program Data 0.000001 30 8 10 -0.52 0.60 0.93 10. -0.61 -0.95 -1.79 10. 0.93 0.87 0.36 10. 0.09 0.84 0.52 10. 0.88 0.17 0.49 10. -0.70 -0.87 -1.76 10. 1.00 1.00 0.33 1. 1.00 0.10 0.48 1. 0.30 0.24 0.65 1. -0.77 -0.77 -1.82 1. -0.23 0.32 0.92 1. -1.00 1.00 1.00 1. -0.26 -0.63 8.88 1. -0.83 -0.66 -2.01 1. 0.22 0.93 0.47 1. 0.89 0.15 0.49 1. -0.80 0.99 0.84 1. -0.88 -0.54 -2.42 1. 0.68 0.44 0.47 1. -0.14 -0.72 7.15 1. 0.67 0.63 0.44 1. -0.90 -0.40 -3.34 1. -0.84 0.20 2.78 1. 0.84 0.43 0.44 1. 0.15 0.28 0.70 1. -0.91 -0.24 -6.52 1. -0.35 0.86 0.66 1. -0.16 -0.41 2.32 1. -0.35 -0.05 1.66 1. -1.00 -1.00 -1.00 1. -0.5 0.0
- 1行目はタイトル行で読み飛ばされます。
- 2行目に一次方程式の有効ランクを決定するための閾値(eps)を指定しています。
- 3行目にデータ点の数(m)を指定しています。
- 4行目に変数xのノット数の合計(px)を指定しています。
- 5行目に変数yのノット数の合計(py)を指定しています。
- 6〜35行目にデータ点yの座標、xの座標、fの座標、重み(w)を指定しています。
- 36〜37行目に変数yに関する内部ノット(mu)を指定しています。
出力結果
(本ルーチンの詳細はe02daf のマニュアルページを参照)この出力例をダウンロード |
E02DAF Example Program Results Interior Y-knots -0.5000 0.0000 Interior X-knots None Sum of squares of residual RHS 1.47E+01 Rank 22 X and Y have been interchanged X Y Data Fit Residual -0.9500 -0.6100 -1.7900 -1.7931 -0.31E-02 -0.8700 -0.7000 -1.7600 -1.7521 0.79E-02 -0.7700 -0.7700 -1.8200 -2.4301 -0.61E+00 -0.6300 -0.2600 8.8800 7.6346 -0.12E+01 -0.6600 -0.8300 -2.0100 -1.5815 0.43E+00 -0.5400 -0.8800 -2.4200 -2.6795 -0.26E+00 -0.7200 -0.1400 7.1500 7.5708 0.42E+00 -1.0000 -1.0000 -1.0000 -1.0228 -0.23E-01 -0.4000 -0.9000 -3.3400 -4.6955 -0.14E+01 -0.2400 -0.9100 -6.5200 -4.7072 0.18E+01 -0.4100 -0.1600 2.3200 2.7039 0.38E+00 -0.0500 -0.3500 1.6600 2.2865 0.63E+00 0.6000 -0.5200 0.9300 0.9441 0.14E-01 0.8700 0.9300 0.3600 0.3529 -0.71E-02 0.8400 0.0900 0.5200 0.5024 -0.18E-01 0.1700 0.8800 0.4900 0.4705 -0.20E-01 1.0000 1.0000 0.3300 0.6315 0.30E+00 0.1000 1.0000 0.4800 1.4910 0.10E+01 0.2400 0.3000 0.6500 0.9241 0.27E+00 0.3200 -0.2300 0.9200 -0.3692 -0.13E+01 1.0000 -1.0000 1.0000 1.0835 0.84E-01 0.9300 0.2200 0.4700 1.4912 0.10E+01 0.1500 0.8900 0.4900 0.4414 -0.49E-01 0.9900 -0.8000 0.8400 0.5495 -0.29E+00 0.4400 0.6800 0.4700 1.5862 0.11E+01 0.6300 0.6700 0.4400 0.6288 0.19E+00 0.2000 -0.8400 2.7800 1.7123 -0.11E+01 0.4300 0.8400 0.4400 0.6888 0.25E+00 0.2800 0.1500 0.7000 0.7713 0.71E-01 0.8600 -0.3500 0.6600 0.9347 0.27E+00 Sum of squared residuals 1.47E+01 Spline coefficients -1.0228 115.4668 -433.5558 -68.1973 24.8426 -140.1485 258.5042 15.6756 -29.4878 132.2933 -173.5103 20.0983 9.9575 -51.6200 67.6666 -5.8765 10.0577 4.7543 -15.3533 -0.3260 1.0835 -2.7932 7.7708 0.6315
- 3〜5行目にyの内部ノットが出力されています。
- 7〜8行目にxの内部ノットがないことが示されています。
- 10行目に残差平方和が出力されています。
- 12行目にランクが出力されています。
- 14行目にxとyが入れ替えられたことが示されています。
- 16〜46行目にx、y、f、フィットされた値、残差が出力されています。
- 48行目に残差平方和が出力されています。
- 50〜56行目にスプライン係数が出力されています。
ソースコード
(本ルーチンの詳細はe02daf のマニュアルページを参照)
※本サンプルソースコードは科学技術・統計計算ライブラリである「nAG Fortranライブラリ」のルーチンを呼び出します。
サンプルのコンパイル及び実行方法
このソースコードをダウンロード |
PROGRAM e02dafe ! E02DAF Example Program Text ! Mark 23 Release. nAG Copyright 2011. ! .. Use Statements .. USE nag_library, ONLY : e02daf, e02def, e02zaf, nag_wp ! .. Implicit None Statement .. IMPLICIT NONE ! .. Parameters .. INTEGER, PARAMETER :: nin = 5, nout = 6 CHARACTER (1), PARAMETER :: label(2) = (/ 'X', 'Y'/) ! .. Local Scalars .. REAL (KIND=nag_wp) :: eps, sigma, sum, temp INTEGER :: i, iadres, ifail, itemp, j, m, & nadres, nc, npoint, nws, px, py, rank ! .. Local Arrays .. REAL (KIND=nag_wp), ALLOCATABLE :: c(:), dl(:), f(:), ff(:), lamda(:), & mu(:), w(:), wrk(:), ws(:), x(:), y(:) INTEGER, ALLOCATABLE :: adres(:), iwrk(:), point(:) ! .. Executable Statements .. WRITE (nout,*) 'E02DAF Example Program Results' ! Skip heading in data file READ (nin,*) ! Read data, interchanging X and Y axes if PX < PY READ (nin,*) eps READ (nin,*) m READ (nin,*) px, py IF (px<py) THEN itemp = px px = py py = itemp itemp = 1 ELSE itemp = 0 END IF nadres = (px-7)*(py-7) npoint = m + (px-7)*(py-7) nc = (px-4)*(py-4) nws = (2*nc+1)*(3*py-6) - 2 ALLOCATE (lamda(px),mu(py),x(m),y(m),f(m),ff(m),w(m),dl(nc),c(nc), & ws(nws),point(npoint),adres(nadres),wrk(py-4),iwrk(py-4)) IF (itemp==1) THEN READ (nin,*) (y(i),x(i),f(i),w(i),i=1,m) IF (py>8) THEN READ (nin,*) mu(5:(py-4)) END IF IF (px>8) THEN READ (nin,*) lamda(5:(px-4)) END IF ELSE READ (nin,*) (x(i),y(i),f(i),w(i),i=1,m) IF (px>8) THEN READ (nin,*) lamda(5:(px-4)) END IF IF (py>8) THEN READ (nin,*) mu(5:(py-4)) END IF END IF ! Sort points into panel order ifail = 0 CALL e02zaf(px,py,lamda,mu,m,x,y,point,npoint,adres,nadres,ifail) WRITE (nout,*) WRITE (nout,99995) 'Interior ', label(itemp+1), '-knots' IF (px==8) THEN WRITE (nout,*) 'None' ELSE DO j = 5, px - 4 WRITE (nout,99996) lamda(j) END DO END IF WRITE (nout,*) WRITE (nout,99995) 'Interior ', label(2-itemp), '-knots' IF (py==8) THEN WRITE (nout,*) 'None' ELSE DO j = 5, py - 4 WRITE (nout,99996) mu(j) END DO END IF ! Fit bicubic spline to data points ifail = 0 CALL e02daf(m,px,py,x,y,f,w,lamda,mu,point,npoint,dl,c,nc,ws,nws,eps, & sigma,rank,ifail) WRITE (nout,*) WRITE (nout,99999) 'Sum of squares of residual RHS', sigma WRITE (nout,*) WRITE (nout,99998) 'Rank', rank ! Evaluate spline at the data points ifail = 0 CALL e02def(m,px,py,x,y,lamda,mu,c,ff,wrk,iwrk,ifail) sum = 0.0E0_nag_wp IF (itemp==1) THEN WRITE (nout,*) WRITE (nout,*) 'X and Y have been interchanged' END IF ! Output data points, fitted values and residuals WRITE (nout,*) WRITE (nout,*) & ' X Y Data Fit Residual' DO i = 1, nadres iadres = i + m LOOP: DO iadres = point(iadres) IF (iadres<=0) THEN EXIT LOOP END IF temp = ff(iadres) - f(iadres) WRITE (nout,99997) x(iadres), y(iadres), f(iadres), ff(iadres), & temp sum = sum + (temp*w(iadres))**2 END DO LOOP END DO WRITE (nout,*) WRITE (nout,99999) 'Sum of squared residuals', sum WRITE (nout,*) WRITE (nout,*) 'Spline coefficients' DO i = 1, px - 4 WRITE (nout,99996) (c((i-1)*(py-4)+j),j=1,py-4) END DO 99999 FORMAT (1X,A,1P,E16.2) 99998 FORMAT (1X,A,I5) 99997 FORMAT (1X,4F11.4,E11.2) 99996 FORMAT (1X,6F11.4) 99995 FORMAT (1X,A,A1,A) END PROGRAM e02dafe