这一周的作业,刚压线写完。Problem3 没有写,不想证明了。从Problem 9 开始一直到最后难度都挺大的,我是在论坛上看过了别人的讨论才写出来的,挣扎了很久。
Problem 9在给定的基上分解向量,里面调用了hw4的一些函数,通过solve函数获得矩阵方程的解
Problem 10判断矩阵是不是可逆的,注意判断矩阵是不是square的
Problem 11和Problem 12 都是求逆,也是解方程,只是函数的参数需要参考一下源码
发现一个有趣的事情,Coding the Matrix的论坛上有个老头胡子都白了也在学这个课程,好励志的感觉,不过人家貌似是教授来着。
# version code 941 # Please fill out this stencil and submit using the provided submission script. from vecutil import list2vec from solver import solve from matutil import * from mat import Mat from GF2 import one from vec import Vec from independence import * from triangular import * from hw4 import * ## Problem 1 w0 = list2vec([1,0,0]) w1 = list2vec([0,1,0]) w2 = list2vec([0,0,1]) v0 = list2vec([1,2,3]) v1 = list2vec([1,3,3]) v2 = list2vec([0,3,3]) # Fill in exchange_S1 and exchange_S2 # with appropriate lists of 3 vectors exchange_S0 = [w0,w1,w2] exchange_S1 = [v0,w1,w2] exchange_S2 = [v0,v1,w2] exchange_S3 = [v0,v1,v2] ## Problem 2 w0 = list2vec([0,one,0]) w1 = list2vec([0,0,one]) w2 = list2vec([one,one,one]) v0 = list2vec([one,0,one]) v1 = list2vec([one,0,0]) v2 = list2vec([one,one,0]) exchange_2_S0 = [w0, w1, w2] exchange_2_S1 = [w0,w1,v1] exchange_2_S2 = [w0,v0,v1] exchange_2_S3 = [v0, v1, v2] ## Problem 3 def morph(S, B): ''' Input: - S: a list of distinct Vec instances - B: a list of linearly independent Vec instances - Span S == Span B Output: a list of pairs of vectors to inject and eject Example: >>> #This is how our morph works. Yours may yield different results. >>> S = [list2vec(v) for v in [[1,0,0],[0,1,0],[0,0,1]]] >>> B = [list2vec(v) for v in [[1,1,0],[0,1,1],[1,0,1]]] >>> morph(S, B) [(Vec({0, 1, 2},{0: 1, 1: 1, 2: 0}), Vec({0, 1, 2},{0: 1, 1: 0, 2: 0})), (Vec({0, 1, 2},{0: 0, 1: 1, 2: 1}), Vec({0, 1, 2},{0: 0, 1: 1, 2: 0})), (Vec({0, 1, 2},{0: 1, 1: 0, 2: 1}), Vec({0, 1, 2},{0: 0, 1: 0, 2: 1}))] ''' pass ## Problem 4 # Please express each solution as a list of vectors (Vec instances) row_space_1 = [list2vec([1,2,0]),list2vec([0,2,1])] col_space_1 = [list2vec([1,0]),list2vec([0,1])] row_space_2 = [list2vec([1,4,0,0]),list2vec([0,2,2,0]),list2vec([0,0,1,1])] col_space_2 = [list2vec([1,0,0]),list2vec([4,2,0]),list2vec([0,0,1])] row_space_3 = [list2vec([1])] col_space_3 = [list2vec([1,2,3])] row_space_4 = [list2vec([1,0]),list2vec([2,1])] col_space_4 = [list2vec([1,2,3]),list2vec([0,1,4])] ## Problem 5 def my_is_independent(L): ''' input: A list, L, of Vecs output: A boolean indicating if the list is linearly independent >>> L = [Vec({0, 1, 2},{0: 1, 1: 0, 2: 0}), Vec({0, 1, 2},{0: 0, 1: 1, 2: 0}), Vec({0, 1, 2},{0: 0, 1: 0, 2: 1}), Vec({0, 1, 2},{0: 1, 1: 1, 2: 1}), Vec({0, 1, 2},{0: 1, 1: 1, 2: 0}), Vec({0, 1, 2},{0: 0, 1: 1, 2: 1})] >>> my_is_independent(L) False >>> my_is_independent(L[:2]) True >>> my_is_independent(L[:3]) True >>> my_is_independent(L[1:4]) True >>> my_is_independent(L[0:4]) False >>> my_is_independent(L[2:]) False >>> my_is_independent(L[2:5]) False ''' if rank(L)==len(L):return True else:return False ## Problem 6 def subset_basis(T): ''' input: A list, T, of Vecs output: A list, S, containing Vecs from T, that is a basis for the space spanned by T. >>> a0 = Vec({'a','b','c','d'}, {'a':1}) >>> a1 = Vec({'a','b','c','d'}, {'b':1}) >>> a2 = Vec({'a','b','c','d'}, {'c':1}) >>> a3 = Vec({'a','b','c','d'}, {'a':1,'c':3}) >>> subset_basis([a0,a1,a2,a3]) == [Vec({'c', 'b', 'a', 'd'},{'a': 1}), Vec({'c', 'b', 'a', 'd'},{'b': 1}), Vec({'c', 'b', 'a', 'd'},{'c': 1})] True ''' r=[] for x in T: r.append(x) #print(x) if my_is_independent(r)==False:r.remove(x) #print(r) return r ## Problem 7 def my_rank(L): ''' input: A list, L, of Vecs output: The rank of the list of Vecs >>> my_rank([list2vec(v) for v in [[1,2,3],[4,5,6],[1.1,1.1,1.1]]]) 2 ''' return len(subset_basis(L)) ## Problem 8 # Please give each answer as a boolean only_share_the_zero_vector_1 = True only_share_the_zero_vector_2 = True only_share_the_zero_vector_3 = True ## Problem 9 def direct_sum_decompose(U_basis, V_basis, w): ''' input: A list of Vecs, U_basis, containing a basis for a vector space, U. A list of Vecs, V_basis, containing a basis for a vector space, V. A Vec, w, that belongs to the direct sum of these spaces. output: A pair, (u, v), such that u+v=w and u is an element of U and v is an element of V. >>> U_basis = [Vec({0, 1, 2, 3, 4, 5},{0: 2, 1: 1, 2: 0, 3: 0, 4: 6, 5: 0}), Vec({0, 1, 2, 3, 4, 5},{0: 11, 1: 5, 2: 0, 3: 0, 4: 1, 5: 0}), Vec({0, 1, 2, 3, 4, 5},{0: 3, 1: 1.5, 2: 0, 3: 0, 4: 7.5, 5: 0})] >>> V_basis = [Vec({0, 1, 2, 3, 4, 5},{0: 0, 1: 0, 2: 7, 3: 0, 4: 0, 5: 1}), Vec({0, 1, 2, 3, 4, 5},{0: 0, 1: 0, 2: 15, 3: 0, 4: 0, 5: 2})] >>> w = Vec({0, 1, 2, 3, 4, 5},{0: 2, 1: 5, 2: 0, 3: 0, 4: 1, 5: 0}) >>> direct_sum_decompose(U_basis, V_basis, w) == (Vec({0, 1, 2, 3, 4, 5},{0: 2.0, 1: 4.999999999999972, 2: 0.0, 3: 0.0, 4: 1.0, 5: 0.0}), Vec({0, 1, 2, 3, 4, 5},{0: 0.0, 1: 0.0, 2: 0.0, 3: 0.0, 4: 0.0, 5: 0.0})) True ''' T=U_basis + V_basis x=vec2rep(T,w) #print(T,w,x) rep=list(x.f.values()) u1=list2vec(rep[0:len(U_basis)]) v1=list2vec(rep[len(U_basis):len(T)]) u=rep2vec(u1,U_basis) v=rep2vec(v1,V_basis) return (u,v) ## Problem 10 def is_invertible(M): ''' input: A matrix, M outpit: A boolean indicating if M is invertible. >>> M = Mat(({0, 1, 2, 3}, {0, 1, 2, 3}), {(0, 1): 0, (1, 2): 1, (3, 2): 0, (0, 0): 1, (3, 3): 4, (3, 0): 0, (3, 1): 0, (1, 1): 2, (2, 1): 0, (0, 2): 1, (2, 0): 0, (1, 3): 0, (2, 3): 1, (2, 2): 3, (1, 0): 0, (0, 3): 0}) >>> is_invertible(M) True ''' L=mat2coldict(M) L=list(L.values()) if len(L)!=len(L[0].D):return False else:return rank(L)==len(L) ## Problem 11 def find_matrix_inverse(A): ''' input: An invertible matrix, A, over GF(2) output: Inverse of A >>> M = Mat(({0, 1, 2}, {0, 1, 2}), {(0, 1): one, (1, 2): 0, (0, 0): 0, (2, 0): 0, (1, 0): one, (2, 2): one, (0, 2): 0, (2, 1): 0, (1, 1): 0}) >>> find_matrix_inverse(M) == Mat(({0, 1, 2}, {0, 1, 2}), {(0, 1): one, (2, 0): 0, (0, 0): 0, (2, 2): one, (1, 0): one, (1, 2): 0, (1, 1): 0, (2, 1): 0, (0, 2): 0}) True ''' B=[] for i in range(len(A.D[0])): b=Vec(A.D[0],{}) b[i]=one t=solve(A,b) B.append(t) B=coldict2mat(B) return B ## Problem 12 def find_triangular_matrix_inverse(A): ''' input: An upper triangular Mat, A, with nonzero diagonal elements output: Inverse of A >>> A = listlist2mat([[1, .5, .2, 4],[0, 1, .3, .9],[0,0,1,.1],[0,0,0,1]]) >>> find_triangular_matrix_inverse(A) == Mat(({0, 1, 2, 3}, {0, 1, 2, 3}), {(0, 1): -0.5, (1, 2): -0.3, (3, 2): 0.0, (0, 0): 1.0, (3, 3): 1.0, (3, 0): 0.0, (3, 1): 0.0, (2, 1): 0.0, (0, 2): -0.05000000000000002, (2, 0): 0.0, (1, 3): -0.87, (2, 3): -0.1, (2, 2): 1.0, (1, 0): 0.0, (0, 3): -3.545, (1, 1): 1.0}) True ''' B=[] C=mat2rowdict(A) for i in range(len(A.D[0])): b=Vec(A.D[0],{}) b[i]=1 t=triangular_solve(C,range(len(C)),b) B.append(t) B=coldict2mat(B) return B