def testqr(a, eps): q,r = qr_decomposition(a,mode='e') q,r = qr_decomposition(a,mode='r') q,r = qr_decomposition(a,mode='full') res = num.matrixmultiply(q,r) b = num.ravel( num.abs(res - a) ) if num.maximum.reduce(b) > eps: raise SelftestFailure else: print "OK"
def testqr(a, eps): q, r = qr_decomposition(a, mode='e') q, r = qr_decomposition(a, mode='r') q, r = qr_decomposition(a, mode='full') res = num.matrixmultiply(q, r) b = num.ravel(num.abs(res - a)) if num.maximum.reduce(b) > eps: raise SelftestFailure else: print "OK"
def linear_least_squares(a, b, rcond=1.e-10): """solveLinearLeastSquares(a,b) returns x,resids,rank,s where x minimizes 2-norm(|b - Ax|) resids is the sum square residuals rank is the rank of A s is an rank of the singual values of A in desending order If b is a matrix then x is also a matrix with corresponding columns. If the rank of A is less than the number of columns of A or greater than the numer of rows, then residuals will be returned as an empty array otherwise resids = sum((b-dot(A,x)**2). Singular values less than s[0]*rcond are treated as zero. """ one_eq = len(b.getshape()) == 1 if one_eq: b = b[:, num.NewAxis] _assertRank2(a, b) m = a.getshape()[0] n = a.getshape()[1] n_rhs = b.getshape()[1] ldb = max(n,m) if m != b.getshape()[0]: raise LinAlgError, 'Incompatible dimensions' t =_commonType(a, b) real_t = _array_type[0][_array_precision[t]] bstar = num.zeros((ldb,n_rhs),t) bstar[:b.getshape()[0],:n_rhs] = copy.copy(b) a,bstar = _castCopyAndTranspose(t, a, bstar) s = num.zeros((min(m,n),),real_t) nlvl = max( 0, int( math.log( float(min( m,n ))/2. ) ) + 1 ) iwork = num.zeros((3*min(m,n)*nlvl+11*min(m,n),), 'l') if _array_kind[t] == 1: # Complex routines take different arguments lapack_routine = lapack_lite2.zgelsd lwork = 1 rwork = num.zeros((lwork,), real_t) work = num.zeros((lwork,),t) results = lapack_routine( m, n, n_rhs, a, m, bstar,ldb , s, rcond, 0,work,-1,rwork,iwork,0 ) lwork = int(abs(work[0])) rwork = num.zeros((lwork,),real_t) a_real = num.zeros((m,n),real_t) bstar_real = num.zeros((ldb,n_rhs,),real_t) results = lapack_lite2.dgelsd( m, n, n_rhs, a_real, m, bstar_real,ldb , s, rcond, 0,rwork,-1,iwork,0 ) lrwork = int(rwork[0]) work = num.zeros((lwork,), t) rwork = num.zeros((lrwork,), real_t) results = lapack_routine( m, n, n_rhs, a, m, bstar,ldb , s, rcond, 0,work,lwork,rwork,iwork,0 ) else: lapack_routine = lapack_lite2.dgelsd lwork = 1 work = num.zeros((lwork,), t) results = lapack_routine( m, n, n_rhs, a, m, bstar,ldb , s, rcond, 0,work,-1,iwork,0 ) lwork = int(work[0]) work = num.zeros((lwork,), t) results = lapack_routine( m, n, n_rhs, a, m, bstar,ldb , s, rcond, 0,work,lwork,iwork,0 ) if results['info'] > 0: raise LinAlgError, 'SVD did not converge in Linear Least Squares' resids = num.array([],type=t) if one_eq: x = copy.copy(num.ravel(bstar)[:n]) if (results['rank']==n) and (m>n): resids = num.array([num.sum((num.ravel(bstar)[n:])**2)]) else: x = copy.copy(num.transpose(bstar)[:n,:]) if (results['rank']==n) and (m>n): resids = copy.copy(num.sum((num.transpose(bstar)[n:,:])**2)) return x,resids,results['rank'],copy.copy(s[:min(n,m)])