과제 목표
파이썬 numpy 패키지를 이용해 1) 좌표계 변환과 2) 표준행렬을 이용해 선형변환을 수행하는 코드를 작성합니다.
import numpy as np
import numpy.linalg
1) 좌표계 변환
3-벡터 v가 표준좌표계에서 다음과 같이 표현된다고 한다.
v=⎣⎢⎡344⎦⎥⎤
다음의 두 벡터 v1과 v2를 기저벡터로 하는 새로운 좌표계를 도입했을 때, 3-벡터 v의 좌표값을 구하고자 한다.
v1=⎣⎢⎡131⎦⎥⎤,v=⎣⎢⎡1−22⎦⎥⎤
이를 해결하는 numpy 코드를 작성하시오.
문제 정의
이 문제는 다음 수식을 만족하는 x1, x2를 구하면 해결되는 문제이다.
x1⎣⎢⎡131⎦⎥⎤+x2⎣⎢⎡1−22⎦⎥⎤=3⎣⎢⎡100⎦⎥⎤+4⎣⎢⎡010⎦⎥⎤+4⎣⎢⎡001⎦⎥⎤=⎣⎢⎡344⎦⎥⎤
즉, 새로운 좌표계의 좌표값은 (x1,x2)가 된다.
이 문제를 선형시스템으로 표현하면 다음과 같다.
⎣⎢⎡∣v1∣∣v2∣⎦⎥⎤[x1x2]=⎣⎢⎡∣v∣⎦⎥⎤
벡터 및 행렬 정의
3-벡터 v와 v1, v2를 기저벡터로 하는 좌표계 3x2 행렬 A를 정의한다.
이 때, numpy.column_stack를 이용해 v1, v2가 순서대로 행렬 A의 열(column)이 되도록 구성한다.
v = np.array((3,4,4))
v1 = np.array((1,3,1))
v2 = np.array((1,-2,2))
A = np.column_stack((v1, v2))
print(A)
print(v)
선형시스템 정의 및 풀기
Ax=v
이 문제는 행렬 A가 3x2 크기로 정방행렬(square matrix)가 아닙니다. 이 경우는 최소제곱법을 이용한 최적화로 선형시스템의 해를 구할 수 있습니다. [참고자료: 링크]
(* 최소제곱법에 관한 이론은 추후 학습할 예정입니다.)
x = np.linalg.lstsq(A, v, rcond=None)[0]
print(x)
2) 표준행렬을 이용한 선형 변환
2차원 벡터를 입력으로 받아, 해당 벡터를 반시계방향으로 60∘ 만큼 회전하는 기능을 구현해 보자.
문제 정의
우리가 구하고자 하는 변환은 2차원 입력(x∈R2)을 받아 2차원 출력(xl∈R2)을 내는 선형변환(linear transformation)이다.
따라서, 해당 기능(function)은 2x2 행렬 A로 구현할 수 있다.
2x2 행렬 A의 첫번째 열(column)은 다음과 같이 구성할 수 있다.
- 2차원 공간의 첫번째 기저(basis)벡터인 (1,0)이 해당 기능에 의해 어디로 변환되는지를 계산해 v1으로 설정한다.
- 2차원 공간의 두번째 기저(basis)벡터인 (0,1)이 해당 기능에 의해 어디로 변화되는지를 계산해 v2으로 설정한다.
2x2 행렬 A을 다음과 같이 구성하는 numpy 코드를 작성한다.
A=⎣⎢⎡∣v1∣∣v2∣⎦⎥⎤
v1 = np.array((1, 0))
v2 = np.array((0, 1))
A = np.column_stack((v1, v2))
print(A)
선형변환 수행
아래의 2-벡터를 각각 입력으로 받아 선형변환을 수행하는 코드를 작성하시오.
x1=[10],x2=[3−2]
x1 = np.array((1, 0))
x2 = np.array((3, -2))
y1 = np.linalg.lstsq(A, x1, rcond=None)[0]
y2 = np.linalg.lstsq(A, x2, rcond=None)[0]
print(y1)
print(y2)