def qr_full(A): """ Q,R = qr_full(A) This function is merely a wrapper of UTPM.qr_full, Function.qr_full, scipy.linalg.qr Parameters ---------- A: algopy.UTPM or algopy.Function or numpy.ndarray A.shape = (M,N), M >= N Returns -------- Q: same type as A Q.shape = (M,M) R: same type as A R.shape = (M,N) """ if isinstance(A, UTPM): return UTPM.qr_full(A) elif isinstance(A, Function): return Function.qr_full(A) elif isinstance(A, numpy.ndarray): return scipy.linalg.qr(A) else: raise NotImplementedError('don\'t know what to do with this instance')
# first order derivatives, one directional derivative # D - 1 is the degree of the Taylor polynomial # P directional derivatives at once # M number of rows of J1 # N number of cols of J1 # K number of rows of J2 (must be smaller than N) D, P, M, N, K, Nx = 2, 1, 100, 3, 1, 1 # METHOD 1: nullspace method cg1 = CGraph() J1 = Function(UTPM(numpy.random.rand(*(D, P, M, N)))) J2 = Function(UTPM(numpy.random.rand(*(D, P, K, N)))) Q, R = Function.qr_full(J2.T) Q2 = Q[:, K:].T J1_tilde = dot(J1, Q2.T) Q, R = qr(J1_tilde) V = solve(R.T, Q2) C = dot(V.T, V) cg1.trace_off() cg1.independentFunctionList = [J1, J2] cg1.dependentFunctionList = [C] print('covariance matrix: C =\n', C) print('check that Q2.T spans the nullspace of J2:\n', dot(J2, Q2.T)) # METHOD 2: image space method (potentially numerically unstable)
# D - 1 is the degree of the Taylor polynomial # P directional derivatives at once # M number of rows of J1 # N number of cols of J1 # K number of rows of J2 (must be smaller than N) D,P,M,N,K,Nx = 2,1,100,3,1,1 # METHOD 1: nullspace method cg1 = CGraph() J1 = Function(UTPM(numpy.random.rand(*(D,P,M,N)))) J2 = Function(UTPM(numpy.random.rand(*(D,P,K,N)))) Q,R = Function.qr_full(J2.T) Q2 = Q[:,K:].T J1_tilde = dot(J1,Q2.T) Q,R = qr(J1_tilde) V = solve(R.T, Q2) C = dot(V.T,V) cg1.trace_off() cg1.independentFunctionList = [J1, J2] cg1.dependentFunctionList = [C] print('covariance matrix: C =\n',C) print('check that Q2.T spans the nullspace of J2:\n', dot(J2,Q2.T)) # METHOD 2: image space method (potentially numerically unstable)