我生成了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
答案 0 :(得分:-2)
您为每个node
在V
中创建一列。您可以使用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"