Верны ли собственные векторы, возвращаемые функцией R eigen ()? - PullRequest
0 голосов
/ 22 сентября 2018
#eigen values and vectors
a <- matrix(c(2, -1, -1, 2), 2)

eigen(a)

Я пытаюсь найти собственные значения и собственные векторы в R. Функция eigen работает для собственных значений, но есть ошибки в значениях собственных векторов.Есть ли способ исправить это?

code for eigen value and vectors

1 Ответ

0 голосов
/ 22 сентября 2018

Некоторые бумажные работы говорят вам

  • собственный вектор для собственного значения 3 равен (-s, s) для любого ненулевого действительного значения s;
  • собственный вектор для собственного значения 1 равен (t, t) для любого ненулевого действительного значения t.

Масштабирование собственных векторов до единичной длины дает

s = ± sqrt(0.5) = ±0.7071068
t = ± sqrt(0.5) = ±0.7071068

Масштабирование хорошо, потому что если матрица действительно симметрична,Матрица собственных векторов ортонормирована, так что ее обратная является транспонированной.Возьмем вашу реальную симметричную матрицу a, например:

a <- matrix(c(2, -1, -1, 2), 2)
#     [,1] [,2]
#[1,]    2   -1
#[2,]   -1    2

E <- eigen(a)

d <- E[[1]]
#[1] 3 1

u <- E[[2]]
#           [,1]       [,2]
#[1,] -0.7071068 -0.7071068
#[2,]  0.7071068 -0.7071068

u %*% diag(d) %*% solve(u)  ## don't do this stupid computation in practice
#     [,1] [,2]
#[1,]    2   -1
#[2,]   -1    2

u %*% diag(d) %*% t(u)      ## don't do this stupid computation in practice
#     [,1] [,2]
#[1,]    2   -1
#[2,]   -1    2

crossprod(u)
#     [,1] [,2]
#[1,]    1    0
#[2,]    0    1

tcrossprod(u)
#     [,1] [,2]
#[1,]    1    0
#[2,]    0    1

Как найти собственные векторы, используя метод из учебника

Метод из учебника заключается в решении однородныхсистема: (A - λI)x = 0 для основы Null Space.Функция NullSpace в my this answer была бы полезна.

## your matrix
a <- matrix(c(2, -1, -1, 2), 2)

## knowing that eigenvalues are 3 and 1

## eigenvector for eigenvalue 3
NullSpace(a - diag(3, nrow(a)))
#     [,1]
#[1,]   -1
#[2,]    1

## eigenvector for eigenvalue 1
NullSpace(a - diag(1, nrow(a)))
#     [,1]
#[1,]    1
#[2,]    1

Как видите, они не "нормализованы".В отличие от этого, pracma::nullspace дает «нормализованные» собственные векторы, так что вы получите что-то, согласующееся с выводом eigen (с точностью до возможного переворота знака):

library(pracma)

nullspace(a - diag(3, nrow(a)))
#           [,1]
#[1,] -0.7071068
#[2,]  0.7071068

nullspace(a - diag(1, nrow(a)))
#          [,1]
#[1,] 0.7071068
#[2,] 0.7071068
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...