是否存在R函数来查找复数并对其进行计数?

时间:2019-05-20 13:30:54

标签: r matrix counter complex-numbers eigenvalue

我生成了1000个2x2矩阵,其元素是介于-10和10之间的随机数。

我提供了到目前为止的密码。

但是我不确定这是否是找到我的特征值列表是否复杂的正确代码。然后,对于每个矩阵,我必须确定系统是否为稳定节点(特征值均为实值和负值);不稳定的节点(特征值都是实数和正数);一个鞍(特征值都是真实的,一个是正的,另一个是负的);稳定的焦点(复杂的特征值,负实部);不稳定的焦点(具有正实部的复杂特征值);或中心(虚构特征值,实部为零)。

我也设置了计数器,但不确定如何合并它们。当我输入代码时,什么都没有显示。

M=lapply(1:1000, function(z) matrix(runif(1000,min=-10,max=10), ncol = 2, nrow = 2))

eig=lapply(M, eigen)

V=sapply(eig, `[[`, "values")

SFcounter=0

if (is.complex(V)==T)
Re(V)>0

SFcounter=SFcounter+1

1 个答案:

答案 0 :(得分:-2)

您为每个nodeV中创建一列。您可以使用Im函数提取任何复数的虚部(无论其等于零还是其他)。您可以使用Re提取实数部分。此外,如果您有兴趣对实数进行分类,则所有满足Im(V) == 0 [虚部等于零]的对象。

如果使用apply,则可以评估V中的每个特征值对,它们在每一列中分组在一起。根据您不同的分类标准,您可以使用if语句来识别这些点:

node.classification <- function(x) {
  if ( (Im(x) == 0) && (Re(x) < 0) ) { #both eigenvalues are real and negative
    return("stable")
  } else {
    if ( (Im(x) == 0) && (Re(x) > 0) ) { #both eigenvalues are real and positive
      return("unstable")
    } else {
      if ( (Im(x) == 0) && sum((Re(x) > 0) == 1) ){ #both real one pos./one neg.
        return("saddle")
      } else {
        if ( (Im(x) != 0) && (Re(x) < 0) ) { #each complex, real part negative
          return("stable focus")
        } else {
          if ( (Im(x) != 0) && (Re(x) > 0) ) { #each complex, real part positive
            return("unstable focus")
          } else {
            return(NA)
          }
        }
      }
    }
  }
}

head(apply(V, 2, node.classification))
[1] "unstable"       "stable focus"   "stable"        
[4] "unstable"       "unstable"       "unstable focus"