선형대수학

고유방정식 repeat(),uniroot.all(),뉴튼랩슨법으로 고유값 구하기

JSMATH 2025. 2. 18. 14:59

https://pastryofjsmath.tistory.com/81

 

LA14) 고유값,고유벡터(eigen value,eigen vector)-2

> A D2 gaussianElimination(A-D2,c(0,0,0)) [,1] [,2] [,3] [,4] [1,] 1 -1 1 0 [2,] 0 0 0 0 [3,] 0 0 0 0위 문제1번의 풀이입니다.https://pastryofjsmath.tistory.com/82 A eigen(A)$values[1] 3.828427 2.000000 -1.828427위 고유값과 실제로 같은

pastryofjsmath.tistory.com

위에 대한 내용의 문제풀이입니다.

 

f <- function(x) {-x^3 +4*x^2 +3*x -14}
plot(f,xlim = c(-5,5))
abline(h=0,v=0,col='black')
abline(v=-3,col='red')
> A <- matrix(c(0,0,7,
+               4,2,5,
+               1,0,2),byrow=T,ncol=3)
> eigen(A)$values
[1]  3.828427  2.000000 -1.828427

위 고유값과 실제로 같은지 구해보자.

> #초기값지정
> x <- -3
> repeat{
+   if(-x^3 +4*x^2 +3*x -14<0) break
+   x <- x + 0.00001
+ }
> x
[1] -1.82842
> repeat{
+   if(-x^3 +4*x^2 +3*x -14>0) break
+   x <- x + 0.00001
+ }
> x
[1] 2
> 
> repeat{
+   if(-x^3 +4*x^2 +3*x -14<0) break
+   x <- x + 0.00001
+ }
> x
[1] 3.82843
> #패키지이용
> library(rootSolve)
> f <- function(x) {-x^3 +4*x^2 +3*x -14}
> uniroot.all(f,interval = c(-5,5))
[1]  2.000000 -1.828428  3.828430
library(plotly)
library(magrittr)

# Newton-Raphson 
nt <- function(fun, x0 = -100, N = 100, tol = 1e-6) {
  h <- 1e-6
  iter_data <- data.frame(step = integer(), x = numeric(), y = numeric())
  i <- 1
  
  while (i <= N) {
    df.dx <- (fun(x0 + h) - fun(x0)) / h
    x1 <- x0 - fun(x0) / df.dx
    
    # 현재 x와 f(x) 저장
    iter_data <- rbind(iter_data, data.frame(step = i, x = x1, y = fun(x1)))
    
    if (abs(x0 - x1) < tol) break
    x0 <- x1
    i <- i + 1
  }
  
  return(iter_data)  # x 값을 저장한 데이터프레임 반환
}

# 함수 정의
fun <- function(x) -x^3 + 4*x^2 + 3*x - 14

# Newton-Raphson 결과
results <- nt(fun, x0 = -10, N = 1000, tol = 1e-20)

# 곡선이 그려질 범위
x_vals <- seq(-10, 10, length.out = 1000)
curve_data <- data.frame(x = x_vals, y = fun(x_vals))

# 애니메이션 생성
fig <- plot_ly() %>%
  # 함수 추가
  add_lines(data = curve_data, x = ~x, y = ~y, name = "Function Curve", line = list(color = 'blue')) %>%
  
  # 점 추가 (애니메이션)
  add_markers(data = results, x = ~x, y = ~y, frame = ~step, name = "Newton-Raphson",
              marker = list(size = 10, color = 'red')) %>%
  
  # 레이아웃 설정
  layout(title = "Newton-Raphson Method",
         xaxis = list(title = "x"),
         yaxis = list(title = "f(x)"))

fig

초기값을 조정해가면서 근을 수치해석적으로 구할 수 있습니다.

library(pracma)
library(matlib)
A <- matrix(c(0,0,7,
              4,2,5,
              1,0,2),byrow=T,ncol=3)

> D1 <- diag(eigen(A)$values[1],3,3)
> gaussianElimination(A-D1,c(0,0,0))
     [,1] [,2]      [,3] [,4]
[1,]    1    0 -1.828427    0
[2,]    0    1 -6.734591    0
[3,]    0    0  0.000000    0
> 
> D2 <- diag(eigen(A)$values[2],3,3)
> gaussianElimination(A-D2,c(0,0,0))
     [,1] [,2] [,3] [,4]
[1,]    1    0    0    0
[2,]    0    0    1    0
[3,]    0    0    0    0
> 
> D3 <- diag(eigen(A)$values[3],3,3)
> gaussianElimination(A-D3,c(0,0,0))
     [,1] [,2]      [,3] [,4]
[1,]    1    0  3.828427    0
[2,]    0    1 -2.693981    0
[3,]    0    0  0.000000    0

행렬 A의 고유값에 대응하는 고유벡터는 위와 같이 구할 수 있고

A^5의 고유값에 대응하는 고유벡터는 A의 고유값에 대응하는 고유벡터와 동일합니다.

> D1 <- diag(eigen(B)$values[1],3,3)
> gaussianElimination(B-D1,c(0,0,0))
     [,1] [,2]      [,3] [,4]
[1,]    1    0 -1.828427    0
[2,]    0    1 -6.734591    0
[3,]    0    0  0.000000    0
> 
> D2 <- diag(eigen(B)$values[2],3,3)
> gaussianElimination(B-D2,c(0,0,0))
     [,1] [,2] [,3] [,4]
[1,]    1    0    0    0
[2,]    0    0    1    0
[3,]    0    0    0    0
> 
> D3 <- diag(eigen(B)$values[3],3,3)
> gaussianElimination(B-D3,c(0,0,0))
     [,1] [,2]      [,3] [,4]
[1,]    1    0  3.828427    0
[2,]    0    1 -2.693981    0
[3,]    0    0  0.000000    0

#A^5의 고유값 = (A의 고유값)^5
> (eigen(A)$values)^5 ; eigen(B)$values
[1] 822.43564  32.00000 -20.43564
[1] 822.43564  32.00000 -20.43564