def test_Givens_rotation_definition(): 'verify if Givens rotation satisfies its definition' np.random.rand(3) # general a and b a = 10*np.random.rand() b = 10*np.random.rand() c, s = qra.Givens_rotation(a=a, b=b) G = np.array([[ c, s], [-s, c]]) v = np.array([a, b]) Gv = np.dot(G.T, v) aae(Gv[1], 0, decimal=10) # b = 0 a = 10*np.random.rand() b = 0 c, s = qra.Givens_rotation(a=a, b=b) G = np.array([[ c, s], [-s, c]]) v = np.array([a, b]) Gv = np.dot(G.T, v) aae(Gv[1], 0, decimal=10) # |b| > |a| a = 7*np.random.rand() b = 10*np.random.rand() c, s = qra.Givens_rotation(a=a, b=b) G = np.array([[ c, s], [-s, c]]) v = np.array([a, b]) Gv = np.dot(G.T, v) aae(Gv[1], 0, decimal=10)
def test_Givens_matvec_matmat(): 'verify matrix-matrix product with Givens rotations' np.random.seed(3) M = 5 N = 7 A = np.round(np.random.rand(M,N), decimals=3) i = 2 k = 3 c, s = qra.Givens_rotation(a=A[i,3], b=A[k,3]) # verify product GTA G = np.identity(M) G[i,i] = c G[i,k] = s G[k,i] = -s G[k,k] = c A2 = A.copy() qra.Givens_matvec(A=A2, c=c, s=s, i=i, k=k, order='GTA') aae(A2, np.dot(G.T,A), decimal=10) # verify AG G = np.identity(N) G[i,i] = c G[i,k] = s G[k,i] = -s G[k,k] = c A2 = A.copy() qra.Givens_matvec(A=A2, c=c, s=s, i=i, k=k, order='AG') aae(A2, np.dot(A,G), decimal=10)
def test_Givens_cs2rho_Givens_rho2cs(): 'verify consistency' np.random.seed(11) a = 10*np.random.rand() b = 10*np.random.rand() c, s = qra.Givens_rotation(a=a, b=b) rho = qra.Givens_cs2rho(c=c, s=s) c2, s2 = qra.Givens_rho2cs(rho=rho) aae(c, c2, decimal=10) aae(s, s2, decimal=10)