aboutsummaryrefslogtreecommitdiff
path: root/math/llsq/progs/prog3.f
diff options
context:
space:
mode:
authorJoseph Hunkeler <jhunkeler@gmail.com>2015-07-08 20:46:52 -0400
committerJoseph Hunkeler <jhunkeler@gmail.com>2015-07-08 20:46:52 -0400
commitfa080de7afc95aa1c19a6e6fc0e0708ced2eadc4 (patch)
treebdda434976bc09c864f2e4fa6f16ba1952b1e555 /math/llsq/progs/prog3.f
downloadiraf-linux-fa080de7afc95aa1c19a6e6fc0e0708ced2eadc4.tar.gz
Initial commit
Diffstat (limited to 'math/llsq/progs/prog3.f')
-rw-r--r--math/llsq/progs/prog3.f138
1 files changed, 138 insertions, 0 deletions
diff --git a/math/llsq/progs/prog3.f b/math/llsq/progs/prog3.f
new file mode 100644
index 00000000..290f8161
--- /dev/null
+++ b/math/llsq/progs/prog3.f
@@ -0,0 +1,138 @@
+c prog3
+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 demonstrate the use of subroutine svdrs to compute the
+c singular value decomposition of a matrix, a, and solve a least
+c squares problem, a*x=b.
+c
+c the s.v.d. a= u*(s,0)**t*v**t is
+c computed so that..
+c (1) u**t*b replaces the m+1 st. col. of b.
+c
+c (2) u**t replaces the m by m identity in
+c the first m cols. of b.
+c
+c (3) v replaces the first n rows and cols.
+c of a.
+c
+c (4) the diagonal entries of the s matrix
+c replace the first n entries of the array s.
+c
+c the array s( ) must be dimensioned at least 3*n .
+c
+ dimension a(8,8),b(8,9),s(24),x(8),aa(8,8)
+ real gen,anoise
+ double precision sm
+ data mda,mdb/8,8/
+c
+ do 150 noise=1,2
+ anoise = 0.
+ rho = 1.e-3
+ if(noise .eq. 1) go to 5
+ anoise = 1.e-4
+ rho = 10. * anoise
+ 5 continue
+ write(6,230)
+ write(6,240) anoise,rho
+c initialize data generation function
+c ..
+ dummy= gen(-1.)
+c
+ do 150 mn1=1,6,5
+ mn2=mn1+2
+ do 150 m=mn1,mn2
+ do 150 n=mn1,mn2
+ write (6,160) m,n
+ do 20 i=1,m
+ do 10 j=1,m
+ 10 b(i,j)=0.
+ b(i,i)=1.
+ do 20 j=1,n
+ a(i,j)= gen(anoise)
+ 20 aa(i,j)=a(i,j)
+ do 30 i=1,m
+ 30 b(i,m+1)= gen(anoise)
+c
+c the arrays are now filled in..
+c compute the s.v.d.
+c ******************************************************
+ call svdrs (a,mda,m,n,b,mdb,m+1,s)
+c ******************************************************
+c
+ write (6,170)
+ write (6,220) (i,s(i),i=1,n)
+ write (6,180)
+ write (6,220) (i,b(i,m+1),i=1,m)
+c
+c test for disparity of ratio of singular values.
+c ..
+ krank=n
+ tau=rho*s(1)
+ do 40 i=1,n
+ if (s(i).le.tau) go to 50
+ 40 continue
+ go to 55
+ 50 krank=i-1
+ 55 write(6,250) tau, krank
+c compute solution vector assuming pseudorank is krank
+c ..
+ 60 do 70 i=1,krank
+ 70 b(i,m+1)=b(i,m+1)/s(i)
+ do 90 i=1,n
+ sm=0.d0
+ do 80 j=1,krank
+ 80 sm=sm+a(i,j)*dble(b(j,m+1))
+ 90 x(i)=sm
+c compute predicted norm of residual vector.
+c ..
+ srsmsq=0.
+ if (krank.eq.m) go to 110
+ kp1=krank+1
+ do 100 i=kp1,m
+ 100 srsmsq=srsmsq+b(i,m+1)**2
+ srsmsq=sqrt(srsmsq)
+c
+ 110 continue
+ write (6,190)
+ write (6,220) (i,x(i),i=1,n)
+ write (6,200) srsmsq
+c compute the frobenius norm of a**t- v*(s,0)*u**t.
+c
+c compute v*s first.
+c
+ minmn=min0(m,n)
+ do 120 j=1,minmn
+ do 120 i=1,n
+ 120 a(i,j)=a(i,j)*s(j)
+ dn=0.
+ do 140 j=1,m
+ do 140 i=1,n
+ sm=0.d0
+ do 130 l=1,minmn
+ 130 sm=sm+a(i,l)*dble(b(l,j))
+c computed difference of (i,j) th entry
+c of a**t-v*(s,0)*u**t.
+c ..
+ t=aa(j,i)-sm
+ 140 dn=dn+t**2
+ dn=sqrt(dn)/(sqrt(float(n))*s(1))
+ write (6,210) dn
+ 150 continue
+ stop
+ 160 format (1h0////9h0 m n/1x,2i4)
+ 170 format (1h0,8x,25hsingular values of matrix)
+ 180 format (1h0,8x,30htransformed right side, u**t*b)
+ 190 format (1h0,8x,33hestimated parameters, x=a**(+)*b,21h computed b
+ 1y 'svdrs' )
+ 200 format (1h0,8x,24hresidual vector length =,e12.4)
+ 210 format (1h0,8x,43hfrobenius norm (a-u*(s,0)**t*v**t)/(sqrt(n),
+ *22h*spectral norm of a) =,e12.4)
+ 220 format (9x,i5,e16.8,i5,e16.8,i5,e16.8,i5,e16.8,i5,e16.8)
+ 230 format(51h1prog3. this program demonstrates the algorithm,
+ * 9h, svdrs. )
+ 240 format(55h0the relative noise level of the generated data will be,
+ *e16.4/44h0the relative tolerance, rho, for pseudorank,
+ *17h determination is,e16.4)
+ 250 format(1h0,8x,36habsolute pseudorank tolerance, tau =,
+ *e12.4,10x,12hpseudorank =,i5)
+ end