def cond(A, norm=lambda x: mnorm(x,1)): """ Calculate the condition number of a matrix using a specified matrix norm. The condition number estimates the sensitivity of a matrix to errors. Example: small input errors for ill-conditionded coefficient matrices alter the solution of the system dramatically. For ill-conditioned matrices it's recommended to use qr_solve() instead of lu_solve(). This does not help with input errors however, it just avoids to add additional errors. Definition: cond(A) = ||A|| * ||A**-1|| """ return norm(A) * norm(inverse(A))
def cond(A, norm=lambda x: mnorm(x,1)): """ Calculate the condition number of a matrix using a specified matrix norm. The condition number estimates the sensitivity of a matrix to errors. Example: small input errors for ill-conditioned coefficient matrices alter the solution of the system dramatically. For ill-conditioned matrices it's recommended to use qr_solve() instead of lu_solve(). This does not help with input errors however, it just avoids to add additional errors. Definition: cond(A) = ||A|| * ||A**-1|| """ return norm(A) * norm(inverse(A))
def qr_solve(A, b, norm=norm, **kwargs): """ Ax = b => x, ||Ax - b|| Solve a determined or overdetermined linear equations system and calculate the norm of the residual (error). QR decompostion using Householder factorization is applied, which gives very accurate results even for ill-conditioned matrices. qr_solve is twice as efficient. """ # do not overwrite A nor b A, b = matrix(A, **kwargs).copy(), matrix(b, **kwargs).copy() if A.rows < A.cols: raise ValueError('cannot solve underdetermined system') H, p, x, r = householder(extend(A, b)) res = norm(r) # calculate residual "manually" for determined systems if res == 0: res = norm(residual(A, x, b)) return matrix(x, **kwargs), res
def qr_solve(A, b, norm=norm, **kwargs): """ Ax = b => x, ||Ax - b|| Solve a determined or overdetermined linear equations system and calculate the norm of the residual (error). QR decomposition using Householder factorization is applied, which gives very accurate results even for ill-conditioned matrices. qr_solve is twice as efficient. """ # do not overwrite A nor b A, b = matrix(A, **kwargs).copy(), matrix(b, **kwargs).copy() if A.rows < A.cols: raise ValueError('cannot solve underdetermined system') H, p, x, r = householder(extend(A, b)) res = norm(r) # calculate residual "manually" for determined systems if res == 0: res = norm(residual(A, x, b)) return matrix(x, **kwargs), res
def improve_solution(A, x, b, maxsteps=1): """ Improve a solution to a linear equation system iteratively. This re-uses the LU decomposition and is thus cheap. Usually 3 up to 4 iterations are giving the maximal improvement. """ assert A.rows == A.cols, 'need n*n matrix' # TODO: really? for _ in xrange(maxsteps): r = residual(A, x, b) if norm(r, 2) < 10*eps: break # this uses cached LU decomposition and is thus cheap dx = lu_solve(A, -r) x += dx return x