인공지능수학 6주차

wi_label·2021년 12월 21일
1

Graduate school

목록 보기
7/17

과제 목표

파이썬 numpy 패키지를 이용해 주어진 행렬에 대한 QR 분해를 구하는 코드를 작성합니다.

참고자료: 링크

행렬 AA 정의

다음의 3x3 행렬 AA를 정의하는 numpy 코드를 작성하시오.

A=[311121111]A = \left[ \begin{array}{rrr} 3 & 1 & 1 \\ 1 & -2 & -1 \\ 1 & 1 & 1 \end{array} \right]
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))

행렬 AA의 QR 분해 계산

앞서 정의한 행렬 AA에 대해 LU 분해, A=QRA = QR를 수행하는 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-벡터 b\mathbf{b}를 정의하는 numpy 코드를 작성하시오.

b=[412]\mathbf{b} = \left[ \begin{array}{rrr} 4 \\ 1 \\ 2 \end{array} \right]
# 벡터 코딩
b = np.array((4,1,2))

print(b)
print(np.shape(b))

QR-분해를 이용해 선형시스템 Ax=bA \mathbf{x} = \mathbf{b} 풀기

행렬 AA에 대한 QR 분해를 이용해 Ax=bA\mathbf{x} = \mathbf{b}를 계산하는 numpy 코드를 작성하시오.

Ax=bA \mathbf{x} = \mathbf{b}QRx=bQR \mathbf{x} = \mathbf{b} 문제로 본 후, 다음을 해결한다.

  • Rx=yR \mathbf{x} = \mathbf{y}로 설정하고, Qy=bQ \mathbf{y} = \mathbf{b} 문제를 풀어 y\mathbf{y}를 얻는다.
  • Rx=yR \mathbf{x} = \mathbf{y} 문제를 풀어 x\mathbf{x}를 얻는다.

선형시스템 Qy=bQ\mathbf{y} = \mathbf{b} 풀기

QQ는 정규직교행렬(orthonormal matrix)이므로 QQ의 역행렬은 전치행렬인 QTQ^{T}와 같습니다.

이러한 성질을 이용해 y\mathbf{y}를 구하는 numpy 코드를 작성하세요.

# Qy = b 풀기

y = np.linalg.lstsq(Q, b, rcond=None)[0]
print("y:", y)
print(np.shape(y))

선형시스템 Rx=yR \mathbf{x} = \mathbf{y} 풀기

RR은 역행렬이 존재하는 상삼각행렬(upper triangular matrix)입니다.

이러한 성질을 이용해 x\mathbf{x}를 구하는 numpy 코드를 작성하세요.

# Rx = y 풀기

x = np.linalg.lstsq(R, y, rcond=None)[0]

print("x:", x)
print(np.shape(x))

선형시스템의 해 확인

앞서 QR 분해를 이용해 구한 x\mathbf{x}가 선형시스템 Ax=bA\mathbf{x} = \mathbf{b}의 해(solution)로서 알맞게 구한 것인지 검증하는 코드를 작성하시오.

## 결과 검증

bb = np.dot(A, x)
print(bb)

if np.allclose(b, bb):
  print("Ok")
else:
  print("something wrong")
profile
옥은 부서질 지언정 흰 빛을 잃지 않고, 대나무는 불에 탈 지언정 그 곧음을 잃으려 하지 않는다.

0개의 댓글