多维函数的最小值
Minimum of a multidimensional function
我有一个函数 R^5 -> R,我对其最小值感兴趣。 R 中有很多函数,例如 R 包 pracma 中的 optim、optimize 或 fminbnd。但是他们只接受一个论点,我看不懂帮助页面。
mindisturbed <- function(a,d1,d2,d3,p){
sum((data^(- a) * (d1 + d2*cos(log(data)*2*pi/p) + d3 *
sin(log(data)*2*pi/p)) - log(j))^2)
}
“数据”和“j”变量在我的全局设置中。这些是长度为 k 的向量。函数的参数都是长度为1的数字。函数是一个残差平方和。
那么有人知道如何根据它的所有参数最小化这个函数吗?
假设 data 和 j 是长度相同的向量,请尝试以下操作。您可能需要也可能不需要更好的起始值。
1) 像这样使用 optim
st <- c(a = 1, d1 = 1, d2 = 1, d3 = 1, p = 1)
f <- function(x) mindisturbed(x[1], x[2], x[3], x[4], x[5])
optim(st, f)
2) 或使用默认算法的 nls,其中 st 来自 (1)
fo <- log(j) ~ data^(- a) * (d1 + d2*cos(log(data)*2*pi/p) + d3 *
sin(log(data)*2*pi/p))
nls(fo, start = st)
3) 或 nls 与 plinear 算法。在这种情况下,公式的 RHS 是一个列名为 d1、d2 和 d3 的矩阵,第一列乘以 d1,第二列乘以 d2,第三列乘以 d3。 start中只指定了非线性参数,即a和p。
fo2 <- log(j) ~ data^(-a) * cbind(d1 = 1,
d2 = cos(log(data)*2*pi/p),
d3 = sin(log(data)*2*pi/p))
nls(fo2, start = c(a = 0.1, p = 0.1), algorithm = "plinear")
备注
题目中没有data和j但是我们可以用这些来试一下。
set.seed(123)
n <- 100
data <- runif(n, 1, 2)
j <- 1:n
o <- order(data)
j <- j[o]
data <- data[o]
我有一个函数 R^5 -> R,我对其最小值感兴趣。 R 中有很多函数,例如 R 包 pracma 中的 optim、optimize 或 fminbnd。但是他们只接受一个论点,我看不懂帮助页面。
mindisturbed <- function(a,d1,d2,d3,p){
sum((data^(- a) * (d1 + d2*cos(log(data)*2*pi/p) + d3 *
sin(log(data)*2*pi/p)) - log(j))^2)
}
“数据”和“j”变量在我的全局设置中。这些是长度为 k 的向量。函数的参数都是长度为1的数字。函数是一个残差平方和。
那么有人知道如何根据它的所有参数最小化这个函数吗?
假设 data 和 j 是长度相同的向量,请尝试以下操作。您可能需要也可能不需要更好的起始值。
1) 像这样使用 optim
st <- c(a = 1, d1 = 1, d2 = 1, d3 = 1, p = 1)
f <- function(x) mindisturbed(x[1], x[2], x[3], x[4], x[5])
optim(st, f)
2) 或使用默认算法的 nls,其中 st 来自 (1)
fo <- log(j) ~ data^(- a) * (d1 + d2*cos(log(data)*2*pi/p) + d3 *
sin(log(data)*2*pi/p))
nls(fo, start = st)
3) 或 nls 与 plinear 算法。在这种情况下,公式的 RHS 是一个列名为 d1、d2 和 d3 的矩阵,第一列乘以 d1,第二列乘以 d2,第三列乘以 d3。 start中只指定了非线性参数,即a和p。
fo2 <- log(j) ~ data^(-a) * cbind(d1 = 1,
d2 = cos(log(data)*2*pi/p),
d3 = sin(log(data)*2*pi/p))
nls(fo2, start = c(a = 0.1, p = 0.1), algorithm = "plinear")
备注
题目中没有data和j但是我们可以用这些来试一下。
set.seed(123)
n <- 100
data <- runif(n, 1, 2)
j <- 1:n
o <- order(data)
j <- j[o]
data <- data[o]