파이썬 numpy 패키지를 이용해 주어진 행렬에 대한 QR 분해를 구하는 코드를 작성합니다.
참고자료: 링크
다음의 3x3 행렬 를 정의하는 numpy 코드를 작성하시오.
import numpy as np
import numpy.linalg
# 행렬 코딩
A = np.array(([3,1,1,1], [1,-2,1,1], [1,-1,1,1], [1,-1,1,1]))
print(A)
print(np.shape(A))
앞서 정의한 행렬 에 대해 LU 분해, 를 수행하는 numpy 코드를 작성하시오.
# QR 분해
Q, R = np.linalg.qr(A)
print("Q:", Q)
print("R:", R)
## QR 분해 결과 체크: 연산결과가 A와 동일한지 체크
AA = np.dot(Q, R)
print("AA:", AA)
다음의 3-벡터 를 정의하는 numpy 코드를 작성하시오.
# 벡터 코딩
b = np.array((4,1,2))
print(b)
print(np.shape(b))
행렬 에 대한 QR 분해를 이용해 를 계산하는 numpy 코드를 작성하시오.
를 문제로 본 후, 다음을 해결한다.
는 정규직교행렬(orthonormal matrix)이므로 의 역행렬은 전치행렬인 와 같습니다.
이러한 성질을 이용해 를 구하는 numpy 코드를 작성하세요.
# Qy = b 풀기
y = np.linalg.lstsq(Q, b, rcond=None)[0]
print("y:", y)
print(np.shape(y))
은 역행렬이 존재하는 상삼각행렬(upper triangular matrix)입니다.
이러한 성질을 이용해 를 구하는 numpy 코드를 작성하세요.
# Rx = y 풀기
x = np.linalg.lstsq(R, y, rcond=None)[0]
print("x:", x)
print(np.shape(x))
앞서 QR 분해를 이용해 구한 가 선형시스템 의 해(solution)로서 알맞게 구한 것인지 검증하는 코드를 작성하시오.
## 결과 검증
bb = np.dot(A, x)
print(bb)
if np.allclose(b, bb):
print("Ok")
else:
print("something wrong")