当我尝试使用nlminb优化具有三个参数的函数时,它显示了此错误消息
"Error in objective(.par, ...) : argument "x" is missing, with no default".
有人可以告诉我如何解决吗?
我的代码如下:
coeff<-10**(-4)
z<-100
X1<- function(x,yh,yt){(15/2*x)+(-5/4*coeff*yh*x)+(25/16*z)-(25/16*coeff*x*x)-(-5/4*coeff*yh*yh)+(12*yh)}
X2<- function(x,yh,yt){(15/2*x)+(-5/4*coeff*yh*x)+(25/16*z)-(25/16*coeff*x*x)-(-5/4*coeff*yh*yh)-(12*yh)}
X3<- function(x,yh,yt){(15/2*x)+(-5/4*coeff*yt*x)+(25/16*z)-(25/16*coeff*x*x)-(-5/4*coeff*yt*yt)+(3*yt)}
X4<- function(x,yh,yt){(15/2*x)+(-5/4*coeff*yt*x)+(25/16*z)-(25/16*coeff*x*x)-(-5/4*coeff*yt*yt)-(3*yt)}
f<-function(X1,X2,X3,X4){-(4/9*log(X1)+2/9*log(X2)+2/9*log(X3)+1/9*log(X4))}
nlminb(c(6.944444,5.787037,11.574074),f)
答案 0 :(得分:0)
请注意,nlminb需要优化功能,以单个向量作为起点,而不是多个条目。
一种可能的解决方法是对函数f进行包装。同样,您似乎希望f取3个值。 f已经可以访问X1到X4。
> coeff<-10**(-4)
> z<-100
>
> X1<- function(x,yh,yt){(15/2*x)+(-5/4*coeff*yh*x)+(25/16*z)-(25/16*coeff*x*x)-(-5/4*coeff*yh*yh)+(12*yh)}
> X2<- function(x,yh,yt){(15/2*x)+(-5/4*coeff*yh*x)+(25/16*z)-(25/16*coeff*x*x)-(-5/4*coeff*yh*yh)-(12*yh)}
> X3<- function(x,yh,yt){(15/2*x)+(-5/4*coeff*yt*x)+(25/16*z)-(25/16*coeff*x*x)-(-5/4*coeff*yt*yt)+(3*yt)}
> X4<- function(x,yh,yt){(15/2*x)+(-5/4*coeff*yt*x)+(25/16*z)-(25/16*coeff*x*x)-(-5/4*coeff*yt*yt)-(3*yt)}
> f<-function(x, yh, yt){-(4/9*log(X1(x,yh, yt))+2/9*log(X2(x,yh, yt))+2/9*log(X3(x,yh, yt))+1/9*log(X4(x,yh, yt)))}
> g <- function(p){
+ f(p[1], p[2], p[3])
+ }
> nlminb(c(6.944444,5.787037,11.574074),g)
产生
$par
[1] 23867.17644 48.34801 566.85042
$objective
[1] -11.40553
$convergence
[1] 0
$iterations
[1] 22
$evaluations
function gradient
25 113
$message
[1] "relative convergence (4)"