多维函数的最小值

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]