使用 R 查找最小值(1 个变量 X,n 乘以固定参数 U)
Find minimums with R (1 Variable X, n times a fixed parameter U)
我正在尝试最小化函数 f(X,U) = (X*log(X)-1/(1-U))^2
其中 U=(U_1,...,U_n) ~ U(0,1),这意味着我有 n 个固定 U 的数量并且想要找到以下的最小值:
(x_1*ln(x_1)-1/(1-u_1))^2
(x_2*ln(x_2)-1/(1-u_2))^2
......
(x_n*ln(x_n)-1/(1-u_n))^2
为此,我想使用 optim 函数。
我定义了:
n <- 10^3
U <- sort(runif(n,min=0,max=1))
X <- c()
Xsolution<- c()
f <- function(X,U){
return(-(X*log(X)-(1/(1-U)))^2)
} #-, because min(f) = max(-f)
现在我不知道如何使用 optim() 来做到这一点?对于以下代码,我总是会收到以下错误:
for(i in 1:n){
Xsolution[i] <- optim(f(X,U[i])
}
log(X) 错误:数学函数的非数字参数
旁注:我欢迎没有 for 循环的方法,因为对于大 n,它会花费太长时间。也许你可以帮助我让它与 sapply 一起工作?或者其他方法?
或者,我认为我可以使用 optimize(...,maximize=FALSE,..):
f <- function (X, a) ((X*log(X)-(1/(1-a)))^2)
for (i in 1:n){
xmin[i] <- optimize(f, c(0, 10000), tol = 0.0001, a = U[i])
}
这也不能正常工作...
此外,问题可能是需要太长时间。我想用 n=10^6 来做。但是我很确定必须有一种没有for循环的方法吗?我认为 for-loop 是导致这需要很长时间的问题。请帮助我,我已经解决这个问题很久了,这很令人沮丧。
由于 X * log(X) = 1 / (1 - U[i])
可以用数值求解任何 U[i]
,因此每个不同的 U[i]
都有一个解决方案,因此任何 (X*ln(X)-1/(1-U[i]))^2
都可以被驱动为零并且因此对于每个不同的 U[i] 都有一个解决方案。如果通常 U[i] 都是不同的,则意味着存在 length(U) 解。解决方案由下式给出(如果 U[i] 都不同,可以省略唯一性):
f <- function (X, a) ((X*log(X)-(1/(1-a)))^2)
unique(sapply(U, function(a) optimize(f, c(0, 1000000), a = a)$minimum))
我正在尝试最小化函数 f(X,U) = (X*log(X)-1/(1-U))^2 其中 U=(U_1,...,U_n) ~ U(0,1),这意味着我有 n 个固定 U 的数量并且想要找到以下的最小值:
(x_1*ln(x_1)-1/(1-u_1))^2
(x_2*ln(x_2)-1/(1-u_2))^2
......
(x_n*ln(x_n)-1/(1-u_n))^2
为此,我想使用 optim 函数。
我定义了:
n <- 10^3
U <- sort(runif(n,min=0,max=1))
X <- c()
Xsolution<- c()
f <- function(X,U){
return(-(X*log(X)-(1/(1-U)))^2)
} #-, because min(f) = max(-f)
现在我不知道如何使用 optim() 来做到这一点?对于以下代码,我总是会收到以下错误:
for(i in 1:n){
Xsolution[i] <- optim(f(X,U[i])
}
log(X) 错误:数学函数的非数字参数
旁注:我欢迎没有 for 循环的方法,因为对于大 n,它会花费太长时间。也许你可以帮助我让它与 sapply 一起工作?或者其他方法?
或者,我认为我可以使用 optimize(...,maximize=FALSE,..):
f <- function (X, a) ((X*log(X)-(1/(1-a)))^2)
for (i in 1:n){
xmin[i] <- optimize(f, c(0, 10000), tol = 0.0001, a = U[i])
}
这也不能正常工作...
此外,问题可能是需要太长时间。我想用 n=10^6 来做。但是我很确定必须有一种没有for循环的方法吗?我认为 for-loop 是导致这需要很长时间的问题。请帮助我,我已经解决这个问题很久了,这很令人沮丧。
由于 X * log(X) = 1 / (1 - U[i])
可以用数值求解任何 U[i]
,因此每个不同的 U[i]
都有一个解决方案,因此任何 (X*ln(X)-1/(1-U[i]))^2
都可以被驱动为零并且因此对于每个不同的 U[i] 都有一个解决方案。如果通常 U[i] 都是不同的,则意味着存在 length(U) 解。解决方案由下式给出(如果 U[i] 都不同,可以省略唯一性):
f <- function (X, a) ((X*log(X)-(1/(1-a)))^2)
unique(sapply(U, function(a) optimize(f, c(0, 1000000), a = a)$minimum))