Summary

본 내용은 MIT 선형대수학 강의 27번의 일부 내용 정리입니다. 자세한 내용은 해당 강의를 참조하세요.

아래 내용은 해당 강의에서 나오는 행렬 샘플을 그대로 사용해서, R 을 이용한 미분 관련 함수를 알아보고, 2x2 행렬의 Positive definite matrix 인지를 체크해본다.

R에서 함수에 대한 미분을 구할 경우 expression, D 함수를 사용한다. 먼저 expression 을 이용해서 함수를 정의하고, D 함수를 사용해서 미분한다. D 함수의 인자로 미분 대상인 변수명이 들어간다.

f <- expression(x^2 + 6*x*y + 10*y^2)

# x에 대한 1차, 2차 미분값을 구한다.
f_x <- D(f, "x")     # x에 대한 1차 미분, 2 * x + 6 * y
f_xx <- D(f_x, "x")  # x에 대한 2차 미분, 2

# y에 대한 1차, 2차 미분값을 구한다.
f_y <- D(f, "y")     # 6 * x + 10 * (2 * y)
f_yy <- D(f_y, "y")  # 10 * 2
f_yy <- eval(f_yy)

# xy, yx 에 대한 cross-derivatives를 구한다.
f_xy <- D(f_x, "y")
f_yx <- D(f_y, "x")

위에서 구한 2차 미분값으로 행렬을 구성한다.

A <- matrix(c(f_xx, f_xy, f_yx, f_yy), nrow = 2, byrow = T)
A
##      [,1] [,2]
## [1,]    2    6
## [2,]    6   20

행렬에 대한 고유값, 피봇, 행렬식, xT Ax 를 구한다.

# 고유값, 모두 양수이다.
ev <- eigen(A)
ev$values
## [1] 21.8166538  0.1833462
ev$values[1] + ev$values[2] # trace(A)와 같다.
## [1] 22
ev$values[1] * ev$values[2] # det(A)와 같다.
## [1] 4
# 행렬식
det_A <- det(A)
det_A
## [1] 4
# 고유값의 곱은 행렬식과 같다. 고유값의 합은 trace(A) 와 같다.
trace_A <- sum(diag(A))
trace_A
## [1] 22
# 피봇 check 1
# 첫번째 피봇은 행렬의 (1, 1) 성분
# 두번째 피봇은 소거후 행렬의 (2, 2) 성분
a <- A[1,1]   # a > 0
b <- A[1, 2]
c <- A[2, 2]

a > 0                  # 첫번째 피봇이 양수인지?
## [1] TRUE
(a*c - b^2) / a > 0    # 두번째 피봇이 양수인지?
## [1] TRUE

패키지를 통한 positive definite matrix 확인

require(Matrix)
require(matrixcalc)

# 함수를 이용한 positive definite matrix 확인
is.positive.definite(A)
## [1] TRUE
# 피봇 check 2
A_lu <- lu.decomposition(A)
A_l <- A_lu$L         # (2,1) 성분이 배수 multiplier 가 된다.
A_u <- A_lu$U         # 대각성분이 피봇이 된다.

# 피봇 출력
diag(A_u)
## [1] 2 2

그래프를 이용해서 함수의 모양을 확인한다.

library('plot3D')

f_z <- function(x, y) { x^2 + 6*x*y + 10*y^2 }

x <- seq(-20,20,length=30)
y <- x
grid = mesh(x,y)     # construct grid, grid$x and grid$y are matrix
z <- f_z(grid$x, grid$y)

# color surface plot
persp3D(x,y,z,border='black',facets=TRUE,colkey=FALSE,bty="b2",ticktype='detailed')