functionhilb(n::Integer)a=Array(typeof(1.0),n,n)fori=1:nforj=1:na[j,i]=1.0/(i+j-1.0)endendreturnaendm=1000n=100# form an ill-conditioned matrixa=randn(m,n)*hilb(n)x0=ones(n,1)b=a*x0;
In [76]:
#Compute errors and residuals using both DGELSY and DGELSDresidy=Float64[]residd=Float64[]errory=Float64[]errord=Float64[]fori=20:60xy,ry=Base.LinAlg.LAPACK.gelsy!(copy(a),copy(b),2.0^-i)xd,rd=Base.LinAlg.LAPACK.gelsd!(copy(a),copy(b),2.0^-i)push!(residy,norm(a*xy-b))push!(residd,norm(a*xd-b))push!(errory,norm(xy-x0))push!(errord,norm(xd-x0))println(i," ",norm(a*xy-b)," ",norm(a*xd-b)," ",norm(xy-x0)," ",norm(xd-x0))end
usingGadflyplot(layer(x=map(x->2.0^-x,20:60),y=residy,Geom.line,Theme(default_color=color("red"))),layer(x=map(x->2.0^-x,20:60),y=errory,Geom.line,Theme(default_color=color("red"))),layer(x=map(x->2.0^-x,20:60),y=residd,Geom.line),layer(x=map(x->2.0^-x,20:60),y=errord,Geom.line),layer(xintercept=[eps(),eps()*(1+1.8*√n*0+1)*1.9*√n*(n+1),sqrt(eps())],Geom.vline(color=color("orange"))),Guide.xlabel("Tolerance"),Guide.ylabel("Error or residual"),Scale.x_log2,Scale.y_log2,)