以下问题:
如果我已经生成了m=1000
个均匀分布在球面上的随机向量x_0
和随机矩阵GOE的特征向量:
#make this example reproducible
set.seed(101)
n <- 500
#Sample GOE random matrix
A <- matrix(rnorm(n*n, mean=0, sd=1), n, n)
G <- (A + t(A))/sqrt(2*n)
ev <- eigen(G)
l <- ev$values
v <- ev$vectors
#sample 1000 x_0
#size of multivariate distribution
mean <- rep(0, n)
var <- diag(n)
#simulate bivariate normal distribution
initial <- MASS::mvrnorm(n=1000, mu=mean, Sigma=var) #ten random vectors
#normalized the first possible initial value, the initial data uniformly distributed on the sphere
xmats <- lapply(1:1000, function(i) initial[i, ]/norm(initial[i, ], type="2"))
定义函数h_1(t)
:
该函数的代码如下
# function
h1t <- function(t,x_0) {
h10 <- c(x_0 %*% v[, n])
denom <- vapply(t, function(.t) {
sum((x_0 %*% v)^2 * exp(-4*(l - l[n]) * .t))
}, numeric(1L))
abs(h10) / sqrt(denom)
}
我想找到t_epsilon
,这样h(t_epsilon)=epsilon
就等于epsilon=0.01
。
编辑:
邈回答:
find_t <- function(x, epsilon = 0.01, range = c(-50, 50)) {
uniroot(function(t) h1t(t, x) - epsilon, range,
tol = .Machine$double.eps)$root
}
res <- lapply(xmats, find_t)
但是,它表明错误
Error in uniroot(function(t) h1t(t, x) - epsilon, range, tol = .Machine$double.eps) :
f() values at end points not of opposite sign
1条答案
按热度按时间piwo6bdm1#
uniroot
会找到函数等于0的位置,因此需要一个 Package 函数来从函数的输出中减去epsilon:我们 * 可以 * 在不同的矩阵上一次使用这个函数,以找到输出等于epsilon时的t值:
或者,更好的方法是,将所有矩阵放入
list
中,然后通过对lapply
的简单调用对所有矩阵运行该函数:我们可以看到,这些t值通过
Map
将结果反馈回函数,使hit_modefied
函数输出epsilon
: