5

根据我的理解,优化函数仅设计用于处理一个函数参数。但有时一个函数可能取决于变量和参数的不同输入范围。

例如:

x.r<-rnorm(100)
y<-function(x,p) -x^2+p*1/exp(x^3)
optimize(y,upper=range(x.r)[2],lower=range(x.r)[1])

xr 传递给 y 的 x 的域可以随样本变化。我不想使用通用的 x,而是希望能够从许多 xr 值域中提取来运行 y。有没有办法修改优化函数,以便我可以同时传递 y、函数和 x 它的域变量以及优化参数 p?

有了上面我得到一个错误:

> optimize(y,upper=range(x.r)[2],lower=range(x.r)[1])
Error in p * 1 : 'p' is missing

编辑:根据下面的建议(这是有道理的......但是)我试过了。

x.r<-rnorm(100)
p<-seq(-5,5,1)
y<-function(x,p) -x^2+p*1/exp(x^3)
optimize(y,upper=range(x.r)[2],lower=range(x.r)[1],p)

结果是: p * 1 中的错误:缺少“p”

还,

> optimize(y,upper=range(x.r)[2],lower=range(x.r)[1],p,x.r)
Error in optimize(y, upper = range(x.r)[2], lower = range(x.r)[1], p,  : 
  invalid function value in 'optimize'

还有其他想法吗?

编辑 2:循环下方的每个评论都可以,但似乎是一种奇怪的方法。我不确定它是否也唯一考虑了 xr 域。

x.r<-rnorm(100)
p<-seq(-5,5,1)
y<-function(p=p,x=x.r) -x^2+p*1/exp(x^3)
for(v in p){
print(optimize(y,upper=range(p)[2],lower=range(p)[1],p=v))}

> for(v in p){
+ print(optimize(y,upper=range(p)[2],lower=range(p)[1],p=v))}
$minimum
[1] -4.999944

$objective
[1] -9.637547e+54

$minimum
[1] -4.999944

$objective
...
4

2 回答 2

3

我打电话optimise给p

x.r <- rnorm(100)
p   <- seq(-5,5,1)
y<-function(x,p) -x^2+ p/exp(x^3)
ll <- lapply(p,function(i)
         optimize(y,upper=range(x.r)[2],lower=range(x.r)[1],p=i))

ll[[which.min(sapply(ll,'[[','minimum'))]]

$minimum
[1] -2.14628

$objective
[1] -98357.67

当然如果maximum = TRUE最后变成

ll[[which.max(sapply(ll,'[[','maximum'))]]
于 2013-02-16T22:57:04.873 回答
1

即使您调用的东西不允许您指定传递给函数的额外命名参数,另一种解决方法是创建一个函数生成函数,该函数生成具有给定 p 的函数。

yp <- function(p){force(p);function(x){-x^2+p*1/exp(x^3)}}
yp1=yp(1)
yp2=yp(2)

现在yp函数只是 x 的函数:

> yp1(0)
[1] 1
> yp2(0)
[1] 2

所以你的循环变成:

x.r <- rnorm(100)
pv   <- seq(-5,5,1)

ll <- lapply(pv,function(p){
        Y = yp(p)
        optimize(Y,upper=range(x.r)[2],lower=range(x.r)[1])
        })

它循环遍历pv向量并将每个值放入p以创建Y基于该值的函数。没有其他东西(除了upperand lower)被传递到optimize.

于 2013-02-17T08:56:04.317 回答