2020년 12월 7일 월요일

선형대수코드_CH 7

1

행렬 A의 QR분해를 실행하세요?

A=np.array([[-3, -19, 3],[9, -7, 11], [-3, 9, 11], [0, 4, 32]])
print(A)
[[ -3 -19 3]
   [ 9 -7 11]
   [ -3 9 11]
   [ 0 4 32]]


Q,R=la.qr(A)
print(np.around(Q, 3))
[[-0.302 -0.898 -0.265]
   [ 0.905 -0.18 -0.193]
   [-0.302 0.359 -0.313]
   [ 0. 0.18 -0.891]]


print(np.around(R, 3))
[[ 9.95 -3.317 5.729]
   [ 0. 22.271 5.029]
   [ 0. 0. -34.884]]


print(np.dot(Q, R))
[[ -3. -19. 3.]
   [ 9. -7. 11.]
    [ -3. 9. 11.]
   [ 0. 4. 32.]]

2

다음 각 이차식에 대응하는 대칭행렬을 나타내십시요.

a. ℝ2의 이차식, $3x_1^2-4x_1x_2+5x_2^2$
$\left[\begin{matrix}3&-2\\-2&5\end{matrix}\right]$

b.ℝ2의 이차식, $3x_1^2+2x_1x_2$
$\left[\begin{matrix}3&1\\1&0\end{matrix}\right]$

c.ℝ3의 이차식, $3x_1^2+2x_1x_2$
$\left[\begin{matrix}3&1&0\\1&0&0\\0&0&0\end{matrix}\right]$

3

$7x_1^2+8x_1x_2+4x_1x_3+10x_2^2+5x_2x_3+8x_3^2$에 대응하는 대칭행렬을 나타내십시요. 이 식은 양의 정부호 입니까?

A=np.array([[7, 4, 2],[4, 10, 2.5],[2, 2.5, 8]])
print(A)
[[ 7. 4. 2. ]
   [ 4. 10. 2.5]
   [ 2. 2.5 8. ]]


la.eig(A)
(array([14.37376873, 4.20939986, 6.41683141]),
   array([[ 0.51711708, 0.83649609, -0.1812849 ],
      [ 0.72914595, -0.54145794, -0.41853253],
      [ 0.44825897, -0.08424717, 0.88992489]]))

위 식에 대응하는 대칭행렬의 고유값은 모두 양수입니다. 그러므로 위 식은 양의 정부호 입니다.

4

다음은 xTAx가 yTDy의 변환입니다. D를 발견하고 성립함을 보이세요.
$5 x_{1}^{2} + 4 x_{1} x_{2} + 6 x_{2}^{2} - 4 x_{2} x_{3} + 7 x_{3}^{2}=3.0 y_{1}^{2} + 6.0 y_{2}^{2} + 9.0 y_{3}^{2}$

x1,x2,x3=symbols("x1 x2 x3")
x=Matrix(3,1, [x1,x2,x3])
x
$\left[\begin{matrix}x_{1}\\x_{2}\\x_{3}\end{matrix}\right]$
A=Matrix([[5,2,0],[2,6,-2],[0,-2,7]])

A
$\left[\begin{matrix}5 & 2 & 0\\2 & 6 & -2\\0 & -2 & 7\end{matrix}\right]$
simplify(x.T*A*x)

$\left[\begin{matrix}5 x_{1}^{2} + 4 x_{1} x_{2} + 6 x_{2}^{2} - 4 x_{2} x_{3} + 7 x_{3}^{2}\end{matrix}\right]$

d, p=la.eig(np.array(A, dtype=np.float64))
d
array([3., 6., 9.])
D=np.diag(d)
print(D)
[[3. 0. 0.]
   [0. 6. 0.]
   [0. 0. 9.]]


y1,y2,y3=symbols("y1 y2 y3")
y=Matrix(3,1,[y1,y2,y3])
y.T*Matrix(D)*y
$\left[\begin{matrix}3.0 y_{1}^{2} + 6.0 y_{2}^{2} + 9.0 y_{3}^{2}\end{matrix}\right]$

5

Q(x)에 대해 (a)xTx=1의 제한 조건에서 최대값을 계산하고 이 값들이 각각 Q(x)의 이차식 행렬 A의 최대 고유값과 같다는 것을 보이세요. (b)xTx=1와 xTu1=0의 제한 조건에서 최대값(u1은 최대 고유값에 대응하는 고유단위벡터)을 계산하세요.
$Q(x)=3 x_{1}^{2} + 2 x_{1} x_{2} + 2 x_{2}^{2} + 4 x_{2} x_{3} + 2 x_{3}^{2}$

x1,x2,x3=symbols("x1 x2 x3")
x=Matrix(3,1, [x1,x2,x3])
x
$\left[\begin{matrix}x_{1}\\x_{2}\\x_{3}\end{matrix}\right]$

