aboutsummaryrefslogtreecommitdiff
path: root/math/llsq/progs/prog5.f
blob: 5484b846ff5a97dc54d90cf9ca7607c9e44e1a58 (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
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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
c     prog5
c     c.l.lawson and r.j.hanson, jet propulsion laboratory, 1973 jun 12
c     to appear in 'solving least squares problems', prentice-hall, 1974
c	   example of the use of subroutines bndacc and bndsol to solve
c     sequentially the banded least squares problem which arises in
c     spline curve fitting.
c
      dimension x(12),y(12),b(10),g(12,5),c(12),q(4),cov(12)
c
c	 define functions p1 and p2 to be used in constructing
c	 cubic splines over uniformly spaced breakpoints.
c
      p1(t)=.25*t**2*t
      p2(t)=-(1.-t)**2*(1.+t)*.75+1.
      zero=0.
c
      write (6,230)
      mdg=12
      nband=4
      m=12
c				   set ordinates of data
      y(1)=2.2
      y(2)=4.0
      y(3)=5.0
      y(4)=4.6
      y(5)=2.8
      y(6)=2.7
      y(7)=3.8
      y(8)=5.1
      y(9)=6.1
      y(10)=6.3
      y(11)=5.0
      y(12)=2.0
c				   set abcissas of data
	   do 10 i=1,m
   10	   x(i)=2*i
c
c     begin loop thru cases using increasing nos of breakpoints.
c
	   do 150 nbp=5,10
	   nc=nbp+2
c				   set breakpoints
	   b(1)=x(1)
	   b(nbp)=x(m)
	   h=(b(nbp)-b(1))/float(nbp-1)
	   if (nbp.le.2) go to 30
		do 20 i=3,nbp
   20		b(i-1)=b(i-2)+h
   30	   continue
	   write (6,240) nbp,(b(i),i=1,nbp)
c
c     initialize ir and ip before first call to bndacc.
c
	   ir=1
	   ip=1
	   i=1
	   jt=1
   40	   mt=0
   50	   continue
	   if (x(i).gt.b(jt+1)) go to 60
c
c			 set row  for ith data point
c
	   u=(x(i)-b(jt))/h
	   ig=ir+mt
	   g(ig,1)=p1(1.-u)
	   g(ig,2)=p2(1.-u)
	   g(ig,3)=p2(u)
	   g(ig,4)=p1(u)
	   g(ig,5)=y(i)
	   mt=mt+1
	   if (i.eq.m) go to 60
	   i=i+1
	   go to 50
c
c		    send block of data to processor
c
   60	   continue
	   call bndacc (g,mdg,nband,ip,ir,mt,jt)
	   if (i.eq.m) go to 70
	   jt=jt+1
	   go to 40
c		    compute solution c()
   70	   continue
	   call bndsol (1,g,mdg,nband,ip,ir,c,nc,rnorm)
c		   write solution coefficients
	   write (6,180) (c(l),l=1,nc)
	   write (6,210) rnorm
c
c	       compute and print x,y,yfit,r=y-yfit
c
	   write (6,160)
	   jt=1
		do 110 i=1,m
   80		if (x(i).le.b(jt+1)) go to 90
		jt=jt+1
		go to 80
c
   90		u=(x(i)-b(jt))/h
		q(1)=p1(1.-u)
		q(2)=p2(1.-u)
		q(3)=p2(u)
		q(4)=p1(u)
		yfit=zero
		     do 100 l=1,4
		     ic=jt-1+l
  100		     yfit=yfit+c(ic)*q(l)
		r=y(i)-yfit
		write (6,170) i,x(i),y(i),yfit,r
  110		continue
c
c     compute residual vector norm.
c
	   if (m.le.nc) go to 150
	   sigsq=(rnorm**2)/float(m-nc)
	   sigfac=sqrt(sigsq)
	   write (6,220) sigfac
	   write (6,200)
c
c     compute and print cols. of covariance.
c
		do 140 j=1,nc
		     do 120 i=1,nc
  120		     cov(i)=zero
		cov(j)=1.
		call bndsol (2,g,mdg,nband,ip,ir,cov,nc,rdummy)
		call bndsol (3,g,mdg,nband,ip,ir,cov,nc,rdummy)
c
c    compute the jth col. of the covariance matrix.
		     do 130 i=1,nc
  130		     cov(i)=cov(i)*sigsq
  140		write (6,190) (l,j,cov(l),l=1,nc)
  150	   continue
      stop
  160 format (4h0  i,8x,1hx,10x,1hy,6x,4hyfit,4x,8hr=y-yfit/1x)
  170 format (1x,i3,4x,f6.0,4x,f6.2,4x,f6.2,4x,f8.4)
  180 format (4h0c =,10f10.5/(4x,10f10.5))
  190 format (4(02x,2i5,e15.7))
  200 format (46h0covariance matrix of the spline coefficients.)
  210 format (9h0rnorm	=,e15.8)
  220 format (9h0sigfac =,e15.8)
  230 format (50h1prog5.    execute a sequence of cubic spline fits,27h
     1to a discrete set of data.)
  240 format (1x////,11h0new case..,/47h0number of breakpoints, includin
     1g endpoints, is,i5/14h0breakpoints =,10f10.5,/(14x,10f10.5))
      end