SIAM 2002 challenge #3

3. The infinite matrix A with entries a11 = 1, a12 = 1/2, a21 = 1/3, a13 = 1/4, a22 = 1/5, a31 = 1/6, etc., is a bounded operator on ell2. What is ||A|| ?

The following solution was supplied by Brian Medley


Siam Challenge Problem 3

(1)  From the start, I assumed that this can be tackled by finding the 
limit (as n->infinity) of the norms of the n*n matrices formed by
truncating A after the nth row and nth column, (matrices mude up of the top 
left corner of A). If you don't wish to read my (non-rigorous) reasons for 
trusting this assumption, skip straight to (2) below.

Using such a matrix (top corner of A) as a kind of "approximation" to A 
would have an effect, when applied to an element of l_2, equivalent to the 
following:

Truncate the element of l_2 after its nth postition, apply the matrix A to 
this, and then truncate the result after its nth position.

I convinced myself that the two truncations would not matter two much if n 
is large: the values removed from the later positions of original element 
would be multiplied by the small numbers in A's columns n+1 and beyond, and 
so make only small contributions to the result, whilst the removed values 
of the image element would be small numbers anyway, having been generated 
by calculations involving the small values in A's lower rows.

Thus an l_2- vector which is stretched a lot by A will be stretched a lot 
if truncated and treated with a top-corner approximation to A, so the norms 
of the top-corner sub-matrices should tend to the norm of A. Finally, the 
l_2 norm is the infinite equivalent of the Euclidean norm on R^n, so in my 
work on finite mtrices I can work with lengths of vectors in the usual way.

(2) So now I had to find the norms of large submatrices of A. Whilst I 
remembered that the norm of a matrix is the largest amount by which it 
stretches an element, I confess that for a short while I confused this idea 
with that of the largest eigenvector of the matrix, and even began to 
program with this in mind. The early results of the program alerted me to 
the distinction between stretches that preserve direction and those that 
don't. I looked up the result I needed, that the norm of a matrix M is the 
square root of the largest eigenvalue of (MT)(M),  where MT is the 
transpose of M.

(3) To find the largest eigenvalue of a big matrix, I used the idea that if 
a vector x is a linear combination of eigenvectors, say x = e_1 + e_2 + ... 
+ e_n, then {[(MT)(M)]^k}(x) will be (lambda_1)^k.(e_1) + 
(lambda_2)^k.(e_2) + ... + (lambda_n)^k.(e_n), so that the e_i with the 
biggest lambda_i will increasingly dominate the vector formed by repeatedly 
premultiplying x by (MT)(M). The UBASIC program below does exactly that. 
After each iteration, it re-scales the vector to unit length by dividing it 
by its length.

(4) The program generates a starting vector at random. I ran the program 
with several values for the random seed to guard against unluckily getting 
a starting vector expressible as a linear combination of the eigenvectors 
_other_ than the one I wanted. Once the gap between successive estimates of 
the largest eignevalue falls below the value set by "err", the program 
doubles the size of the sub-matrix and starts again, using the estimated 
eigenvector from the smaller matrix as the initial trial vector (early runs 
of the program did not use this feature, as I wanted to check that there 
were no big discontinuities in behaviour as the size of the matrix grew, 
but for the big matirces needed to establish the 10 figures of accuracy, I 
needed the time saving achieved by having a good first approximation).

(5) The answer!
In the output given in (7) below the gaps between norms of successive 
matrices decrease by a factor of about 8 as matrix size doubles. Assuming 
this pattern coninues, we can be sure of the answer to 10 figures: it 
truncates to 1.274224152 and rounds to 1.274224153

