aboutsummaryrefslogtreecommitdiff
path: root/math/deboor/progs/prog13.f
blob: 45e6362fc54f92c943e19f2760ba7688b7c922d9 (plain) (blame)
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
chapter xiii, example 2m. cubic spline interpolant at knot averages
c			 with good knots. modified around label 4.
c  from  * a practical guide to splines *  by c. de boor
calls splint(banfac/slv,bsplvb),newnot,bsplpp(bsplvb*)
c     parameter nmax=20,nmaxp6=26,nmaxp2=22,nmaxt7=140
      integer i,istep,iter,itermx,n,nhigh,nmk,nlow
c     real algerp,aloger,bcoef(nmaxp2),break(nmax),decay,dx,errmax,
c    *	  c(4,nmax),g,gtau(nmax),h,pnatx,scrtch(nmaxt7),step,t(nmaxp6),
c    *	  tau(nmax),tnew(nmax)
      real algerp,aloger,bcoef(22),break(20),decay,dx,errmax,
     *	  c(4,20),g,gtau(20),h,pnatx,scrtch(140),step,t(26),
     *	  tau(20),tnew(20),x
c     istep and step = float(istep) specify point density for error det-
c     ermination.
      data step, istep /20., 20/
c				the function  g  is to be interpolated .
      g(x) = sqrt(x+1.)
      decay = 0.
c      read in the number of iterations to be carried out and the lower
c      and upper limit for the number  n  of data points to be used.
      read 500,itermx,nlow,nhigh
  500 format(3i3)
      print 600, itermx
  600 format(i4,22h cycles through newnot//
     *	    28h  n   max.error	 decay exp./)
c				  loop over  n = number of data points .
      do 40 n=nlow,nhigh,2
	 if (n .eq. nlow)		go to 4
	 call newnot ( break, c, l, 4, tnew, l+2, scrtch )
	 l = l + 2
	 t(5+l) = 1.
	 t(6+l) = 1.
	 iter = 1
					go to 15
    4	 nmk = n-4
	 h = 2./float(nmk+1)
	 do 5 i=1,4
	    t(i) = -1.
    5	    t(n+i) = 1.
	 if (nmk .lt. 1)		go to 10
	 do 6 i=1,nmk
    6	    t(i+4) = float(i)*h - 1.
   10	 iter = 1
c		construct cubic spline interpolant. then, itermx  times,
c		 determine new knots from it and find a new interpolant.
   11	    do 12 i=1,n
	       tau(i) = (t(i+1)+t(i+2)+t(i+3))/3.
   12	       gtau(i) = g(tau(i))
	    call splint ( tau, gtau, t, n, 4, scrtch, bcoef, iflag )
	    call bsplpp ( t, bcoef, n, 4, scrtch, break, c, l )
	    if (iter .gt. itermx)	go to 19
	    iter = iter + 1
	    call newnot ( break, c, l, 4, tnew, l, scrtch )
   15	    do 18 i=2,l
   18	       t(3+i) = tnew(i)
					go to 11
c		       estimate max.interpolation error on  (-1,1) .
   19	 errmax = 0.
c			    loop over polynomial pieces of interpolant .
	 do 30 i=1,l
	    dx = (break(i+1)-break(i))/step
c		 interpolation error is calculated at  istep  points per
c		     polynomial piece .
	    do 30 j=1,istep
	       h = float(j)*dx
	       pnatx = c(1,i)+h*(c(2,i)+h*(c(3,i)+h*c(4,i)/3.)/2.)
   30	    errmax = amax1(errmax,abs(g(break(i)+h)-pnatx))
c					      calculate decay exponent .
	 aloger = alog(errmax)
	 if (n .gt. nlow)  decay =
     *	     (aloger - algerp)/alog(float(n)/float(n-2))
	 algerp = aloger
c
   40	 print 640,n,errmax,decay
  640 format(i3,e12.4,f11.2)
					stop
      end