5주차 강의

19 days 전, mindo 작성

# Gram-Schumidt 정규직규화 과정 x1 = vector([1,1,0]) x2 = vector([0,1,2]) x3 = vector([1,2,1]) A = matrix([x1, x2, x3]) # x1, x2, x3를 행벡터로 하는 행렬 생성 print 'A=' print A [G, mu] = A.gram_schmidt() # 직교화 과정 : 행에 대해 직교기저를 찾는다. A == mu*G print 'G=' print G N = matrix([G.row(i) / G.row(i).norm() for i in range(0, 3)]) # 정규화과정: 정규화한 직교기저를 행으로 하는 행렬 print 'N=' print N 
       
A=
[1 1 0]
[0 1 2]
[1 2 1]
G=
[   1    1    0]
[-1/2  1/2    2]
[-2/9  2/9 -1/9]
N=
[   1/2*sqrt(2)    1/2*sqrt(2)              0]
[-1/3*sqrt(1/2)  1/3*sqrt(1/2)  4/3*sqrt(1/2)]
[          -2/3            2/3           -1/3]
A=
[1 1 0]
[0 1 2]
[1 2 1]
G=
[   1    1    0]
[-1/2  1/2    2]
[-2/9  2/9 -1/9]
N=
[   1/2*sqrt(2)    1/2*sqrt(2)              0]
[-1/3*sqrt(1/2)  1/3*sqrt(1/2)  4/3*sqrt(1/2)]
[          -2/3            2/3           -1/3]
# 행벡터에 대해 GS정규화하는 gram_schmidt() 함수를 보완해 만듬 def gs_orth(A): m, n = A.nrows(), A.ncols() # 행렬 크기 r = A.rank() # 행렬의 rank if m < n: # 행렬 크기 확인 raise ValueError('The number of rows must be larger than the number of columns') elif r < n: # full column rank인지 확인 raise ValueError('The matrix is not full column rank') [G, mu] = A.transpose().gram_schmidt() Q1 = matrix([G.row(i) / G.row(i).norm() for i in range(0, n)]) # Q의 transpose R1 = Q1*A Q = simplify(Q1.transpose()) # 정규직교기저로 만들어진 행렬 R = simplify(R1) # 상삼각행렬 return Q, R 
       
A = matrix([[1,0,0],[1,1,0],[1,1,1]]) # 행렬 입력 Q, R = gs_orth(A) # QR 분해 print 'Q=' print Q print 'R=' print R print 'Q*R=A' print Q*R 
       
Q=
[         1/3*sqrt(3) -1/3*sqrt(3)*sqrt(2)                    0]
[         1/3*sqrt(3)  1/6*sqrt(3)*sqrt(2)         -1/2*sqrt(2)]
[         1/3*sqrt(3)  1/6*sqrt(3)*sqrt(2)          1/2*sqrt(2)]
R=
[            sqrt(3)         2/3*sqrt(3)         1/3*sqrt(3)]
[                  0 1/3*sqrt(3)*sqrt(2) 1/6*sqrt(3)*sqrt(2)]
[                  0                   0         1/2*sqrt(2)]
Q*R=A=
[1 0 0]
[1 1 0]
[1 1 1]
Q=
[         1/3*sqrt(3) -1/3*sqrt(3)*sqrt(2)                    0]
[         1/3*sqrt(3)  1/6*sqrt(3)*sqrt(2)         -1/2*sqrt(2)]
[         1/3*sqrt(3)  1/6*sqrt(3)*sqrt(2)          1/2*sqrt(2)]
R=
[            sqrt(3)         2/3*sqrt(3)         1/3*sqrt(3)]
[                  0 1/3*sqrt(3)*sqrt(2) 1/6*sqrt(3)*sqrt(2)]
[                  0                   0         1/2*sqrt(2)]
Q*R=A=
[1 0 0]
[1 1 0]
[1 1 1]
# 예제 7 최소제곱해 구하기 A = matrix([[1,3,5],[1,1,0],[1,1,2],[1,3,3]]) # 계수행렬 b = vector([1,3,-1,2]) # 상수항 벡터 Q, R = gs_orth(A) # QR 분해 print R.solve_right(Q.transpose()*b) # 최소제곱해 구하기 
       
(1/8, 17/8, -5/4)
(1/8, 17/8, -5/4)