(6) Here is the program:

     1   'siam challenge problem 3
     2   '
    10   point 10 '       sets number of decimal places
    20   Err=1/10^16 '   "error" between successive estimates
    21   ' must become less than err before moving on to next matrix
    30   Oldnorm=100
    40   randomize 1
    48   '
    49   ' lines 60 and 70 set up data files used for storing vectors
    50   ' File1 is the image after MT, file2 intermediate image after M.
    55   ' The word values and the filling with random numbers in lines
    56   ' 60 to 80 are not logical but UBASIC was giving me error
    57   ' messages that didn't make sense either and this tinkering
    58   ' seemed to cure the problem
    59   '
    60   open "si3vec1" as file1(7000) word 15
    70   open "si3vec2" as file2(7000) word 15
    80   for I=1 to 7000:file1(I)=rnd:file2(I)=rnd:next I
    81   '
    82   ' 90 and 100 set up files for saving output
    83   '
    90   open "si3res.txt" for output as #1
   100   open "si3scre.txt" for output as #2
   101   '
   110   Siz=200
   120   print #2,"screen output when initial size is";Siz
   130   '
   140   'fill vector1 at random
   141   '
   150   randomize
   160   S=0
   170   for I=1 to Siz
   180   file1(I)=rnd
   190   S+=abs(file1(I)^2)
   200   next I
   211   '
   212   ' "Norm is a bit of a misnomer in 220. It is the norm of a vector
   213   ' but on later passes through this code it's the square of the estimate
   214   ' for the norm of the matrix.
   216   '
   220   Norm=sqrt(S)
   249   '
   250   'check for convergence
   251   '
   260   if abs(Norm-Oldnorm)<Err then Siz*=2:print "size=";Siz:print #2,"size=";Siz:print #1,Siz/2,sqrt(Norm):for I=Siz\2+1 to Siz:file1(I)=0:next I
   270   Oldnorm=Norm
   277   '
   278   'rescale current vector to unit length
   279   '
   280   for I=1 to Siz
   290   Z=file1(I)/Norm
   300   file1(I)=Z
   310   next I
   311   '
   317   ' The next two lines print garbage 1st time through but on later
   318   ' passes print out the current estimate of the norm
   319   '
   320   print sqrt(Norm)
   330   print #2,sqrt(Norm)
   335   '
   340   ' Multiply file1 By M and Store Result In file2
   345   '
   350   S=0
   360   for I=1 to Siz
   370   Newelt=0
   380   for J=1 to Siz
   390   Newelt+=(fnA(I,J)*file1(J))
   400   next J
   410   S+=abs(Newelt)^2
   420   file2(I)=Newelt
   430   next I
   431   '
   435   ' print the "stretch" from x to M(x) - another estimate of the norm
   439   '
   440   print "(";sqrt(S);")"
   450   print #2"(";sqrt(S);")"
   455   '
   460   ' Multiply file2 By MT and Store Result In file1
   465   '
   470   S=0
   480   for I=1 to Siz
   490   Newelt=0
   500   for J=1 to Siz
   510   Newelt+=fnA(J,I)*file2(J)
   520   next J
   530   S+=abs(Newelt)^2
   540   file1(I)=Newelt
   550   next I
   560   goto 250
   797   '
   798   'Routine for Calculating Elements Of M
   799   '
   800   fnA(I,J)
   810   local N
   820   N=I+J-2
   830   return(1/(0.5*N*(N+1)+I))

(7) sample output:

screen output when initial size is 200
  2.777128150913789805230078616851372410556616621222
( 0.125090649973425233649683956136349493058063328264 )
  0.386069863653173486981635516867942626799516009373
( 1.273193932981053739736233891712848931482825390414 )
  1.273702251258886387698802153871941570302882250772
( 1.274223441010932231642904044971638909178200320253 )
  1.274223520179869730370254622280176495408698273634
( 1.274223601328154886373162525794155785813114414747 )
  1.274223601340526627167487730515401658529319773736
( 1.274223601353207682816114789395583874821432626922 )
  1.274223601353209616167334235143084955665039929703
( 1.274223601353211597855668952797578584886216043368 )
  1.274223601353211598157796767105780367134016456156
( 1.274223601353211598467478297904121046936151927555 )
size= 400
  1.274223601353211598467525511889486851556689268052
( 1.274223858394176413727028339127882946136219197314 )
  1.274223969892378332360689005106707995586524521697
( 1.274224081392223999386371415817929529181804839855 )
  1.274224081392226688701223845551857729333411253355
( 1.274224081392229441004820443587195221176362515875 )
  1.274224081392229441397495365960643541330184262698
( 1.274224081392229441799988837978473663624745449699 )
size= 800
  1.274224081392229441800050221819212161939090764464
( 1.274224114866918164430727075379474974886096625442 )
  1.274224129284003428801755066287906259160099955518
( 1.274224143701141589768204819746910125030848979168 )
  1.274224143701141641972818679651654423083391289476
( 1.274224143701141695375200070568882552200993031407 )
  1.274224143701141695382661116097466311642403481075
( 1.274224143701141695390308719118469712673700073204 )
size= 1600
  1.27422414370114169539030988548051231863663935352
( 1.274224147987001053758023288819531560887377992676 )
  1.274224149826982798521302008681638616001916227161
( 1.27422415166696621795730058457566353577858707572 )
  1.274224151666966218899601553222978298055515317455
( 1.274224151666966219863118862883905845291823395172 )
size= 3200
  1.274224151666966219863250930801970451979602797302
( 1.2742241522101484486584930734180590928109778603 )
  1.274224152443028887875950968641277888300854084173
( 1.274224152675909379710924267072870365374652416087 )
  1.274224152675909379727105882597475168081641934905
( 1.274224152675909379743646033524044382302795308088 )
size= 6400
  1.274224152675909379743648264126147888455923501466
( 1.274224152744342178641519689434302775887730671414 )
  1.274224152773665789038775287233087330270597651217
( 1.274224152802989401083743928294146221069842644932 )
  1.274224152802989401084012602383214855725106495874
( 1.27422415280298940108428715330417670103738065913 )
size= 12800

[The program elegantly crashes here as the size of the arrays is exceeded]

<back