다음의 4 x 4 행렬 에 대해 물음에 답하라.
(a) 의 역행렬 을 구하는 코드를 작성하시오.
(b) 를 만족하는 벡터 를 구하는 코드를 작성하시오.
# (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]
다음의 행렬 에 대해 물음에 답하라.
(a) 행렬 의 -분해를 구하라.
(b) -분해 결과를 이용하여 의 해 를 각각 구하라 (단, ).
# (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]
다음의 선형시스템 에 대해 물음에 답하라.
(a) 행렬 가 직교행렬(orthogonal matrix)인지 여부를 확인하는 numpy 코드를 작성하라.
(b) 행렬 가 직교행렬(orthogonal matrix)임을 이용해 주어진 선형시스템의 해 를 구하는 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,)
네 개의 점 , , , 이 있을 때, 이들을 근사(approximation)하는 직선의 방정식 을 최소제곱법(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]