A=Matrix([[3,1,0],[1,2,2],[0,2,2]])
A
$\left[\begin{matrix}3 & 1 & 0\\1 & 2 & 2\\0 & 2 & 2\end{matrix}\right]$

xTAx=x.T*A*x
expand(xTAx[0])
$3 x_{1}^{2} + 2 x_{1} x_{2} + 2 x_{2}^{2} + 4 x_{2} x_{3} + 2 x_{3}^{2}$

d, p=la.eig(np.array(A, dtype=np.float64))
d
array([-0.16424794, 2.77286556, 4.39138238])

print(p)
[[ 0.2260912 0.84604119 0.48280128]
   [-0.7154086 -0.19216509 0.6717612 ]
   [ 0.6611152 -0.49727948 0.56181831]]


u1=p[:,2]
la.norm(u1)
1.0

np.dot(np.dot(u1.T,np.array(A, dtype=np.float64)),u1)
4.391382380630901

u2=p[:,1]
u2
array([ 0.84604119, -0.19216509, -0.49727948])

np.dot(np.dot(u2.T,np.array(A, dtype=np.float64)),u2)
2.77286555782931

6

다음 행렬 A 의 특이값?
$A=\left[\begin{matrix}2&3\\0&2\end{matrix}\right]$

A=np.array([[2,3],[0,2]])
print(A)
[[2 3]    [0 2]]

AA=np.dot(A.T, A)
print(AA)
[[ 4 6]    [ 6 13]]

d, P=la.eig(AA)
print(d)
[ 1. 16.]

a=np.sqrt(d)
a
array([1., 4.])

특이값은 1, 4

7

다음 행렬 A의 특이값 분해에서 좌특이행렬, 특이값, Σ행렬, 우특이행렬을 계산하세요?
$A=\left[\begin{matrix}3 & -3\\0 & 0\\1 & 1\end{matrix}\right]$

A=np.array([[3, -3],[0,0],[1,1]])
AA=np.dot(A.T,A)
print(AA)
[[10, -8],
[-8, 10]]


d, V=la.eig(AA)
d
array([18., 2.])

특이값, 특이행렬, 우려특이행렬

s=np.sqrt(d)
s
array([4.24264069, 1.41421356])
print(V)
[[ 0.70710678 0.70710678]
   [-0.70710678 0.70710678]]


sMat=np.vstack([np.diag(s), np.array([0,0])])
print(sMat)
[[4.24264069 0. ]
   [0. 1.41421356]
   [0. 0. ]]

좌특이행렬

AV=np.dot(A, V)
print(AV)
[[ 4.24264069e+00 -8.88178420e-16]
   [ 0.00000000e+00 0.00000000e+00]
   [ 2.22044605e-16 1.41421356e+00]]


U1=AV/s
print(np.around(U1, 3))
[[ 1. -0.]    [ 0. 0.]    [ 0. 1.]]

U1은 3×3차원이 되어야 합니다. 그러나 위의 V로 부터의 산출한 U는 3×2차원이므로 각 열벡터와의 선형 결합 즉, U1Tx=0가 선형독립이고 정규직교기저인 벡터를 첨가하여 U를 생성합니다.
$\left[\begin{matrix}1&0&0\\0&0&0\\0&0&1\end{matrix}\right]\left[\begin{matrix}x_{1}\\x_{2}\\x_{3}\end{matrix}\right]=\left[\begin{matrix}0\\0\\0\end{matrix}\right]$
위 식의 해집합의 기저를 발견하기 위해 sympy의 nullspace()함수를 사용합니다.

u2=Matrix(U1.T).nullspace()
u2=np.array(u2, dtype=np.float64).reshape(3,1)
print(u2)
[[0.]
   [1.]
   [0.]]

결과를 U1에 첨가하면 3×3차원의 U가 생성됩니다.

U=np.hstack([U1, u2])
print(np.around(U, 3))
[[ 1. -0. 0.] [ 0. 0. 1.] [ 0. 1. 0.]]

확인

print(np.around(np.dot(np.dot(U,sMat),V.T),3))
[[ 3. 3.]
   [ 0. 0.]
   [-1. 1.]]

numpy.linalg.syd()함수를 사용하여 각 요소들을 계산

U,s,V=la.svd(A)
print(np.around(U, 3))
[[-1. -0. 0.]
   [ 0. 0. -1.]
   [ 0. -1. 0.]]

print(s)
[4.24264069 1.41421356]
print(V)
[[-0.70710678 0.70710678]
   [-0.70710678 -0.70710678]]

댓글 없음:

댓글 쓰기

CalculusMadeEasy_CH1

1-6 a=np.array([[1],[2],[3]]) la.norm(a) 3.7416573867739413 b=np.array([[-1],[-3],[-4]]) la.norm(b) 5.0990195135927845 c=np.array([[...