使用nleqslv:function包含非有限值

时间:2016-06-15 13:03:28

标签: r

我想得到一个非线性公式的答案,我的代码是这样的;

library(nleqslv)
fs1<-function(x){
  y<-numeric(length(x))
  q<-x[1]
  f<-x[2]
  tau=0.2;epsilon=9;t=1.2;gamma=0.3;w=0.5;eta=0.95;lambda=1.2
  k1=q^(-epsilon)/(f*(q^(1-epsilon))+(1-f)*t^(1-epsilon))
  k2=t*(t*q)^(-epsilon)/(f*(t*q)^(1-epsilon)+1-f)
  k3=q*f*(1-tau)+lambda*tau*f*(q*f+1-f)/(lambda*f+1-f)
  k4=(1-f)*(1-tau)+tau*(1-f)*(q*f+1-f)/(lambda*f+1-f)
  kv1=(q^(1-gamma))*((f/(1-f))^(-gamma+w*(1-eta)))
  kv2=((f*((t*q)^(1-epsilon))+1-f)/(f*(q^(1-epsilon))+(1-f)*(t^(1-epsilon))))^((w+1-gamma)/(1-epsilon))
  kv3=((q*gamma*(1-tau)*(lambda*f+1-f)+lambda*tau*(q*f+1-f))/(gamma*(1-tau)*(lambda*f+1-f)+tau*(q*f+1-f)))^w
  y[1]=k1*k3+k2*k4-1
  y[2]=kv1*kv2*kv3-1
  y
}
startx<-c(0.6,1.1)
result<-nleqslv(startx,fs1,control = list(allowSingular=T))

但错误如下:

Error in nleqslv(startx, fs1, control = list(allowSingular = T)) : 
  initial value of fn function contains non-finite values (starting at index=2)
  Check initial x and/or correctness of function

下一步该怎么做?谢谢你的回答!

1 个答案:

答案 0 :(得分:2)

您可以通过查看函数的起始值来解决问题。 在您的函数中,您有一个表达式(f/(1-f))^gammaf来自x[2];一开始就是1.1。将其插入上面给出的表达式会产生NaN。

所以你的起始值是不正确的。 您需要x[2]的起始值介于0和1之间。

所以这样做:

startx <- c(.5,.5)
result<-nleqslv(startx,fs1,control = list(allowSingular=TRUE))
result

有了这个结果

$x
[1] 1.0148741 0.5609061

$fvec
[1] -1.323552e-10 -6.190382e-12

$termcd
[1] 1

$message
[1] "Function criterion near zero"

$scalex
[1] 1 1

$nfcnt
[1] 18

$njcnt
[1] 1

$iter
[1] 13

最后对你的代码做了一些评论:

请使用TRUE代替T以避免混淆。 请在功能代码中的分配中使用<-。 并使用更多空间。您的功能代码无法读取。