home *** CD-ROM | disk | FTP | other *** search
- PROGRAM d2r8(input,output,dfile);
- (* driver for routine SVBKSB *)
- LABEL 10,99;
- CONST
- np=20;
- mp=20;
- TYPE
- glnparray = ARRAY [1..np] OF real;
- glmparray = ARRAY [1..mp] OF real;
- glnpbynp = ARRAY [1..np,1..np] OF real;
- glmpbynp = ARRAY [1..mp,1..np] OF real;
- VAR
- j,k,l,m,n : integer;
- wmax,wmin : real;
- a,b,u : glmpbynp;
- v : glnpbynp;
- w,x : glnparray;
- c : glmparray;
- dfile : text;
-
- (*$I MODFILE.PAS *)
- (*$I SVDCMP.PAS *)
-
- (*$I SVBKSB.PAS *)
-
- BEGIN
- glopen(dfile,'matrx1.dat');
- 10: readln(dfile);
- readln(dfile);
- readln(dfile,n,m);
- readln(dfile);
- FOR k := 1 to n DO BEGIN
- FOR l := 1 to n-1 DO read(dfile,a[k,l]);
- readln(dfile,a[k,n])
- END;
- readln(dfile);
- FOR l := 1 to m DO BEGIN
- FOR k := 1 to n-1 DO read(dfile,b[k,l]);
- readln(dfile,b[n,l])
- END;
- (* copy a into u *)
- FOR k := 1 to n DO BEGIN
- FOR l := 1 to n DO BEGIN
- u[k,l] := a[k,l]
- END
- END;
- (* decompose matrix a *)
- svdcmp(u,n,n,np,np,w,v);
- (* find maximum singular value *)
- wmax := 0.0;
- FOR k := 1 to n DO BEGIN
- IF (w[k] > wmax) THEN wmax := w[k]
- END;
- (* define "small" *)
- wmin := wmax*(1.0e-6);
- (* zero the "small" singular values *)
- FOR k := 1 to n DO BEGIN
- IF (w[k] < wmin) THEN w[k] := 0.0
- END;
- (* backsubstitute for each right-hand side vector *)
- FOR l := 1 to m DO BEGIN
- writeln;
- writeln('Vector number ',l:2);
- FOR k := 1 to n DO BEGIN
- c[k] := b[k,l]
- END;
- svbksb(u,w,v,n,n,np,np,c,x);
- writeln (' solution vector is:');
- FOR k := 1 to n-1 DO write(x[k]:12:6);
- writeln(x[n]:12:6);
- writeln (' original right-hand side vector:');
- FOR k := 1 to n-1 DO write(c[k]:12:6);
- writeln(c[n]:12:6);
- writeln (' result of (matrix)*(sol''n vector):');
- FOR k := 1 to n DO BEGIN
- c[k] := 0.0;
- FOR j := 1 to n DO BEGIN
- c[k] := c[k]+a[k,j]*x[j]
- END
- END;
- FOR k := 1 to n-1 DO write(c[k]:12:6);
- writeln(c[n]:12:6)
- END;
- writeln ('***********************************');
- IF eof(dfile) THEN GOTO 99;
- writeln ('press RETURN for next problem');
- readln;
- GOTO 10;
- 99: close(dfile)
- END.
-