Предупреждение, пока я вычисляю собственные значения

Мне нужно вычислить собственные значения и собственные векторы, но у меня всегда есть это предупреждение. Я надеюсь, что кто-нибудь может сказать мне, что происходит.

#masa en kg
m1=559.3e-3
m2=419.4e-3
m3=m2
m4=m2
m5=m2
m6=m2
m7=m2
m8=m2
#rigidez en N/m
k=56.7e3
#matrices de masa y rigidez
M=matrix(c(m1,0,0,0,0,0,0,0,0,m2,0,0,0,0,0,0,0,0,m3,0,0,0,0,0,0,0,0,m4,0,0,0,0,0,0,0,0,m5,0,0,0,0,0,0,0,0,m6,0,0,0,0,0,0,0,0,m7,0,0,0,0,0,0,0,0,m8), 8, 8, byrow=TRUE)
K=matrix(c(k,-k,0,0,0,0,0,0,-k,2*k,-k,0,0,0,0,0,0,-k,2*k,-k,0,0,0,0,0,0,-k,2*k,-k,0,0,0,0,0,0,-k,2*k,-k,0,0,0,0,0,0,-k,2*k,-k,0,0,0,0,0,0,-k,2*k,-k,0,0,0,0,0,0,-k,k), 8, 8, byrow=TRUE)
#calculo valores y vectores propios
a=eigen(K,M)

>Warning message:
In if (symmetric) { :
the condition has length > 1 and only the first element will be used

person Rafael Inostroza    schedule 18.08.2019    source источник
comment
Это означает, что он вычисляет только собственное значение первого элемента, который равен K в этой настройке, запускает eigen(K,M) и eigen(K) . Вы увидите, что это даст тот же результат.   -  person maydin    schedule 19.08.2019


Ответы (1)


Эта ошибка означает, что переменная symmetric (вероятно, внутренняя по отношению к функции eigen) оценивается как логический вектор, длина которого больше единицы. Когда это происходит в условии оператора if, используется только первый элемент.

Документация наводит меня на мысль, что вы хотите передавать каждую матрицу в функцию отдельно.

a <- eigen(K)
b <- eigen(M)

Используйте ?eigen для просмотра справки по этой функции, которая предполагает, что матрица должна быть только одним аргументом.

РЕДАКТИРОВАТЬ: Ниже вы можете найти код, определяющий функцию eigen(). В RStudio IDE вы можете навести указатель мыши на функцию и нажать F2, чтобы получить код функции. Исходя из этого, когда вы передаете M в качестве второго аргумента функции eigen(), она интерпретирует его как eigen(x = K, symmetric = M). Он ожидает, что symmetric будет TRUE, FALSE или отсутствует, но вместо этого получает матрицу. Когда он доходит до строки, где symmetric используется в качестве условия для оператора if, он выдает это предупреждение.

function (x, symmetric, only.values = FALSE, EISPACK = FALSE) 
{
  x <- unname(as.matrix(x))
  n <- nrow(x)
  if (!n) 
    stop("0 x 0 matrix")
  if (n != ncol(x)) 
    stop("non-square matrix in 'eigen'")
  n <- as.integer(n)
  if (is.na(n)) 
    stop("invalid nrow(x)")
  complex.x <- is.complex(x)
  if (!all(is.finite(x))) 
    stop("infinite or missing values in 'x'")
  if (missing(symmetric)) 
    symmetric <- isSymmetric.matrix(x)
  if (symmetric) {                    # Here is the line generating the error
    z <- if (!complex.x) 
      .Internal(La_rs(x, only.values))
    else .Internal(La_rs_cmplx(x, only.values))
    ord <- rev(seq_along(z$values))
  }
  else {
    z <- if (!complex.x) 
      .Internal(La_rg(x, only.values))
    else .Internal(La_rg_cmplx(x, only.values))
    ord <- sort.list(Mod(z$values), decreasing = TRUE)
  }
  if (only.values) 
    list(values = z$values[ord], vectors = NULL)
  else structure(class = "eigen", list(values = z$values[ord], 
    vectors = z$vectors[, ord, drop = FALSE]))
}
person AColeman    schedule 18.08.2019