2013-04-21 4 views
2

Я хочу написать функцию типа eigen() для вычисления собственных значений и собственных векторов произвольной матрицы. Я написал следующие коды для вычисления собственных значений, и мне нужна функция или метод для решения приведенного линейного уравнения.Функция для вычисления собственных значений матрицы в R

eig <- function(x){ 
     if(nrow(x)!=ncol(x)) stop("dimension error") 
      ff <- function(lambda){ 
       for(i in 1:nrow(x)) x[i,i] <- x[i,i] - lambda 
       } 
det(x) 
} 

мне нужно решить det(x)=0, что является полиномиальное линейное уравнение, чтобы найти значения lambda. Там в любом случае?

+0

Try 'optim' функция. – vinux

+1

или 'uniroot', чтобы найти корень? – liuminzhao

+0

Но 'optim()' находит корни, которые минимизируют функцию. Я хочу ее решить, что-то вроде 'polyroot()'. – Mahmoud

ответ

3

Вот одно решение, используя uniroot.all:

library(rootSolve) 
myeig <- function(mat){ 
    myeig1 <- function(lambda) { 
    y = mat 
    diag(y) = diag(mat) - lambda 
    return(det(y)) 
    } 

    myeig2 <- function(lambda){ 
    sapply(lambda, myeig1) 
    } 
    uniroot.all(myeig2, c(-10, 10)) 
} 

R > x <- matrix(rnorm(9), 3) 
R > eigen(x)$values 
[1] -1.77461906 -1.21589769 -0.01010515 
R > myeig(x) 
[1] -1.77462211 -1.21589767 -0.01009019 
+0

у вас есть нужные инструменты, но можете ли вы написать одну функцию 'myeig', которая принимает только матрицу в качестве входных данных и возвращает собственные значения? – flodel

+0

Спасибо за ваш совет. Я завернул и обновил его в своем ответе. – liuminzhao

+0

Спасибо liuminzhao. Для определения собственных векторов я должен решить другую систему линейных уравнений для каждого собственного значения. Это коды, которые я написал, используя вашу помощь: 'for (i in 1: nrow (mat)) { solve (mat-values ​​[i] * diag (nrow (mat)), rep (0, nrow (mat)))} ' Но это возвращает только нулевой вектор, который не является eigrnvector. Как я могу найти этот ответ? – Mahmoud

Смежные вопросы