인공지능수학 15주차

wi_label·2021년 12월 21일
1

Graduate school

목록 보기
17/17

문제 1)

다음의 4 x 4 행렬 AA에 대해 물음에 답하라.

(a) AA의 역행렬 A1A^{-1}을 구하는 코드를 작성하시오.

(b) Ax=[1111]A \mathbf{x} = \left[\begin{array}{r} 1 \\ -1 \\ 1 \\ -1 \end{array} \right]를 만족하는 벡터 x\mathbf{x}를 구하는 코드를 작성하시오.

# (a)  𝐴 의 역행렬  𝐴−1 을 구하는 코드를 작성하시오.
import numpy as np

arr = np.array(([1, -1, 1, 1], [-1, 2, 1, -1], [2, 0, 7, -1], [1, -2, -3, 2]))
print(arr)
arr_inv = np.linalg.inv(arr)

print(arr_inv)

#[[ 1 -1  1  1]
# [-1  2  1 -1]
# [ 2  0  7 -1]
# [ 1 -2 -3  2]]
#[[-2.   1.   1.   2. ]
# [-0.6  1.4  0.4  1.2]
# [ 0.8 -0.2 -0.2 -0.6]
# [ 1.6  0.6 -0.4 -0.2]]
# (b)  𝐴𝐱=⎡⎣⎢⎢⎢⎢1−11−1⎤⎦⎥⎥⎥⎥ 를 만족하는 벡터  𝐱 를 구하는 코드를 작성하시오.
b = np.array([1, -1, 1, -1])
x = arr_inv @ b

print(x)

#[-4.  -2.8  1.4  0.8]

문제 2)

다음의 5×55 \times 5 행렬 AA에 대해 물음에 답하라.

(a) 행렬 AALDULDU-분해를 구하라.

(b) LDULDU-분해 결과를 이용하여 Axi=biA\mathbf{x}_{i} = \mathbf{b}_{i}의 해 xi\mathbf{x}_{i}를 각각 구하라 (단, i=1,2,3i=1, 2, 3).

# (a) 행렬  𝐴 의  𝐿𝐷𝑈 -분해를 구하라.
import scipy.linalg as la

A = np.array(([1, 2, -3, 2, -1], [2, 6, -2, 0, 0], [0, 0, -1, -2, 1], [1, 0, -8, 5, -1], [2, 4, -8, 3, 5]))
(P, L, U) = la.lu(A)
D = np.diag(np.diag(U))   
U /= np.diag(U)[:, None] 
P.dot(L.dot(D.dot(U)))

#array([[ 1.,  2., -3.,  2., -1.],
#       [ 2.,  6., -2.,  0.,  0.],
#       [ 0.,  0., -1., -2.,  1.],
#       [ 1.,  0., -8.,  5., -1.],
#       [ 2.,  4., -8.,  3.,  5.]])
#(b)  𝐿𝐷𝑈 -분해 결과를 이용하여  𝐴𝐱𝑖=𝐛𝑖 의 해  𝐱𝑖 를 각각 구하라 (단,  𝑖=1,2,3 ).
b1 = np.array([24, 66, -41, 8, 9])
b2 = np.array([7, 18, -17, 1, 6])
b3 = np.array([21, 46, -78, 10, 42])

lu, piv = la.lu_factor(A)
x1 = la.lu_solve((lu, piv), b1)
print(x1)
x2 = la.lu_solve((lu, piv), b2)
print(x2)
x3 = la.lu_solve((lu, piv), b3)
print(x3)

#[-1857.   572.  -174.    86.   -43.]
#[-463.   143.5  -41.5   24.5   -9.5]
#[-1712.    528.5  -149.5    99.5   -28.5]

문제 3)

다음의 선형시스템 Ax=bA\mathbf{x} = \mathbf{b}에 대해 물음에 답하라.

(a) 행렬 AA가 직교행렬(orthogonal matrix)인지 여부를 확인하는 numpy 코드를 작성하라.

(b) 행렬 AA가 직교행렬(orthogonal matrix)임을 이용해 주어진 선형시스템의 해 x\mathbf{x}를 구하는 numpy 코드를 작성하라.

# (a) 행렬  𝐴 가 직교행렬(orthogonal matrix)인지 여부를 확인하는 numpy 코드를 작성하라.
bb = np.dot(A, x)
print(bb)

if np.allclose(b, bb):
  print("Ok")
else:
  print("something wrong")

#[-33.  -5.  19.  -5.  -9.   7.  11.   9.   5.  11. -23.  13.]
#Ok
# (a) 행렬  𝐴 가 직교행렬(orthogonal matrix)인지 여부를 확인하는 numpy 코드를 작성하라.
import numpy.linalg
A = np.array(([1,1,1,1,1,1,1,1,1,1,1,1], [-1, 1, 1, -1, 1, 1, 1, -1, -1, -1, 1, -1], [-1, -1, 1, 1, -1, 1, 1, 1, -1, -1, -1, 1], [-1, 1, -1, 1, 1, -1, 1, 1, 1, -1, -1, -1]
             , [-1, -1, 1, -1, 1, 1, -1, 1, 1, 1, -1, -1], [-1, -1, -1, 1, -1, 1, 1, -1, 1, 1, 1, -1], [-1, -1, -1, -1, 1, -1, 1, 1, -1,1,1,1], [-1,1,-1,-1,-1,1,-1,1,1,-1,1,1]
             , [1,1,1,-1,-1,-1,1,-1,1,1,-1,1],[-1,1,1,1,-1,-1,-1,1,-1,1,1,-1], [-1,-1,1,1,1,-1,-1,-1,1,-1,1,1], [-1,1,-1,1,1,1,-1,-1,-1,1,-1,1]))
b = np.array(([-33, -5, 19, -5, -9, 7,11,9,5,11,-23,13]))
x = np.linalg.lstsq(A, b, rcond=None)[0]
print("x:", x)
print(np.shape(x))

#x: [-6.6         0.26666667 -4.73333333 -2.93333333 -9.6        -0.93333333
#  0.93333333 -0.6        -7.06666667  1.93333333 -4.93333333  1.26666667]
#(12,)

문제 4)

네 개의 점 (3,3)(-3,3), (2,3)(-2,3), (1,2)(-1,2), (0,0)(0,0)이 있을 때, 이들을 근사(approximation)하는 직선의 방정식 y=mx+cy = mx + c을 최소제곱법(least squares method)으로 구하는 코드를 작성하시오.

A = np.array(([-3,3], [-2,3], [-1,2], [0,0]))
b = np.array((1,2,3,4))

x_opt = np.linalg.lstsq(A, b, rcond=None)[0]
print(x_opt)

#[1.84210526 2.10526316]
profile
옥은 부서질 지언정 흰 빛을 잃지 않고, 대나무는 불에 탈 지언정 그 곧음을 잃으려 하지 않는다.

0개의 댓글